/ Hex Artifact Content
Login

Artifact 2488a2b6456709ad6398df2302d427a980e2695a:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ce0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0cf0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0d00: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0d10: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0d20: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0d40: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0d50: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0d60: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0d70: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0d80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0d90: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0da0: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0db0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0dc0: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0de0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0df0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0e00: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0e10: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0e20: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0e30: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0e40: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0e50: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0e70: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0e80: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0e90: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0ea0: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0eb0: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0ec0: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0ed0: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0ee0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0ef0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0f00: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0f10: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0f20: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0f30: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0f40: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0f50: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0f60: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0f70: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0f80: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0f90: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0fa0: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0fb0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0fc0: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0fd0: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0fe0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0ff0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
1000: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1010: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
1020: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
1030: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
1040: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
1050: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
1060: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
1070: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
1080: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
1090: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
10a0: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
10b0: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
10c0: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
10d0: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
10e0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
10f0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
1100: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
1110: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
1120: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
1130: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1140: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1150: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1160: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1170: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1180: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1190: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
11a0: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
11b0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
11c0: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
11d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
11e0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
11f0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
1200: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
1210: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
1220: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
1230: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1240: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1250: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1260: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1270: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1280: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1290: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
12a0: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
12b0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
12c0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
12d0: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
12e0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
12f0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
1300: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a  HNAME 512../*.**
1310: 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74   Maximum support
1320: 65 64 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  ed symbolic link
1330: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c  s.*/.#define SQL
1340: 49 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53  ITE_MAX_SYMLINKS
1350: 20 31 30 30 0a 0a 2f 2a 20 41 6c 77 61 79 73 20   100../* Always 
1360: 63 61 73 74 20 74 68 65 20 67 65 74 70 69 64 28  cast the getpid(
1370: 29 20 72 65 74 75 72 6e 20 74 79 70 65 20 66 6f  ) return type fo
1380: 72 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  r compatibility 
1390: 77 69 74 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d  with.** kernel m
13a0: 6f 64 75 6c 65 73 20 69 6e 20 56 78 57 6f 72 6b  odules in VxWork
13b0: 73 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 73  s. */.#define os
13c0: 47 65 74 70 69 64 28 58 29 20 28 70 69 64 5f 74  Getpid(X) (pid_t
13d0: 29 67 65 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a  )getpid()../*.**
13e0: 20 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61   Only set the la
13f0: 73 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65  stErrno if the e
1400: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72  rror code is a r
1410: 65 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f  eal error and no
1420: 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65  t .** a normal e
1430: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63  xpected return c
1440: 6f 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55  ode of SQLITE_BU
1450: 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a  SY or SQLITE_OK.
1460: 2a 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f  */.#define IS_LO
1470: 43 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78  CK_ERROR(x)  ((x
1480: 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26   != SQLITE_OK) &
1490: 26 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42  & (x != SQLITE_B
14a0: 55 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72  USY))../* Forwar
14b0: 64 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a  d references */.
14c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
14d0: 6e 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20  nixShm unixShm; 
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14f0: 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72   Connection shar
1500: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70  ed memory */.typ
1510: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1520: 53 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e  ShmNode unixShmN
1530: 6f 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68  ode;       /* Sh
1540: 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74  ared memory inst
1550: 61 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20  ance */.typedef 
1560: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
1570: 49 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e  Info unixInodeIn
1580: 66 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f  fo;   /* An i-no
1590: 64 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  de */.typedef st
15a0: 72 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46  ruct UnixUnusedF
15b0: 64 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20  d UnixUnusedFd; 
15c0: 20 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64      /* An unused
15d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74   */../*.** Somet
15f0: 69 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69  imes, after a fi
1600: 6c 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f  le handle is clo
1610: 73 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74  sed by SQLite, t
1620: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1630: 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  or.** cannot be 
1640: 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65  closed immediate
1650: 6c 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  ly. In these cas
1660: 65 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  es, instances of
1670: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
1680: 2a 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20  * structure are 
1690: 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  used to store th
16a0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16b0: 72 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20  r while waiting 
16c0: 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74  for an.** opport
16d0: 75 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20  unity to either 
16e0: 63 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69  close or reuse i
16f0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69  t..*/.struct Uni
1700: 78 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e  xUnusedFd {.  in
1710: 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
1720: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1730: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c  descriptor to cl
1740: 6f 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ose */.  int fla
1750: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1760: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73     /* Flags this
1770: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1780: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
1790: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
17a0: 46 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  Fd *pNext;      
17b0: 2f 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66  /* Next unused f
17c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
17d0: 6e 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d  n same file */.}
17e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69  ;../*.** The uni
17f0: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
1800: 69 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73  is subclass of s
1810: 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63  qlite3_file spec
1820: 69 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78  ific to the unix
1830: 0a 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e  .** VFS implemen
1840: 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65  tations..*/.type
1850: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46  def struct unixF
1860: 69 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74  ile unixFile;.st
1870: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a  ruct unixFile {.
1880: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74    sqlite3_io_met
1890: 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74  hods const *pMet
18a0: 68 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  hod;  /* Always 
18b0: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
18c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
18d0: 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20   *pVfs;         
18e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
18f0: 56 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64  VFS that created
1900: 20 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a   this unixFile *
1910: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
1920: 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
1930: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20          /* Info 
1940: 61 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74  about locks on t
1950: 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69  his inode */.  i
1960: 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20  nt h;           
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
1990: 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75  escriptor */.  u
19a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69  nsigned char eFi
19b0: 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  leLock;         
19c0: 20 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f     /* The type o
19d0: 66 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  f lock held on t
19e0: 68 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69  his fd */.  unsi
19f0: 67 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63  gned short int c
1a00: 74 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20  trlFlags;       
1a10: 2f 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69  /* Behavioral bi
1a20: 74 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20  ts.  UNIXFILE_* 
1a30: 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c  flags */.  int l
1a40: 61 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20  astErrno;       
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a60: 2a 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f  * The unix errno
1a70: 20 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65   from last I/O e
1a80: 72 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  rror */.  void *
1a90: 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ab0: 20 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73   Locking style s
1ac0: 70 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f  pecific state */
1ad0: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1ae0: 2a 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20  *pUnused;       
1af0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c         /* Pre-al
1b00: 6c 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73  located UnixUnus
1b10: 65 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  edFd */.  const 
1b20: 63 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20  char *zPath;    
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b40: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
1b50: 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  e */.  unixShm *
1b60: 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
1b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
1b80: 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d  ared memory segm
1b90: 65 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ent information 
1ba0: 2a 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b  */.  int szChunk
1bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
1bd0: 69 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f  igured by FCNTL_
1be0: 43 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69  CHUNK_SIZE */.#i
1bf0: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1c00: 50 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e  P_SIZE>0.  int n
1c10: 46 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20  FetchOut;       
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73  * Number of outs
1c40: 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72  tanding xFetch r
1c50: 65 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  efs */.  sqlite3
1c60: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b  _int64 mmapSize;
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c80: 55 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d  Usable size of m
1c90: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
1ca0: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
1cb0: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1cc0: 41 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f 2a  Actual;       /*
1cd0: 20 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   Actual size of 
1ce0: 6d 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52  mapping at pMapR
1cf0: 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74  egion */.  sqlit
1d00: 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a  e3_int64 mmapSiz
1d10: 65 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f  eMax;          /
1d20: 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e  * Configured FCN
1d30: 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c  TL_MMAP_SIZE val
1d40: 75 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d  ue */.  void *pM
1d50: 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
1d70: 65 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67  emory mapped reg
1d80: 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ion */.#endif.#i
1d90: 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
1da0: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
1db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc0: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
1dd0: 73 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20  sector size */. 
1de0: 20 69 6e 74 20 64 65 76 69 63 65 43 68 61 72 61   int deviceChara
1df0: 63 74 65 72 69 73 74 69 63 73 3b 20 20 20 20 20  cteristics;     
1e00: 20 20 20 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75       /* Precompu
1e10: 74 65 64 20 64 65 76 69 63 65 20 63 68 61 72 61  ted device chara
1e20: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 23 65  cteristics */.#e
1e30: 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
1e40: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1e50: 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46  TYLE.  int openF
1e60: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
1e70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1e80: 65 20 66 6c 61 67 73 20 73 70 65 63 69 66 69 65  e flags specifie
1e90: 64 20 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23  d at open() */.#
1ea0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1eb0: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1ec0: 53 54 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64  STYLE || defined
1ed0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e  (__APPLE__).  un
1ee0: 73 69 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20  signed fsFlags; 
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61    /* cached deta
1f10: 69 6c 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28  ils from statfs(
1f20: 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  ) */.#endif.#if 
1f30: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
1f40: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
1f50: 64 20 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20  d *pId;         
1f60: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
1f70: 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66  ID */.#endif.#if
1f80: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1f90: 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67  .  /* The next g
1fa0: 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65  roup of variable
1fb0: 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 74 72  s are used to tr
1fc0: 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ack whether or n
1fd0: 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e  ot the.  ** tran
1fe0: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1ff0: 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f  in bytes 24-27 o
2000: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  f database files
2010: 20 61 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a   are updated.  *
2020: 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70  * whenever any p
2030: 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
2040: 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e  ase changes.  An
2050: 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74   assertion fault
2060: 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72   will.  ** occur
2070: 20 69 66 20 61 20 66 69 6c 65 20 69 73 20 75 70   if a file is up
2080: 64 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c  dated without al
2090: 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68 65 20  so updating the 
20a0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
20b0: 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
20c0: 74 65 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20  test is made to 
20d0: 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65  avoid new proble
20e0: 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68  ms similar to th
20f0: 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72  e.  ** one descr
2100: 69 62 65 64 20 62 79 20 74 69 63 6b 65 74 20 23  ibed by ticket #
2110: 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e  3584. .  */.  un
2120: 73 69 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e  signed char tran
2130: 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20  sCntrChng;   /* 
2140: 54 72 75 65 20 69 66 20 74 68 65 20 74 72 61 6e  True if the tran
2150: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
2160: 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73  changed */.  uns
2170: 69 67 6e 65 64 20 63 68 61 72 20 64 62 55 70 64  igned char dbUpd
2180: 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  ate;        /* T
2190: 72 75 65 20 69 66 20 61 6e 79 20 70 61 72 74 20  rue if any part 
21a0: 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  of database file
21b0: 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e   changed */.  un
21c0: 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f  signed char inNo
21d0: 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20  rmalWrite;   /* 
21e0: 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72  True if in a nor
21f0: 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74  mal write operat
2200: 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a  ion */..#endif..
2210: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2220: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
2230: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
2240: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
2250: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
2260: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
2270: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
2280: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
2290: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
22a0: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
22b0: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
22c0: 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  ];.#endif.};../*
22d0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68   This variable h
22e0: 6f 6c 64 73 20 74 68 65 20 70 72 6f 63 65 73 73  olds the process
22f0: 20 69 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77   id (pid) from w
2300: 68 65 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e  hen the xRandomn
2310: 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20  ess().** method 
2320: 77 61 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20  was called.  If 
2330: 78 4f 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65  xOpen() is calle
2340: 64 20 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65  d from a differe
2350: 6e 74 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a  nt process id,.*
2360: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  * indicating tha
2370: 74 20 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f  t a fork() has o
2380: 63 63 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e  ccurred, the PRN
2390: 47 20 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e  G will be reset.
23a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74  .*/.static pid_t
23b0: 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d   randomnessPid =
23c0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77   0;../*.** Allow
23d0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68  ed values for th
23e0: 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46  e unixFile.ctrlF
23f0: 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f  lags bitmask:.*/
2400: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2410: 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30 78  E_EXCL        0x
2420: 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  01     /* Connec
2430: 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70  tions from one p
2440: 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23  rocess only */.#
2450: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2460: 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32  RDONLY      0x02
2470: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2480: 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20  on is read only 
2490: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
24a0: 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20  ILE_PERSIST_WAL 
24b0: 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73  0x04     /* Pers
24c0: 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20  istent WAL mode 
24d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
24e0: 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e  E_DISABLE_DIRSYN
24f0: 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46  C.# define UNIXF
2500: 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30  ILE_DIRSYNC    0
2510: 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63  x08     /* Direc
2520: 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64  tory sync needed
2530: 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69   */.#else.# defi
2540: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53  ne UNIXFILE_DIRS
2550: 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64  YNC    0x00.#end
2560: 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  if.#define UNIXF
2570: 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20  ILE_PSOW        
2580: 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49  0x10     /* SQLI
2590: 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
25a0: 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a  FE_OVERWRITE */.
25b0: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
25c0: 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30 78 32  _DELETE      0x2
25d0: 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  0     /* Delete 
25e0: 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66  on close */.#def
25f0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49  ine UNIXFILE_URI
2600: 20 20 20 20 20 20 20 20 20 30 78 34 30 20 20 20           0x40   
2610: 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69    /* Filename mi
2620: 67 68 74 20 68 61 76 65 20 71 75 65 72 79 20 70  ght have query p
2630: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65  arameters */.#de
2640: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  fine UNIXFILE_NO
2650: 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20 20  LOCK      0x80  
2660: 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65     /* Do no file
2670: 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a   locking */../*.
2680: 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20  ** Include code 
2690: 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  that is common t
26a0: 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c  o all os_*.c fil
26b0: 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  es.*/.#include "
26c0: 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a  os_common.h"../*
26d0: 0a 2a 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f  .** Define vario
26e0: 75 73 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61  us macros that a
26f0: 72 65 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20  re missing from 
2700: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  some systems..*/
2710: 0a 23 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45  .#ifndef O_LARGE
2720: 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f  FILE.# define O_
2730: 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64  LARGEFILE 0.#end
2740: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2750: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75  _DISABLE_LFS.# u
2760: 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45  ndef O_LARGEFILE
2770: 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47  .# define O_LARG
2780: 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23  EFILE 0.#endif.#
2790: 69 66 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f  ifndef O_NOFOLLO
27a0: 57 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46  W.# define O_NOF
27b0: 4f 4c 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23  OLLOW 0.#endif.#
27c0: 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a  ifndef O_BINARY.
27d0: 23 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52  # define O_BINAR
27e0: 59 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  Y 0.#endif../*.*
27f0: 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20 6d  * The threadid m
2800: 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f  acro resolves to
2810: 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f   the thread-id o
2820: 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f  r to 0.  Used fo
2830: 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
2840: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
2850: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  .*/.#if SQLITE_T
2860: 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e  HREADSAFE.#defin
2870: 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72 65  e threadid pthre
2880: 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a  ad_self().#else.
2890: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
28a0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
28b0: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66   HAVE_MREMAP def
28c0: 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e  aults to true on
28d0: 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65   Linux and false
28e0: 20 65 76 65 72 79 77 68 65 72 65 20 65 6c 73 65   everywhere else
28f0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
2900: 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23  d(HAVE_MREMAP).#
2910: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   if defined(__li
2920: 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
2930: 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23  d(_GNU_SOURCE).#
2940: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52    define HAVE_MR
2950: 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20  EMAP 1.# else.# 
2960: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45   define HAVE_MRE
2970: 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65  MAP 0.# endif.#e
2980: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c  ndif../*.** Expl
2990: 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20  icitly call the 
29a0: 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f  64-bit version o
29b0: 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64  f lseek() on And
29c0: 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  roid. Otherwise,
29d0: 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74   lseek().** is t
29e0: 68 65 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f  he 32-bit versio
29f0: 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45  n, even if _FILE
2a00: 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20  _OFFSET_BITS=64 
2a10: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
2a20: 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f  ifdef __ANDROID_
2a30: 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b  _.# define lseek
2a40: 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a   lseek64.#endif.
2a50: 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74  ./*.** Different
2a60: 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65   Unix systems de
2a70: 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20  clare open() in 
2a80: 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20  different ways. 
2a90: 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65   Same use.** ope
2aa0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
2ab0: 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65  t,mode_t).  Othe
2ac0: 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73  rs use open(cons
2ad0: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29  t char*,int,...)
2ae0: 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  ..** The differe
2af0: 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  nce is important
2b00: 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f   when using a po
2b10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e  inter to the fun
2b20: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
2b30: 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64   safest way to d
2b40: 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f  eal with the pro
2b50: 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79  blem is to alway
2b60: 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70  s use this wrapp
2b70: 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61  er.** which alwa
2b80: 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ys has the same 
2b90: 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74  well-defined int
2ba0: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
2bb0: 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28  c int posixOpen(
2bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2bd0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e  e, int flags, in
2be0: 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72  t mode){.  retur
2bf0: 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c  n open(zFile, fl
2c00: 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f  ags, mode);.}../
2c10: 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65  * Forward refere
2c20: 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nce */.static in
2c30: 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  t openDirectory(
2c40: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
2c50: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75  *);.static int u
2c60: 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
2c70: 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e  oid);../*.** Man
2c80: 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61  y system calls a
2c90: 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f  re accessed thro
2ca0: 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66  ugh pointer-to-f
2cb0: 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74  unctions so that
2cc0: 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20  .** they may be 
2cd0: 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75  overridden at ru
2ce0: 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74  ntime to facilit
2cf0: 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74  ate fault inject
2d00: 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65  ion during.** te
2d10: 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f  sting and sandbo
2d20: 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  xing.  The follo
2d30: 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73  wing array holds
2d40: 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70   the names and p
2d50: 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c  ointers.** to al
2d60: 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  l overrideable s
2d70: 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a  ystem calls..*/.
2d80: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e  static struct un
2d90: 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63  ix_syscall {.  c
2da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2dc0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74  Name of the syst
2dd0: 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c  em call */.  sql
2de0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
2df0: 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75   pCurrent; /* Cu
2e00: 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74  rrent value of t
2e10: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  he system call *
2e20: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63  /.  sqlite3_sysc
2e30: 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74  all_ptr pDefault
2e40: 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c  ; /* Default val
2e50: 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c  ue */.} aSyscall
2e60: 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e  [] = {.  { "open
2e70: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
2e80: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
2e90: 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d  posixOpen,  0  }
2ea0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
2eb0: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
2ec0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69  onst char*,int,i
2ed0: 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e  nt))aSyscall[0].
2ee0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
2ef0: 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28  close",        (
2f00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
2f10: 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20  ptr)close,      
2f20: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
2f30: 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28  Close     ((int(
2f40: 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  *)(int))aSyscall
2f50: 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [1].pCurrent).. 
2f60: 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20   { "access",    
2f70: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
2f80: 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20  all_ptr)access, 
2f90: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
2fa0: 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28  e osAccess    ((
2fb0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
2fc0: 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c  r*,int))aSyscall
2fd0: 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [2].pCurrent).. 
2fe0: 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20   { "getcwd",    
2ff0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3000: 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20  all_ptr)getcwd, 
3010: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3020: 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28  e osGetcwd    ((
3030: 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73  char*(*)(char*,s
3040: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3050: 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  3].pCurrent)..  
3060: 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20  { "stat",       
3070: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3080: 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20  ll_ptr)stat,    
3090: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
30a0: 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69   osStat      ((i
30b0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
30c0: 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29  *,struct stat*))
30d0: 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72  aSyscall[4].pCur
30e0: 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rent)../*.** The
30f0: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
3100: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
3110: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
3120: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
3130: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
3140: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
3150: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
3160: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
3170: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
3180: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
3190: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
31a0: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
31b0: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
31c0: 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f  P.  But it is DO
31d0: 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75  S - what did you
31e0: 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64   expect?.*/.#ifd
31f0: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b  ef __DJGPP__.  {
3200: 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20   "fstat",       
3210: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
3220: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3230: 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29  e osFstat(a,b,c)
3240: 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20      0.#else     
3250: 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20  .  { "fstat",   
3260: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3270: 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c  scall_ptr)fstat,
3280: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66        0  },.#def
3290: 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20  ine osFstat     
32a0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72  ((int(*)(int,str
32b0: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
32c0: 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29  all[5].pCurrent)
32d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74  .#endif..  { "ft
32e0: 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71  runcate",    (sq
32f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3300: 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20  r)ftruncate,  0 
3310: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74   },.#define osFt
3320: 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29  runcate ((int(*)
3330: 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  (int,off_t))aSys
3340: 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74  call[6].pCurrent
3350: 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20  )..  { "fcntl", 
3360: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3370: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74  syscall_ptr)fcnt
3380: 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  l,      0  },.#d
3390: 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20  efine osFcntl   
33a0: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69    ((int(*)(int,i
33b0: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
33c0: 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [7].pCurrent).. 
33d0: 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20   { "read",      
33e0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
33f0: 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20  all_ptr)read,   
3400: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
3410: 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28  e osRead      ((
3420: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
3430: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3440: 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e  scall[8].pCurren
3450: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3460: 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51  USE_PREAD) || SQ
3470: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
3480: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70  ING_STYLE.  { "p
3490: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
34a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
34b0: 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30  tr)pread,      0
34c0: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
34d0: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
34e0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
34f0: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
3500: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
3510: 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20  fine osPread    
3520: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
3530: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
3540: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39  ff_t))aSyscall[9
3550: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
3560: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
3570: 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64  AD64).  { "pread
3580: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3590: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
35a0: 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c  read64,    0  },
35b0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
35c0: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
35d0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35e0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
35f0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
3600: 20 6f 73 50 72 65 61 64 36 34 20 28 28 73 73 69   osPread64 ((ssi
3610: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
3620: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74  *,size_t,off64_t
3630: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
3640: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77  Current)..  { "w
3650: 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73  rite",        (s
3660: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3670: 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30  tr)write,      0
3680: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57    },.#define osW
3690: 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65  rite     ((ssize
36a0: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
36b0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
36c0: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
36d0: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
36e0: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
36f0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
3700: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20  CKING_STYLE.  { 
3710: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
3720: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3730: 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20  _ptr)pwrite,    
3740: 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b   0  },.#else.  {
3750: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
3760: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3770: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
3780: 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23    0  },.#endif.#
3790: 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20  define osPwrite 
37a0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
37b0: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
37c0: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a  size_t,off_t))\.
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d      aSyscall[12]
37f0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3800: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3810: 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65  D64).  { "pwrite
3820: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3830: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77  3_syscall_ptr)pw
3840: 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a  rite64,   0  },.
3850: 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74  #else.  { "pwrit
3860: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
3870: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3880: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3890: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
38a0: 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73  osPwrite64  ((ss
38b0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e  ize_t(*)(int,con
38c0: 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  st void*,size_t,
38d0: 6f 66 66 36 34 5f 74 29 29 5c 0a 20 20 20 20 20  off64_t))\.     
38e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
38f0: 53 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72  Syscall[13].pCur
3900: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d  rent)..  { "fchm
3910: 6f 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  od",       (sqli
3920: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3930: 66 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20  fchmod,         
3940: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3950: 73 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74  sFchmod    ((int
3960: 28 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29  (*)(int,mode_t))
3970: 61 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75  aSyscall[14].pCu
3980: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3990: 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46  ned(HAVE_POSIX_F
39a0: 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56  ALLOCATE) && HAV
39b0: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
39c0: 45 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  E.  { "fallocate
39d0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
39e0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
39f0: 5f 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d  _fallocate,  0 }
3a00: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c  ,.#else.  { "fal
3a10: 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  locate",    (sql
3a20: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3a30: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
3a40: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3a50: 64 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61  define osFalloca
3a60: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
3a70: 6f 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  off_t,off_t))aSy
3a80: 73 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65  scall[15].pCurre
3a90: 6e 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b  nt)..  { "unlink
3aa0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3ab0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e  3_syscall_ptr)un
3ac0: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20  link,           
3ad0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55  0 },.#define osU
3ae0: 6e 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a  nlink    ((int(*
3af0: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61  )(const char*))a
3b00: 53 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72  Syscall[16].pCur
3b10: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e  rent)..  { "open
3b20: 44 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28  Directory",    (
3b30: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3b40: 70 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72  ptr)openDirector
3b50: 79 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65  y,      0 },.#de
3b60: 66 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63  fine osOpenDirec
3b70: 74 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f  tory ((int(*)(co
3b80: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29  nst char*,int*))
3b90: 61 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75  aSyscall[17].pCu
3ba0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64  rrent)..  { "mkd
3bb0: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3bc0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3bd0: 29 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20  )mkdir,         
3be0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3bf0: 73 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74  sMkdir     ((int
3c00: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  (*)(const char*,
3c10: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3c20: 5b 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [18].pCurrent)..
3c30: 20 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20    { "rmdir",    
3c40: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c50: 63 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20  call_ptr)rmdir, 
3c60: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c70: 64 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20  define osRmdir  
3c80: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c90: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
3ca0: 6c 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[19].pCurrent).
3cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3cc0: 45 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66  E_FCHOWN).  { "f
3cd0: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
3ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3cf0: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
3d00: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
3d10: 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20   { "fchown",    
3d20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3d30: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
3d40: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3d50: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46  ndif.#define osF
3d60: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
3d70: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
3d80: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
3d90: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3da0: 67 65 74 65 75 69 64 22 2c 20 20 20 20 20 20 28  geteuid",      (
3db0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3dc0: 70 74 72 29 67 65 74 65 75 69 64 2c 20 20 20 20  ptr)geteuid,    
3dd0: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3de0: 65 20 6f 73 47 65 74 65 75 69 64 20 20 20 28 28  e osGeteuid   ((
3df0: 75 69 64 5f 74 28 2a 29 28 76 6f 69 64 29 29 61  uid_t(*)(void))a
3e00: 53 79 73 63 61 6c 6c 5b 32 31 5d 2e 70 43 75 72  Syscall[21].pCur
3e10: 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69  rent)..#if !defi
3e20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
3e30: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
3e40: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
3e50: 20 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20   { "mmap",      
3e60: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3e70: 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20 20 20  all_ptr)mmap,   
3e80: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3e90: 6c 73 65 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20  lse.  { "mmap", 
3ea0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
3eb0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3ed0: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3ee0: 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a  e osMmap ((void*
3ef0: 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  (*)(void*,size_t
3f00: 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66  ,int,int,int,off
3f10: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  _t))aSyscall[22]
3f20: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3f30: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3f40: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
3f50: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
3f60: 45 3e 30 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22  E>0.  { "munmap"
3f70: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3f80: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 75 6e  _syscall_ptr)mun
3f90: 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  map,          0 
3fa0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 75  },.#else.  { "mu
3fb0: 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  nmap",       (sq
3fc0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3fd0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
3fe0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
3ff0: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
4000: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
4010: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
4020: 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[23].pCurrent).
4030: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
4040: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 53 51   && (!defined(SQ
4050: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
4060: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
4070: 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20 22 6d  P_SIZE>0).  { "m
4080: 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73  remap",       (s
4090: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
40a0: 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20 20 20  tr)mremap,      
40b0: 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20      0 },.#else. 
40c0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
40d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
40e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
40f0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
4100: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d  ndif.#define osM
4110: 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28 2a 29  remap ((void*(*)
4120: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 73 69  (void*,size_t,si
4130: 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53  ze_t,int,...))aS
4140: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
4150: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
4160: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
4170: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
4180: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
4190: 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c  { "getpagesize",
41a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
41b0: 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61  ll_ptr)unixGetpa
41c0: 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 65 6c  gesize, 0 },.#el
41d0: 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67 65 73  se.  { "getpages
41e0: 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33 5f  ize",  (sqlite3_
41f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
4200: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
4210: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
4220: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
4230: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
4240: 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72  yscall[25].pCurr
4250: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
4260: 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e 4b 29  d(HAVE_READLINK)
4270: 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c  .  { "readlink",
4280: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
4290: 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 6c 69  scall_ptr)readli
42a0: 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  nk,        0 },.
42b0: 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61 64 6c  #else.  { "readl
42c0: 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74  ink",     (sqlit
42d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
42e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
42f0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
4300: 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b 20 28  ine osReadlink (
4310: 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f 6e 73  (ssize_t(*)(cons
4320: 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c 73 69  t char*,char*,si
4330: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ze_t))aSyscall[2
4340: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  6].pCurrent)..#i
4350: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4c  f defined(HAVE_L
4360: 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74 61 74  STAT).  { "lstat
4370: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4380: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4390: 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20 20 20  lstat,          
43a0: 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22  0 },.#else.  { "
43b0: 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 20  lstat",         
43c0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
43d0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
43e0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66       0 },.#endif
43f0: 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74 61 74  .#define osLstat
4400: 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63        ((int(*)(c
4410: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63  onst char*,struc
4420: 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c  t stat*))aSyscal
4430: 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[27].pCurrent).
4440: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
4450: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
4460: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
4470: 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73  ./*.** On some s
4480: 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f  ystems, calls to
4490: 20 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74   fchown() will t
44a0: 72 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65  rigger a message
44b0: 20 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a   in a security.*
44c0: 2a 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f  * log if they co
44d0: 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74  me from non-root
44e0: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20   processes.  So 
44f0: 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63  avoid calling fc
4500: 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20  hown() if.** we 
4510: 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20  are not running 
4520: 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74  as root..*/.stat
4530: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68  ic int robustFch
4540: 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f  own(int fd, uid_
4550: 74 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64  t uid, gid_t gid
4560: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  ){.#if defined(H
4570: 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65  AVE_FCHOWN).  re
4580: 74 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29  turn osGeteuid()
4590: 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28   ? 0 : osFchown(
45a0: 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c  fd,uid,gid);.#el
45b0: 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  se.  return 0;.#
45c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
45d0: 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53  his is the xSetS
45e0: 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68  ystemCall() meth
45f0: 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  od of sqlite3_vf
4600: 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  s for all of the
4610: 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73  .** "unix" VFSes
4620: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
4630: 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73  _OK opon success
4640: 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74  fully updating t
4650: 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c  he.** system cal
4660: 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51  l pointer, or SQ
4670: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66  LITE_NOTFOUND if
4680: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e   there is no con
4690: 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73  figurable.** sys
46a0: 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a  tem call named z
46b0: 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Name..*/.static 
46c0: 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65  int unixSetSyste
46d0: 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33  mCall(.  sqlite3
46e0: 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20  _vfs *pNotUsed, 
46f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
4700: 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20  S pointer.  Not 
4710: 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  used */.  const 
4720: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20  char *zName,    
4730: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
4740: 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  of system call t
4750: 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20  o override */.  
4760: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
4770: 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a  ptr pNewFunc  /*
4780: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
4790: 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75  system call valu
47a0: 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
47b0: 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  ed int i;.  int 
47c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46  rc = SQLITE_NOTF
47d0: 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  OUND;..  UNUSED_
47e0: 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73  PARAMETER(pNotUs
47f0: 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ed);.  if( zName
4800: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ==0 ){.    /* If
4810: 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76   no zName is giv
4820: 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20  en, restore all 
4830: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20  system calls to 
4840: 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20  their default.  
4850: 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e    ** settings an
4860: 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20  d return NULL.  
4870: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51    */.    rc = SQ
4880: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72  LITE_OK;.    for
4890: 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
48a0: 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28  Syscall)/sizeof(
48b0: 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b  aSyscall[0]); i+
48c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53  +){.      if( aS
48d0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
48e0: 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53  lt ){.        aS
48f0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4900: 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nt = aSyscall[i]
4910: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
4920: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
4930: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
4940: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
4950: 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20  operate on only 
4960: 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63  the one system c
4970: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69  all.    ** speci
4980: 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  fied..    */.   
4990: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
49a0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
49b0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
49c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
49d0: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
49e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
49f0: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  e)==0 ){.       
4a00: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
4a10: 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a  .pDefault==0 ){.
4a20: 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61            aSysca
4a30: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d  ll[i].pDefault =
4a40: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4a50: 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d  rrent;.        }
4a60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
4a70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
4a80: 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30   if( pNewFunc==0
4a90: 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53   ) pNewFunc = aS
4aa0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75  yscall[i].pDefau
4ab0: 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73  lt;.        aSys
4ac0: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
4ad0: 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20   = pNewFunc;.   
4ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4af0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
4b00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4b10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76  .** Return the v
4b20: 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d  alue of a system
4b30: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4b40: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20  ULL if zName is 
4b50: 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69  not a.** recogni
4b60: 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  zed system call 
4b70: 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61  name.  NULL is a
4b80: 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20  lso returned if 
4b90: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a  the system call.
4ba0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
4bb0: 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
4bc0: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73  atic sqlite3_sys
4bd0: 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74  call_ptr unixGet
4be0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4bf0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4c00: 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  sed,.  const cha
4c10: 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e  r *zName.){.  un
4c20: 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20  signed int i;.. 
4c30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
4c40: 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66  R(pNotUsed);.  f
4c50: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4c60: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4c70: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4c80: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
4c90: 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73  rcmp(zName, aSys
4ca0: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d  call[i].zName)==
4cb0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
4cc0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b  all[i].pCurrent;
4cd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4cf0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4d00: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
4d10: 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20  ll after zName. 
4d20: 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a   If zName==NULL.
4d30: 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  ** then return t
4d40: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
4d50: 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c  irst system call
4d60: 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
4d70: 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68  f zName.** is th
4d80: 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61  e last system ca
4d90: 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69  ll or if zName i
4da0: 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f  s not the name o
4db0: 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73  f a valid.** sys
4dc0: 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61  tem call..*/.sta
4dd0: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
4de0: 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61  unixNextSystemCa
4df0: 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ll(sqlite3_vfs *
4e00: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
4e10: 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d  Name){.  int i =
4e20: 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50   -1;..  UNUSED_P
4e30: 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69  ARAMETER(p);.  i
4e40: 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
4e50: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
4e60: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31  Size(aSyscall)-1
4e70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4e80: 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20  ( strcmp(zName, 
4e90: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
4ea0: 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
4eb0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
4ec0: 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  ++; i<ArraySize(
4ed0: 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b  aSyscall); i++){
4ee0: 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c  .    if( aSyscal
4ef0: 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30  l[i].pCurrent!=0
4f00: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
4f10: 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d  ll[i].zName;.  }
4f20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4f30: 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63  /*.** Do not acc
4f40: 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73  ept any file des
4f50: 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61  criptor less tha
4f60: 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e  n this value, in
4f70: 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a   order to avoid.
4f80: 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62  ** opening datab
4f90: 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66  ase file using f
4fa0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4fb0: 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c  that are commonl
4fc0: 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73  y used for .** s
4fd0: 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f  tandard input, o
4fe0: 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72  utput, and error
4ff0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
5000: 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45  ITE_MINIMUM_FILE
5010: 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65  _DESCRIPTOR.# de
5020: 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49  fine SQLITE_MINI
5030: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
5040: 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TOR 3.#endif../*
5050: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28  .** Invoke open(
5060: 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70  ).  Do so multip
5070: 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20  le times, until 
5080: 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65  it either succee
5090: 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66  ds or.** fails f
50a0: 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f  or some reason o
50b0: 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e  ther than EINTR.
50c0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
50d0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
50e0: 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73   "m" is 0 then s
50f0: 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66  et it to the def
5100: 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69  ault for.** SQLi
5110: 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  te.  The default
5120: 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55   is SQLITE_DEFAU
5130: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
5140: 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a  ONS (normally.**
5150: 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69   0644) as modifi
5160: 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d  ed by the system
5170: 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73   umask.  If m is
5180: 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20   not 0, then.** 
5190: 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72  make the file cr
51a0: 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65  eation mode be e
51b0: 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e  xactly m ignorin
51c0: 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a  g the umask..**.
51d0: 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74  ** The m paramet
51e0: 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a  er will be non-z
51f0: 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72  ero only when cr
5200: 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f  eating -wal, -jo
5210: 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73  urnal,.** and -s
5220: 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61  hm files.  We wa
5230: 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74  nt those files t
5240: 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a  o have *exactly*
5250: 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72   the same.** per
5260: 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69  missions as thei
5270: 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  r original datab
5280: 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74  ase, unadulterat
5290: 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
52a0: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c  .** In that way,
52b0: 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66   if a database f
52c0: 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77  ile is -rw-rw-rw
52d0: 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61   or -rw-rw-r-, a
52e0: 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74  nd a.** transact
52f0: 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20  ion crashes and 
5300: 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f  leaves behind ho
5310: 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e  t journals, then
5320: 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20   any.** process 
5330: 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20  that is able to 
5340: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
5350: 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20  abase will also 
5360: 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65  be able to.** re
5370: 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f  cover the hot jo
5380: 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  urnals..*/.stati
5390: 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65  c int robust_ope
53a0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  n(const char *z,
53b0: 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d   int f, mode_t m
53c0: 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d  ){.  int fd;.  m
53d0: 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d  ode_t m2 = m ? m
53e0: 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   : SQLITE_DEFAUL
53f0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5400: 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  NS;.  while(1){.
5410: 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c  #if defined(O_CL
5420: 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20  OEXEC).    fd = 
5430: 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f  osOpen(z,f|O_CLO
5440: 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a  EXEC,m2);.#else.
5450: 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28      fd = osOpen(
5460: 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a  z,f,m2);.#endif.
5470: 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
5480: 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
5490: 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75  =EINTR ) continu
54a0: 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;.      break;.
54b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64      }.    if( fd
54c0: 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  >=SQLITE_MINIMUM
54d0: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
54e0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73   ) break;.    os
54f0: 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73  Close(fd);.    s
5500: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
5510: 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20  E_WARNING, .    
5520: 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74              "att
5530: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25  empt to open \"%
5540: 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63  s\" as file desc
5550: 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66  riptor %d", z, f
5560: 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b  d);.    fd = -1;
5570: 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28  .    if( osOpen(
5580: 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20  "/dev/null", f, 
5590: 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  m)<0 ) break;.  
55a0: 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b  }.  if( fd>=0 ){
55b0: 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b  .    if( m!=0 ){
55c0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74  .      struct st
55d0: 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20  at statbuf;.    
55e0: 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64    if( osFstat(fd
55f0: 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a  , &statbuf)==0 .
5600: 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75         && statbu
5610: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20  f.st_size==0.   
5620: 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e      && (statbuf.
5630: 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d  st_mode&0777)!=m
5640: 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
5650: 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20     osFchmod(fd, 
5660: 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
5670: 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44  }.#if defined(FD
5680: 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64  _CLOEXEC) && (!d
5690: 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43  efined(O_CLOEXEC
56a0: 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d  ) || O_CLOEXEC==
56b0: 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  0).    osFcntl(f
56c0: 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63  d, F_SETFD, osFc
56d0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c  ntl(fd, F_GETFD,
56e0: 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43   0) | FD_CLOEXEC
56f0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
5700: 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a  return fd;.}../*
5710: 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74  .** Helper funct
5720: 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61  ions to obtain a
5730: 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68  nd relinquish th
5740: 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20  e global mutex. 
5750: 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75  The.** global mu
5760: 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70  tex is used to p
5770: 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49  rotect the unixI
5780: 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20  nodeInfo and.** 
5790: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
57a0: 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68  jects used by th
57b0: 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20  is file, all of 
57c0: 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a  which may be .**
57d0: 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69   shared by multi
57e0: 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a  ple threads..**.
57f0: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78  ** Function unix
5800: 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75  MutexHeld() is u
5810: 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20  sed to assert() 
5820: 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20  that the global 
5830: 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c  mutex .** is hel
5840: 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e  d when required.
5850: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
5860: 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70  s only used as p
5870: 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20  art of assert() 
5880: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  .** statements. 
5890: 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69  e.g..**.**   uni
58a0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a  xEnterMutex().**
58b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69       assert( uni
58c0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
58d0: 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65  **   unixEnterLe
58e0: 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ave().*/.static 
58f0: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5900: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
5910: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5920: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
5930: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
5940: 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
5950: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
5960: 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69 64  xLeaveMutex(void
5970: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
5980: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
5990: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
59a0: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56  E_MUTEX_STATIC_V
59b0: 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65 66 20  FS1));.}.#ifdef 
59c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
59d0: 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75 74 65  tic int unixMute
59e0: 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a 20 20  xHeld(void) {.  
59f0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 6d  return sqlite3_m
5a00: 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69 74 65  utex_held(sqlite
5a10: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
5a20: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5a30: 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  VFS1));.}.#endif
5a40: 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
5a50: 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45 0a 2f  _HAVE_OS_TRACE./
5a60: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
5a70: 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e  tion for printin
5a80: 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e 66 6f  g out trace info
5a90: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62  rmation from deb
5aa0: 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69  ugging.** binari
5ab0: 65 73 2e 20 54 68 69 73 20 72 65 74 75 72 6e 73  es. This returns
5ac0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 72   the string repr
5ad0: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
5ae0: 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e  e supplied.** in
5af0: 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e  teger lock-type.
5b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
5b10: 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63   char *azFileLoc
5b20: 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  k(int eFileLock)
5b30: 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69 6c  {.  switch( eFil
5b40: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61 73  eLock ){.    cas
5b50: 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  e NO_LOCK: retur
5b60: 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61  n "NONE";.    ca
5b70: 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20  se SHARED_LOCK: 
5b80: 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22 3b  return "SHARED";
5b90: 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52 56  .    case RESERV
5ba0: 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  ED_LOCK: return 
5bb0: 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20 20  "RESERVED";.    
5bc0: 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  case PENDING_LOC
5bd0: 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44 49  K: return "PENDI
5be0: 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45 58  NG";.    case EX
5bf0: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65  CLUSIVE_LOCK: re
5c00: 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45 22  turn "EXCLUSIVE"
5c10: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 22  ;.  }.  return "
5c20: 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66  ERROR";.}.#endif
5c30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
5c40: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a  LOCK_TRACE./*.**
5c50: 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72   Print out infor
5c60: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c  mation about all
5c70: 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69   locking operati
5c80: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ons..**.** This 
5c90: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
5ca0: 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74  for troubleshoot
5cb0: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c  ing locks on mul
5cc0: 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c  tithreaded.** pl
5cd0: 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65  atforms.  Enable
5ce0: 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69   by compiling wi
5cf0: 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45 5f  th the -DSQLITE_
5d00: 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f  LOCK_TRACE.** co
5d10: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
5d20: 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  n on the compile
5d30: 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69 73  r.  This code is
5d40: 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72   normally.** tur
5d50: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
5d60: 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65  ic int lockTrace
5d70: 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c  (int fd, int op,
5d80: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
5d90: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61  ){.  char *zOpNa
5da0: 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e  me, *zType;.  in
5db0: 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65 64  t s;.  int saved
5dc0: 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d  Errno;.  if( op=
5dd0: 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20  =F_GETLK ){.    
5de0: 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b  zOpName = "GETLK
5df0: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6f  ";.  }else if( o
5e00: 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20  p==F_SETLK ){.  
5e10: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54    zOpName = "SET
5e20: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  LK";.  }else{.  
5e30: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5e40: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73 71  , op, p);.    sq
5e50: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
5e60: 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20  ("fcntl unknown 
5e70: 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c  %d %d %d\n", fd,
5e80: 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65 74   op, s);.    ret
5e90: 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28  urn s;.  }.  if(
5ea0: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44   p->l_type==F_RD
5eb0: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5ec0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65   = "RDLCK";.  }e
5ed0: 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  lse if( p->l_typ
5ee0: 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20  e==F_WRLCK ){.  
5ef0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
5f00: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
5f10: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  ->l_type==F_UNLC
5f20: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
5f30: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "UNLCK";.  }els
5f40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  e{.    assert( 0
5f50: 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   );.  }.  assert
5f60: 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53  ( p->l_whence==S
5f70: 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d  EEK_SET );.  s =
5f80: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c   osFcntl(fd, op,
5f90: 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72 6e   p);.  savedErrn
5fa0: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c  o = errno;.  sql
5fb0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
5fc0: 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73 20  "fcntl %d %d %s 
5fd0: 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c 6e  %s %d %d %d %d\n
5fe0: 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69 64  ",.     threadid
5ff0: 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a  , fd, zOpName, z
6000: 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f  Type, (int)p->l_
6010: 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c  start, (int)p->l
6020: 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29  _len,.     (int)
6030: 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20  p->l_pid, s);.  
6040: 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f  if( s==(-1) && o
6050: 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28 70  p==F_SETLK && (p
6060: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  ->l_type==F_RDLC
6070: 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d  K || p->l_type==
6080: 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20  F_WRLCK) ){.    
6090: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b  struct flock l2;
60a0: 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20  .    l2 = *p;.  
60b0: 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f    osFcntl(fd, F_
60c0: 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20  GETLK, &l2);.   
60d0: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
60e0: 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
60f0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
6100: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
6110: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c  l2.l_type==F_WRL
6120: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
6130: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20  e = "WRLCK";.   
6140: 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f   }else if( l2.l_
6150: 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type==F_UNLCK ){
6160: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
6170: 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  UNLCK";.    }els
6180: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
6190: 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   0 );.    }.    
61a0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
61b0: 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72  tf("fcntl-failur
61c0: 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64 20  e-reason: %s %d 
61d0: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %d\n",.      
61e0: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e   zType, (int)l2.
61f0: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c 32  l_start, (int)l2
6200: 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e  .l_len, (int)l2.
6210: 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72  l_pid);.  }.  er
6220: 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e 6f  rno = savedErrno
6230: 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a  ;.  return s;.}.
6240: 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23  #undef osFcntl.#
6250: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c  define osFcntl l
6260: 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66 20  ockTrace.#endif 
6270: 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  /* SQLITE_LOCK_T
6280: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  RACE */../*.** R
6290: 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28 29  etry ftruncate()
62a0: 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69 6c   calls that fail
62b0: 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a   due to EINTR.**
62c0: 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f  .** All calls to
62d0: 20 66 74 72 75 6e 63 61 74 65 28 29 20 77 69 74   ftruncate() wit
62e0: 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20 73 68  hin this file sh
62f0: 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74 68 72  ould be made thr
6300: 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77 72 61  ough.** this wra
6310: 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20 41 6e  pper.  On the An
6320: 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d 2c 20  droid platform, 
6330: 62 79 70 61 73 73 69 6e 67 20 74 68 65 20 6c 6f  bypassing the lo
6340: 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63 6f 75  gic below.** cou
6350: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63 6f 72  ld lead to a cor
6360: 72 75 70 74 20 64 61 74 61 62 61 73 65 2e 0a 2a  rupt database..*
6370: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
6380: 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e  ust_ftruncate(in
6390: 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  t h, sqlite3_int
63a0: 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63  64 sz){.  int rc
63b0: 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f  ;.#ifdef __ANDRO
63c0: 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64  ID__.  /* On And
63d0: 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74 65 28  roid, ftruncate(
63e0: 29 20 61 6c 77 61 79 73 20 75 73 65 73 20 33 32  ) always uses 32
63f0: 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20 65 76  -bit offsets, ev
6400: 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46 49 4c  en if .  ** _FIL
6410: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34  E_OFFSET_BITS=64
6420: 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54 68 69   is defined. Thi
6430: 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20 75 6e  s means it is un
6440: 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70 74 20  safe to attempt 
6450: 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  to.  ** truncate
6460: 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79 20 73   a file to any s
6470: 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ize larger than 
6480: 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79 20 69  2GiB. Silently i
6490: 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a 20 73  gnore any.  ** s
64a0: 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20 20 2a  uch attempts.  *
64b0: 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71 6c 69  /.  if( sz>(sqli
64c0: 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46 46 46  te3_int64)0x7FFF
64d0: 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63 20 3d  FFFF ){.    rc =
64e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
64f0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b  lse.#endif.  do{
6500: 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63 61 74   rc = osFtruncat
6510: 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c 65 28  e(h,sz); }while(
6520: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
6530: 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
6540: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6550: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72 61 6e  his routine tran
6560: 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64 61 72  slates a standar
6570: 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20 63 6f  d POSIX errno co
6580: 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68 69 6e  de into somethin
6590: 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f 20 74  g.** useful to t
65a0: 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20 74 68  he clients of th
65b0: 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63 74 69  e sqlite3 functi
65c0: 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c  ons.  Specifical
65d0: 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69 6e 74  ly, it is.** int
65e0: 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73 6c 61  ended to transla
65f0: 74 65 20 61 20 76 61 72 69 65 74 79 20 6f 66 20  te a variety of 
6600: 22 74 72 79 20 61 67 61 69 6e 22 20 65 72 72 6f  "try again" erro
6610: 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45 5f 42  rs into SQLITE_B
6620: 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76 61 72  USY.** and a var
6630: 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73 65 20  iety of "please 
6640: 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
6650: 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22 20 65  escriptor NOW" e
6660: 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a 20 53  rrors into .** S
6670: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a  QLITE_IOERR.** .
6680: 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69 6e 67  ** Errors during
6690: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
66a0: 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66 69 6c  of locks, or fil
66b0: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
66c0: 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73   for locks,.** s
66d0: 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45 4e 4f  hould handle ENO
66e0: 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20 45 4f  LCK, ENOTSUP, EO
66f0: 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72 61 74  PNOTSUPP separat
6700: 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ely..*/.static i
6710: 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72  nt sqliteErrorFr
6720: 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  omPosixError(int
6730: 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69 6e 74   posixError, int
6740: 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20 7b 0a   sqliteIOErr) {.
6750: 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 74    assert( (sqlit
6760: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6770: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20  _IOERR_LOCK) || 
6780: 0a 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  .          (sqli
6790: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
67a0: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
67b0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73  || .          (s
67c0: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
67d0: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
67e0: 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  K) ||.          
67f0: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6800: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
6810: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 20  CKRESERVEDLOCK) 
6820: 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73  );.  switch (pos
6830: 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63 61 73  ixError) {.  cas
6840: 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63 61 73  e EACCES: .  cas
6850: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
6860: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
6870: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
6880: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
6890: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
68a0: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
68b0: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
68c0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
68d0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
68e0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
68f0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
6900: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
6910: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
6920: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
6930: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
6940: 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75  EPERM: .    retu
6950: 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
6960: 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20      .  default: 
6970: 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
6980: 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a  teIOErr;.  }.}..
6990: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
69a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69e0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
69f0: 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65  *** Begin Unique
6a00: 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79   File ID Utility
6a10: 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73   Used By VxWorks
6a20: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
6a30: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76  .**.** On most v
6a40: 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c  ersions of unix,
6a50: 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e   we can get a un
6a60: 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69  ique ID for a fi
6a70: 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74  le by concatenat
6a80: 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63  ing.** the devic
6a90: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
6aa0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
6ab0: 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  But this does no
6ac0: 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b  t work on VxWork
6ad0: 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73  s..** On VxWorks
6ae0: 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  , a unique file 
6af0: 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64  id must be based
6b00: 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61   on the canonica
6b10: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a  l filename..**.*
6b20: 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * A pointer to a
6b30: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
6b40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6b50: 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65  cture can be use
6b60: 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65  d as a.** unique
6b70: 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f   file ID in VxWo
6b80: 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61  rks.  Each insta
6b90: 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  nce of this stru
6ba0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
6bb0: 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  * a copy of the 
6bc0: 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61  canonical filena
6bd0: 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c  me.  There is al
6be0: 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  so a reference c
6bf0: 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73  ount.  .** The s
6c00: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c  tructure is recl
6c10: 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e  aimed when the n
6c20: 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72  umber of pointer
6c30: 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f  s to it drops to
6c40: 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  .** zero..**.** 
6c50: 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20  There are never 
6c60: 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20  very many files 
6c70: 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65  open at one time
6c80: 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65   and lookups are
6c90: 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72   not.** a perfor
6ca0: 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70  mance-critical p
6cb0: 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75  ath, so it is su
6cc0: 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20  fficient to put 
6cd0: 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75  these.** structu
6ce0: 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  res on a linked 
6cf0: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  list..*/.struct 
6d00: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a  vxworksFileId {.
6d10: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
6d20: 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20  FileId *pNext;  
6d30: 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73  /* Next in a lis
6d40: 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f  t of them all */
6d50: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
6d80: 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73  ferences to this
6d90: 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e   one */.  int nN
6da0: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
6db0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6dc0: 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69  h of the zCanoni
6dd0: 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67  calName[] string
6de0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e   */.  char *zCan
6df0: 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20  onicalName;     
6e00: 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c      /* Canonical
6e10: 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a   filename */.};.
6e20: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
6e30: 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75  /* .** All uniqu
6e40: 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20  e filenames are 
6e50: 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  held on a linked
6e60: 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20   list headed by 
6e70: 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65  this.** variable
6e80: 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  :.*/.static stru
6e90: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
6ea0: 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73   *vxworksFileLis
6eb0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69  t = 0;../*.** Si
6ec0: 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d  mplify a filenam
6ed0: 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e  e into its canon
6ee0: 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20  ical form.** by 
6ef0: 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  making the follo
6f00: 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a  wing changes:.**
6f10: 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20  .**  * removing 
6f20: 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64  any trailing and
6f30: 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20   duplicate /.** 
6f40: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69   * convert /./ i
6f50: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a  nto just /.**  *
6f60: 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20   convert /A/../ 
6f70: 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73  where A is any s
6f80: 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20  imple name into 
6f90: 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61  just /.**.** Cha
6fa0: 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e  nges are made in
6fb0: 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20  -place.  Return 
6fc0: 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e  the new name len
6fd0: 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  gth..**.** The o
6fe0: 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
6ff0: 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d   is in z[0..n-1]
7000: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
7010: 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61  mber of.** chara
7020: 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d  cters in the sim
7030: 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f  plified name..*/
7040: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f  .static int vxwo
7050: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
7060: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
7070: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77  .  int i, j;.  w
7080: 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e  hile( n>1 && z[n
7090: 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b  -1]=='/' ){ n--;
70a0: 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20   }.  for(i=j=0; 
70b0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<n; i++){.    i
70c0: 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a  f( z[i]=='/' ){.
70d0: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
70e0: 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65  =='/' ) continue
70f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  ;.      if( z[i+
7100: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e  1]=='.' && i+2<n
7110: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20   && z[i+2]=='/' 
7120: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  ){.        i += 
7130: 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  1;.        conti
7140: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7150: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
7160: 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a  .' && i+3<n && z
7170: 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b  [i+2]=='.' && z[
7180: 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+3]=='/' ){.   
7190: 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20       while( j>0 
71a0: 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29  && z[j-1]!='/' )
71b0: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
71c0: 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b   if( j>0 ){ j--;
71d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20   }.        i += 
71e0: 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  2;.        conti
71f0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
7200: 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20   }.    z[j++] = 
7210: 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d  z[i];.  }.  z[j]
7220: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a   = 0;.  return j
7230: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
7240: 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44  a unique file ID
7250: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61   for the given a
7260: 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65  bsolute pathname
7270: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
7280: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78  ointer to the vx
7290: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
72a0: 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65  ct.  This pointe
72b0: 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a  r is the unique.
72c0: 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a  ** file ID..**.*
72d0: 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64  * The nRef field
72e0: 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46   of the vxworksF
72f0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20  ileId object is 
7300: 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f  incremented befo
7310: 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  re.** the object
7320: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41   is returned.  A
7330: 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65   new vxworksFile
7340: 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  Id object is cre
7350: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65  ated.** and adde
7360: 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  d to the global 
7370: 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72  list if necessar
7380: 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65  y..**.** If a me
7390: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
73a0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
73b0: 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
73c0: 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f  atic struct vxwo
73d0: 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72  rksFileId *vxwor
73e0: 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e  ksFindFileId(con
73f0: 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75  st char *zAbsolu
7400: 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63  teName){.  struc
7410: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7420: 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f  *pNew;         /
7430: 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64  * search key and
7440: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
7450: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
7460: 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61  FileId *pCandida
7470: 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f  te;   /* For loo
7480: 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69  ping over existi
7490: 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20  ng file IDs */. 
74a0: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f       /* Length o
74d0: 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20  f zAbsoluteName 
74e0: 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73  string */..  ass
74f0: 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61  ert( zAbsoluteNa
7500: 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20  me[0]=='/' );.  
7510: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
7520: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a  zAbsoluteName);.
7530: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
7540: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
7550: 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29  f(*pNew) + (n+1)
7560: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
7570: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7580: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7590: 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  Name = (char*)&p
75a0: 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79  New[1];.  memcpy
75b0: 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61  (pNew->zCanonica
75c0: 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65  lName, zAbsolute
75d0: 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20  Name, n+1);.  n 
75e0: 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  = vxworksSimplif
75f0: 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e  yName(pNew->zCan
7600: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a  onicalName, n);.
7610: 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72  .  /* Search for
7620: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74   an existing ent
7630: 72 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67  ry that matching
7640: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e   the canonical n
7650: 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75  ame..  ** If fou
7660: 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  nd, increment th
7670: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
7680: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70  t and return a p
7690: 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74  ointer to.  ** t
76a0: 68 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65  he existing file
76b0: 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78   ID..  */.  unix
76c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
76d0: 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76  for(pCandidate=v
76e0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
76f0: 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e  pCandidate; pCan
7700: 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74  didate=pCandidat
7710: 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  e->pNext){.    i
7720: 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e  f( pCandidate->n
7730: 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26  Name==n .     &&
7740: 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61   memcmp(pCandida
7750: 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  te->zCanonicalNa
7760: 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  me, pNew->zCanon
7770: 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a  icalName, n)==0.
7780: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71      ){.       sq
7790: 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29  lite3_free(pNew)
77a0: 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64  ;.       pCandid
77b0: 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ate->nRef++;.   
77c0: 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
77d0: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74  ex();.       ret
77e0: 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a  urn pCandidate;.
77f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
7800: 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75  No match was fou
7810: 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b  nd.  We will mak
7820: 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20  e a new file ID 
7830: 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  */.  pNew->nRef 
7840: 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61  = 1;.  pNew->nNa
7850: 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e  me = n;.  pNew->
7860: 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46  pNext = vxworksF
7870: 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72  ileList;.  vxwor
7880: 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65  ksFileList = pNe
7890: 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  w;.  unixLeaveMu
78a0: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
78b0: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  pNew;.}../*.** D
78c0: 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
78d0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
78e0: 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  a vxworksFileId 
78f0: 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a  object.  Free.**
7900: 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e   the object when
7910: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
7920: 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72  ount reaches zer
7930: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  o..*/.static voi
7940: 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  d vxworksRelease
7950: 46 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78  FileId(struct vx
7960: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64  worksFileId *pId
7970: 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  ){.  unixEnterMu
7980: 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28  tex();.  assert(
7990: 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pId->nRef>0 );.
79a0: 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pId->nRef--;. 
79b0: 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d   if( pId->nRef==
79c0: 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
79d0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a  vxworksFileId **
79e0: 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26  pp;.    for(pp=&
79f0: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b  vxworksFileList;
7a00: 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64   *pp && *pp!=pId
7a10: 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e  ; pp = &((*pp)->
7a20: 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73  pNext)){}.    as
7a30: 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29  sert( *pp==pId )
7a40: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d  ;.    *pp = pId-
7a50: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
7a60: 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20  te3_free(pId);. 
7a70: 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
7a80: 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  tex();.}.#endif 
7a90: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
7aa0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
7ab0: 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20  * End of Unique 
7ac0: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
7ad0: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
7ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7af0: 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
7b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
7b40: 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7b90: 2a 2a 0a 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 20 50  ************** P
7bb0: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
7bc0: 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61  **.**.** POSIX a
7bf0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
7c00: 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69  e broken by desi
7c10: 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30  gn.  ANSI STD 10
7c20: 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73  03.1 (1996).** s
7c30: 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c  ection 6.5.2.2 l
7c40: 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68  ines 483 through
7c50: 20 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61   490 specify tha
7c60: 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73  t when a process
7c70: 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61  .** sets or clea
7c80: 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20  rs a lock, that 
7c90: 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69  operation overri
7ca0: 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f  des any prior lo
7cb0: 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68  cks set.** by th
7cc0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7cd0: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70   It does not exp
7ce0: 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20  licitly say so, 
7cf0: 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73  but this implies
7d00: 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72  .** that it over
7d10: 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20  rides locks set 
7d20: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
7d30: 65 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66  ess using a diff
7d40: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
7d50: 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69  scriptor.  Consi
7d60: 64 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61  der this test ca
7d70: 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  se:.**.**       
7d80: 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22  int fd1 = open("
7d90: 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52  ./file1", O_RDWR
7da0: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
7db0: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
7dc0: 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  2 = open("./file
7dd0: 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  2", O_RDWR|O_CRE
7de0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a  AT, 0644);.**.**
7df0: 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31   Suppose ./file1
7e00: 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65   and ./file2 are
7e10: 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65   really the same
7e20: 20 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a   file (because.*
7e30: 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20  * one is a hard 
7e40: 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  or symbolic link
7e50: 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74   to the other) t
7e60: 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a  hen if you set.*
7e70: 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  * an exclusive l
7e80: 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e  ock on fd1, then
7e90: 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65   try to get an e
7ea0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a  xclusive lock.**
7eb0: 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b   on fd2, it work
7ec0: 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65  s.  I would have
7ed0: 20 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65   expected the se
7ee0: 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20  cond lock to.** 
7ef0: 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65  fail since there
7f00: 20 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c   was already a l
7f10: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
7f20: 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42  due to fd1..** B
7f30: 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63  ut not so.  Sinc
7f40: 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d  e both locks cam
7f50: 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20  e from the same 
7f60: 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20  process, the.** 
7f70: 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73  second overrides
7f80: 20 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e   the first, even
7f90: 20 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72   though they wer
7fa0: 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a  e on different.*
7fb0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
7fc0: 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66  rs opened on dif
7fd0: 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65  ferent file name
7fe0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65  s..**.** This me
7ff0: 61 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e  ans that we cann
8000: 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63  ot use POSIX loc
8010: 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ks to synchroniz
8020: 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a  e file access.**
8030: 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67   among competing
8040: 20 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20   threads of the 
8050: 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50  same process.  P
8060: 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  OSIX locks will 
8070: 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20  work fine.** to 
8080: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65  synchronize acce
8090: 73 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69  ss for threads i
80a0: 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  n separate proce
80b0: 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a  sses, but not.**
80c0: 20 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20   threads within 
80d0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
80e0: 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20  ..**.** To work 
80f0: 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c  around the probl
8100: 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74  em, SQLite has t
8110: 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f  o manage file lo
8120: 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  cks internally.*
8130: 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57  * on its own.  W
8140: 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61  henever a new da
8150: 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64  tabase is opened
8160: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e  , we have to fin
8170: 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69  d the.** specifi
8180: 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64  c inode of the d
8190: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68  atabase file (th
81a0: 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72  e inode is deter
81b0: 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  mined by the.** 
81c0: 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e  st_dev and st_in
81d0: 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  o fields of the 
81e0: 73 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74  stat structure t
81f0: 68 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c  hat fstat() fill
8200: 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65  s in).** and che
8210: 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72  ck for locks alr
8220: 65 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e  eady existing on
8230: 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68   that inode.  Wh
8240: 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20  en locks are.** 
8250: 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76  created or remov
8260: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c  ed, we have to l
8270: 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69  ook at our own i
8280: 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f  nternal record o
8290: 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74  f the.** locks t
82a0: 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
82b0: 20 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76   thread has prev
82c0: 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63  iously set a loc
82d0: 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a  k on that same.*
82e0: 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28  * inode..**.** (
82f0: 41 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f  Aside: The use o
8300: 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20  f inode numbers 
8310: 61 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f  as unique IDs do
8320: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
8330: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56  xWorks..** For V
8340: 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20  xWorks, we have 
8350: 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72  to use the alter
8360: 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44  native unique ID
8370: 20 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e   system based on
8380: 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  .** canonical fi
8390: 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65  lename and imple
83a0: 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72  mented in the pr
83b0: 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e  evious division.
83c0: 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ).**.** The sqli
83d0: 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
83e0: 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20  re for POSIX is 
83f0: 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61  no longer just a
8400: 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a  n integer file.*
8410: 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49  * descriptor.  I
8420: 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63  t is now a struc
8430: 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20  ture that holds 
8440: 74 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65  the integer file
8450: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61  .** descriptor a
8460: 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  nd a pointer to 
8470: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
8480: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69   describes the i
8490: 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73  nternal.** locks
84a0: 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f   on the correspo
84b0: 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68  nding inode.  Th
84c0: 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69  ere is one locki
84d0: 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20  ng structure.** 
84e0: 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66  per inode, so if
84f0: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
8500: 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c  is opened twice,
8510: 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73   both unixFile s
8520: 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69  tructures.** poi
8530: 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c  nt to the same l
8540: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
8550: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73  .  The locking s
8560: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a  tructure keeps.*
8570: 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  * a reference co
8580: 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20  unt (so we will 
8590: 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c  know when to del
85a0: 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63  ete it) and a "c
85b0: 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61  nt".** field tha
85c0: 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69  t tells us its i
85d0: 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  nternal lock sta
85e0: 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61  tus.  cnt==0 mea
85f0: 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  ns the.** file i
8600: 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74  s unlocked.  cnt
8610: 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66  ==-1 means the f
8620: 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75  ile has an exclu
8630: 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e  sive lock..** cn
8640: 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  t>0 means there 
8650: 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c  are cnt shared l
8660: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ocks on the file
8670: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65  ..**.** Any atte
8680: 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75  mpt to lock or u
8690: 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72  nlock a file fir
86a0: 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f  st checks the lo
86b0: 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  cking.** structu
86c0: 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29  re.  The fcntl()
86d0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20   system call is 
86e0: 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20  only invoked to 
86f0: 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20  set a .** POSIX 
8700: 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65  lock if the inte
8710: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74  rnal lock struct
8720: 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ure transitions 
8730: 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63  between.** a loc
8740: 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63  ked and an unloc
8750: 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ked state..**.**
8760: 20 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72   But wait:  ther
8770: 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70  e are yet more p
8780: 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53  roblems with POS
8790: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
87a0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20  s..**.** If you 
87b0: 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  close a file des
87c0: 63 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69  criptor that poi
87d0: 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68  nts to a file th
87e0: 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a  at has locks,.**
87f0: 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68   all locks on th
8800: 61 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65  at file that are
8810: 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75   owned by the cu
8820: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72  rrent process ar
8830: 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20  e.** released.  
8840: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
8850: 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63  his problem, eac
8860: 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  h unixInodeInfo 
8870: 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61  object.** mainta
8880: 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  ins a count of t
8890: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e  he number of pen
88a0: 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ding locks on th
88b0: 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e  a inode..** When
88c0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   an attempt is m
88d0: 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20  ade to close an 
88e0: 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65  unixFile, if the
88f0: 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20  re are.** other 
8900: 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e  unixFile open on
8910: 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20   the same inode 
8920: 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67  that are holding
8930: 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c   locks, the call
8940: 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74  .** to close() t
8950: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
8960: 6f 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75  or is deferred u
8970: 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20  ntil all of the 
8980: 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20  locks clear..** 
8990: 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  The unixInodeInf
89a0: 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70  o structure keep
89b0: 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65  s a list of file
89c0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61   descriptors tha
89d0: 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20  t need to.** be 
89e0: 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20  closed and that 
89f0: 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28  list is walked (
8a00: 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65  and cleared) whe
8a10: 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a  n the last lock.
8a20: 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a  ** clears..**.**
8a30: 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f   Yet another pro
8a40: 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65  blem:  LinuxThre
8a50: 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20  ads do not play 
8a60: 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20  well with posix 
8a70: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e  locks..**.** Man
8a80: 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73  y older versions
8a90: 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68   of linux use th
8aa0: 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c  e LinuxThreads l
8ab0: 69 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a  ibrary which is.
8ac0: 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d  ** not posix com
8ad0: 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c  pliant.  Under L
8ae0: 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c  inuxThreads, a l
8af0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
8b00: 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f  hread.** A canno
8b10: 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72  t be modified or
8b20: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61   overridden by a
8b30: 20 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61   different threa
8b40: 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72  d B..** Only thr
8b50: 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79  ead A can modify
8b60: 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b   the lock.  Lock
8b70: 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20  ing behavior is 
8b80: 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68  correct.** if th
8b90: 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65  e appliation use
8ba0: 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69  s the newer Nati
8bb0: 76 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20  ve Posix Thread 
8bc0: 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a  Library (NPTL).*
8bd0: 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74  * on linux - wit
8be0: 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72  h NPTL a lock cr
8bf0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20  eated by thread 
8c00: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
8c10: 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61  ocks.** in threa
8c20: 64 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20  d B.  But there 
8c30: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
8c40: 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  w at compile-tim
8c50: 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61  e which.** threa
8c60: 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20  ding library is 
8c70: 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20  being used.  So 
8c80: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
8c90: 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f  to know at.** co
8ca0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68  mpile-time wheth
8cb0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64  er or not thread
8cc0: 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20   A can override 
8cd0: 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20  locks on thread 
8ce0: 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f  B..** One has to
8cf0: 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63   do a run-time c
8d00: 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72  heck to discover
8d10: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
8d20: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
8d30: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53  process..**.** S
8d40: 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75  QLite used to su
8d50: 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61  pport LinuxThrea
8d60: 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74  ds.  But support
8d70: 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64   for LinuxThread
8d80: 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64  s.** was dropped
8d90: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
8da0: 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20  version 3.7.0.  
8db0: 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c  SQLite will stil
8dc0: 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c  l work with.** L
8dd0: 69 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76  inuxThreads prov
8de0: 69 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68  ided that (1) th
8df0: 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74  ere is no more t
8e00: 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69  han one connecti
8e10: 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62  on .** per datab
8e20: 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
8e30: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64  same process and
8e40: 20 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f   (2) database co
8e50: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20  nnections.** do 
8e60: 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20  not move across 
8e70: 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  threads..*/../*.
8e80: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8e90: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8ea0: 73 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73  structure serves
8eb0: 20 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64   as the key used
8ec0: 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  .** to locate a 
8ed0: 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49  particular unixI
8ee0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
8ef0: 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46  .*/.struct unixF
8f00: 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20  ileId {.  dev_t 
8f10: 64 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  dev;            
8f20: 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20        /* Device 
8f30: 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53  number */.#if OS
8f40: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
8f50: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
8f60: 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65  *pId;  /* Unique
8f70: 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77   file ID for vxw
8f80: 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20  orks. */.#else. 
8f90: 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20   ino_t ino;     
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8fb0: 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  Inode number */.
8fc0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
8fd0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
8fe0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
8ff0: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
9000: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
9010: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72  en.** inode.  Or
9020: 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64  , on LinuxThread
9030: 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20  s, there is one 
9040: 6f 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75  of these structu
9050: 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20  res for.** each 
9060: 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20  inode opened by 
9070: 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a  each thread..**.
9080: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
9090: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
90a0: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
90b0: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e  tors, so each un
90c0: 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  ixFile.** struct
90d0: 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ure contains a p
90e0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
90f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
9100: 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a  ject and this.**
9110: 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20   object keeps a 
9120: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
9130: 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20  ber of unixFile 
9140: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a  pointing to it..
9150: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e  */.struct unixIn
9160: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75  odeInfo {.  stru
9170: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
9180: 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  leId;       /* T
9190: 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f  he lookup key */
91a0: 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20  .  int nShared; 
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
91d0: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c  SHARED locks hel
91e0: 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
91f0: 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20  char eFileLock; 
9200: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9210: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
9220: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
9230: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9240: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
9250: 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c  ;     /* An excl
9260: 75 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f  usive process lo
9270: 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20  ck is held */.  
9280: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
9290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69  /* Number of poi
92b0: 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74  nters to this st
92c0: 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69  ructure */.  uni
92d0: 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
92e0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  de;          /* 
92f0: 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  Shared memory as
9300: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
9310: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
9320: 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  t nLock;        
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9340: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
9350: 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b  anding file lock
9360: 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  s */.  UnixUnuse
9370: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
9380: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
9390: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
93a0: 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  s to close */.  
93b0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
93c0: 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  Next;           
93d0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75  /* List of all u
93e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
93f0: 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  ects */.  unixIn
9400: 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20  odeInfo *pPrev; 
9410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
9420: 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b  .... doubly link
9430: 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ed */.#if SQLITE
9440: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
9450: 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64  STYLE.  unsigned
9460: 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65   long long share
9470: 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41  dByte;  /* for A
9480: 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61  FP simulated sha
9490: 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64  red lock */.#end
94a0: 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  if.#if OS_VXWORK
94b0: 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b  S.  sem_t *pSem;
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53      /* Named POS
94e0: 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a  IX semaphore */.
94f0: 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b    char aSemName[
9500: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
9510: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61    /* Name of tha
9520: 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23  t semaphore */.#
9530: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
9540: 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75  A lists of all u
9550: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
9560: 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ects..*/.static 
9570: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69  unixInodeInfo *i
9580: 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  nodeList = 0;../
9590: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
95a0: 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45  ction - unixLogE
95b0: 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73  rrorAtLine(), is
95c0: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
95d0: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
95e0: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
95f0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
9600: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
9610: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
9620: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
9630: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
9640: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
9650: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
9660: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
9670: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9680: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
9690: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
96a0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
96b0: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
96c0: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
96d0: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
96e0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
96f0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
9700: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
9710: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
9720: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
9730: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
9740: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
9750: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
9760: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
9770: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9780: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
9790: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
97a0: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
97b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
97c0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
97d0: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
97e0: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
97f0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
9800: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
9810: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
9820: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
9830: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
9840: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
9850: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
9860: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
9870: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
9880: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
9890: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
98a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
98b0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
98c0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
98d0: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
98e0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
98f0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
9900: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
9910: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
9920: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
9930: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
9940: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
9950: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
9960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9970: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
9980: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
9990: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
99a0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
99d0: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
99e0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
99f0: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
9a00: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
9a10: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
9a20: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
9a30: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
9a40: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
9a50: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
9a60: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
9a70: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
9a80: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
9a90: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
9aa0: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
9ab0: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
9ac0: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
9ad0: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
9ae0: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
9af0: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
9b00: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
9b10: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
9b20: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
9b30: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
9b40: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
9b50: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
9b60: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
9b70: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
9b80: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
9b90: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
9ba0: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
9bb0: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
9bc0: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
9bd0: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
9be0: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
9bf0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
9c00: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
9c10: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
9c20: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
9c30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
9c40: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
9c50: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
9c60: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
9c70: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
9c80: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
9c90: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
9ca0: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
9cb0: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
9cc0: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
9cd0: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
9ce0: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
9cf0: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
9d00: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
9d10: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
9d20: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
9d30: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
9d40: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
9d50: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
9d60: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
9d70: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
9d80: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
9d90: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
9da0: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
9db0: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
9dc0: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
9dd0: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
9de0: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
9df0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
9e00: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
9e10: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
9e20: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
9e30: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
9e40: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
9e50: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
9e60: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
9e70: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
9e80: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
9e90: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
9ea0: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
9eb0: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
9ec0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
9ed0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
9ee0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
9ef0: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
9f00: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
9f10: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
9f20: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
9f30: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
9f40: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
9f50: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
9f60: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
9f70: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
9f80: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
9f90: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
9fa0: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
9fb0: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
9fc0: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
9fd0: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
9fe0: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
9ff0: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
a000: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
a010: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
a020: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
a030: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
a040: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
a050: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
a060: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
a070: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
a080: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
a090: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
a0a0: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
a0b0: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
a0c0: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
a0d0: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
a0e0: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
a0f0: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
a100: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
a110: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
a120: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
a130: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
a140: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
a150: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
a160: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
a170: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
a180: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
a190: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
a1a0: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
a1b0: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
a1c0: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
a1d0: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
a1e0: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
a1f0: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
a200: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
a210: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
a220: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
a230: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
a240: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
a250: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
a260: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
a270: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
a280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a290: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
a2a0: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
a2b0: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
a2c0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46  /*.** Set the pF
a2d0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20  ile->lastErrno. 
a2e0: 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   Do this in a su
a2f0: 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74  broutine as that
a300: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63   provides.** a c
a310: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
a320: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
a330: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
a340: 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72  oid storeLastErr
a350: 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  no(unixFile *pFi
a360: 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a  le, int error){.
a370: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a380: 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f  no = error;.}../
a390: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
a3a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
a3b0: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
a3c0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
a3d0: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
a3e0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
a3f0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
a400: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
a410: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a420: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a430: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
a440: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
a450: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
a460: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
a470: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
a480: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
a490: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
a4a0: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
a4b0: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
a4c0: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
a4d0: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
a4e0: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
a4f0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
a500: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
a510: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
a520: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
a530: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
a540: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
a550: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
a560: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
a570: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
a580: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
a590: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
a5a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a5b0: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
a5c0: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
a5d0: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
a5e0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
a5f0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
a600: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
a610: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
a620: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
a630: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
a640: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
a650: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
a660: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
a670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
a680: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
a690: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
a6a0: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
a6b0: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
a6c0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
a6d0: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
a6e0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
a6f0: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
a700: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
a710: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
a720: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
a730: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
a740: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a750: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
a760: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
a770: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
a780: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
a790: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
a7a0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
a7b0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a7c0: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
a7d0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a7e0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
a7f0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
a800: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
a810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
a820: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
a830: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a840: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
a850: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
a860: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a870: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
a880: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
a890: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
a8a0: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
a8b0: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
a8c0: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
a8d0: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
a8e0: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
a8f0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
a900: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
a910: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
a920: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
a930: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
a940: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
a950: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
a960: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
a970: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
a980: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
a990: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
a9a0: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
a9b0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
a9c0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
a9d0: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
a9e0: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
a9f0: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
aa00: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
aa10: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
aa20: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
aa30: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
aa40: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
aa50: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa70: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
aa80: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
aa90: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aab0: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
aac0: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
aad0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
aae0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
aaf0: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
ab00: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
ab10: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
ab20: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
ab30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
ab40: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
ab50: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
ab60: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ab70: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
ab80: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
ab90: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
aba0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
abb0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
abc0: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
abd0: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
abe0: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
abf0: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
ac00: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
ac10: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
ac20: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
ac30: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
ac40: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
ac50: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
ac60: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
ac70: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ac80: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
ac90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 45 4f 56  .#if defined(EOV
aca0: 45 52 46 4c 4f 57 29 20 26 26 20 64 65 66 69 6e  ERFLOW) && defin
acb0: 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ed(SQLITE_DISABL
acc0: 45 5f 4c 46 53 29 0a 20 20 20 20 69 66 28 20 70  E_LFS).    if( p
acd0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d  File->lastErrno=
ace0: 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74  =EOVERFLOW ) ret
acf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  urn SQLITE_NOLFS
ad00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
ad10: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
ad20: 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  ;.  }..#ifdef __
ad30: 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20  APPLE__.  /* On 
ad40: 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73  OS X on an msdos
ad50: 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65   filesystem, the
ad60: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73   inode number is
ad70: 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69   reported.  ** i
ad80: 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a  ncorrectly for z
ad90: 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20  ero-size files. 
ada0: 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36   See ticket #326
adb0: 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a  0.  To work.  **
adc0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
add0: 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65  blem (we conside
ade0: 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53  r it a bug in OS
adf0: 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a   X, not SQLite).
ae00: 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69    ** we always i
ae10: 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65  ncrease the file
ae20: 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72   size to 1 by wr
ae30: 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62  iting a single b
ae40: 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74  yte.  ** prior t
ae50: 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  o accessing the 
ae60: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54  inode number.  T
ae70: 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74  he one byte writ
ae80: 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41  ten is.  ** an A
ae90: 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74  SCII 'S' charact
aea0: 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61  er which also ha
aeb0: 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20  ppens to be the 
aec0: 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20  first byte.  ** 
aed0: 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66  in the header of
aee0: 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61   every SQLite da
aef0: 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73  tabase.  In this
af00: 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20   way, if there. 
af10: 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f   ** is a race co
af20: 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61  ndition such tha
af30: 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
af40: 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70   has already pop
af50: 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20  ulated.  ** the 
af60: 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68  first page of th
af70: 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64  e database, no d
af80: 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20  amage is done.. 
af90: 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75   */.  if( statbu
afa0: 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20  f.st_size==0 && 
afb0: 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20  (pFile->fsFlags 
afc0: 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  & SQLITE_FSFLAGS
afd0: 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b  _IS_MSDOS)!=0 ){
afe0: 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73  .    do{ rc = os
aff0: 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31  Write(fd, "S", 1
b000: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
b010: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
b020: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31  );.    if( rc!=1
b030: 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
b040: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b050: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65  errno);.      re
b060: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
b070: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
b080: 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73  = osFstat(fd, &s
b090: 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28  tatbuf);.    if(
b0a0: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
b0b0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
b0c0: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
b0d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
b0e0: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
b0f0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d   }.#endif..  mem
b100: 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20  set(&fileId, 0, 
b110: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
b120: 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20  .  fileId.dev = 
b130: 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a  statbuf.st_dev;.
b140: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
b150: 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46   fileId.pId = pF
b160: 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a  ile->pId;.#else.
b170: 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73    fileId.ino = s
b180: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
b190: 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d  endif.  pInode =
b1a0: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68   inodeList;.  wh
b1b0: 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d  ile( pInode && m
b1c0: 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26  emcmp(&fileId, &
b1d0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20  pInode->fileId, 
b1e0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20  sizeof(fileId)) 
b1f0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ){.    pInode = 
b200: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
b210: 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d   }.  if( pInode=
b220: 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65  =0 ){.    pInode
b230: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
b240: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e  c64( sizeof(*pIn
b250: 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ode) );.    if( 
b260: 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  pInode==0 ){.   
b270: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b280: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
b290: 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49   }.    memset(pI
b2a0: 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  node, 0, sizeof(
b2b0: 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d  *pInode));.    m
b2c0: 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66  emcpy(&pInode->f
b2d0: 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20  ileId, &fileId, 
b2e0: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
b2f0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
b300: 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64  f = 1;.    pInod
b310: 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65  e->pNext = inode
b320: 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65  List;.    pInode
b330: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
b340: 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29   if( inodeList )
b350: 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65   inodeList->pPre
b360: 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20  v = pInode;.    
b370: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
b380: 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
b390: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b   pInode->nRef++;
b3a0: 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20  .  }.  *ppInode 
b3b0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75  = pInode;.  retu
b3c0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
b3d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
b3e0: 55 45 20 69 66 20 70 46 69 6c 65 20 68 61 73 20  UE if pFile has 
b3f0: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20  been renamed or 
b400: 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20 69  unlinked since i
b410: 74 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  t was first open
b420: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
b430: 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 75  t fileHasMoved(u
b440: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
b450: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
b460: 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
b470: 70 49 6e 6f 64 65 21 3d 30 20 26 26 20 70 46 69  pInode!=0 && pFi
b480: 6c 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e  le->pId!=pFile->
b490: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70  pInode->fileId.p
b4a0: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  Id;.#else.  stru
b4b0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 72  ct stat buf;.  r
b4c0: 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e  eturn pFile->pIn
b4d0: 6f 64 65 21 3d 30 20 26 26 0a 20 20 20 20 20 20  ode!=0 &&.      
b4e0: 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a  (osStat(pFile->z
b4f0: 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30 20 7c  Path, &buf)!=0 |
b500: 7c 20 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46  | buf.st_ino!=pF
b510: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c  ile->pInode->fil
b520: 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66  eId.ino);.#endif
b530: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
b540: 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74   a unixFile that
b550: 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e 20   is a database. 
b560: 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c   Verify the foll
b570: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  owing:.**.** (1)
b580: 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
b590: 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20  y one hard link 
b5a0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28  on the file.** (
b5b0: 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  2) The file is n
b5c0: 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
b5d0: 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69  nk.** (3) The fi
b5e0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
b5f0: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
b600: 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20  ked.**.** Issue 
b610: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
b620: 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20  TE_WARNING,...) 
b630: 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79 74  messages if anyt
b640: 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68  hing is not righ
b650: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
b660: 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 75  d verifyDbFile(u
b670: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
b680: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
b690: 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  uf;.  int rc;.. 
b6a0: 20 2f 2a 20 54 68 65 73 65 20 76 65 72 69 66 69   /* These verifi
b6b0: 63 61 74 69 6f 6e 73 20 6f 63 63 75 72 73 20 66  cations occurs f
b6c0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
b6d0: 62 61 73 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  base only */.  i
b6e0: 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  f( pFile->ctrlFl
b6f0: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
b700: 4f 4c 4f 43 4b 20 29 20 72 65 74 75 72 6e 3b 0a  OLOCK ) return;.
b710: 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
b720: 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
b730: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
b740: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
b750: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
b760: 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20 64 62  "cannot fstat db
b770: 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69 6c 65   file %s", pFile
b780: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
b790: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b7a0: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20  buf.st_nlink==0 
b7b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
b7c0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
b7d0: 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65  G, "file unlinke
b7e0: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b7f0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b800: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b810: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
b820: 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71  link>1 ){.    sq
b830: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b840: 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69  _WARNING, "multi
b850: 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c  ple links to fil
b860: 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  e: %s", pFile->z
b870: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b880: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c  n;.  }.  if( fil
b890: 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29  eHasMoved(pFile)
b8a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b8b0: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
b8c0: 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65  NG, "file rename
b8d0: 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73  d while open: %s
b8e0: 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
b8f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
b900: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  }.}.../*.** This
b910: 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
b920: 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
b930: 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
b940: 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
b950: 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
b960: 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
b970: 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
b980: 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
b990: 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
b9a0: 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
b9b0: 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
b9c0: 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
b9d0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
b9e0: 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
b9f0: 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
ba00: 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
ba10: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
ba20: 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
ba30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
ba40: 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
ba50: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
ba60: 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
ba70: 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Out){.  int rc =
ba80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
ba90: 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
baa0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
bab0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
bac0: 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
bad0: 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
bae0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
baf0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
bb00: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
bb10: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
bb20: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
bb30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
bb40: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
bb50: 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
bb60: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
bb70: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
bb80: 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  reads */..  /* C
bb90: 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
bba0: 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
bbb0: 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
bbc0: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
bbd0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
bbe0: 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
bbf0: 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
bc00: 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   = 1;.  }..  /* 
bc10: 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
bc20: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
bc30: 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
bc40: 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47  */.#ifndef __DJG
bc50: 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73 65  PP__.  if( !rese
bc60: 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d 3e  rved && !pFile->
bc70: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
bc80: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72 75  Lock ){.    stru
bc90: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
bca0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
bcb0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
bcc0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
bcd0: 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a 20  RESERVED_BYTE;. 
bce0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
bcf0: 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  1;.    lock.l_ty
bd00: 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20  pe = F_WRLCK;.  
bd10: 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 46    if( osFcntl(pF
bd20: 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  ile->h, F_GETLK,
bd30: 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20   &lock) ){.     
bd40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
bd50: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
bd60: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
bd70: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
bd80: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20  , errno);.    } 
bd90: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
bda0: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
bdb0: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
bdc0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
bdd0: 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c  endif.  .  unixL
bde0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
bdf0: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
be00: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
be10: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
be20: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
be30: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
be40: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
be50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
be60: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
be70: 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f   a system-lock o
be80: 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65  n the file pFile
be90: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a  .  The lock is .
bea0: 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ** described by 
beb0: 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pLock..**.** If 
bec0: 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70  the pFile was op
bed0: 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
bee0: 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20  from unix-excl, 
bef0: 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f  then the only lo
bf00: 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69  ck.** ever obtai
bf10: 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73  ned is an exclus
bf20: 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74  ive lock, and it
bf30: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61   is obtained exa
bf40: 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ctly once.** the
bf50: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
bf60: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
bf70: 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65  d.  All subseque
bf80: 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e  nt system lockin
bf90: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  g.** operations 
bfa0: 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20  become no-ops.  
bfb0: 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  Locking operatio
bfc0: 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  ns still happen 
bfd0: 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69  internally,.** i
bfe0: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64  n order to coord
bff0: 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74  inate access bet
c000: 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61  ween separate da
c010: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
c020: 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ns.** within thi
c030: 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61  s process, but a
c040: 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61  ll of that is ha
c050: 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  ndled in memory 
c060: 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  and the.** opera
c070: 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73  ting system does
c080: 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65   not participate
c090: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
c0a0: 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d  ction is a pass-
c0b0: 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c  through to fcntl
c0c0: 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69  (F_SETLK) if pFi
c0d0: 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61  le is using.** a
c0e0: 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61  ny VFS other tha
c0f0: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72  n "unix-excl" or
c100: 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65   if pFile is ope
c110: 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63  ned on "unix-exc
c120: 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61  l".** and is rea
c130: 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65  d-only..**.** Ze
c140: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
c150: 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c  f the call compl
c160: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
c170: 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61  y, or -1 if a ca
c180: 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29  ll.** to fcntl()
c190: 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20   fails. In this 
c1a0: 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73  case, errno is s
c1b0: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
c1c0: 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a   (by fcntl())..*
c1d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
c1e0: 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69  xFileLock(unixFi
c1f0: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63  le *pFile, struc
c200: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b  t flock *pLock){
c210: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
c220: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
c230: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
c240: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
c250: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
c260: 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
c270: 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  e!=0 );.  if( (p
c280: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
c290: 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  & (UNIXFILE_EXCL
c2a0: 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59  |UNIXFILE_RDONLY
c2b0: 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43  ))==UNIXFILE_EXC
c2c0: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  L ){.    if( pIn
c2d0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c2e0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
c2f0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
c300: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c310: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
c320: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
c330: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
c340: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c350: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
c360: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
c370: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
c380: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
c390: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
c3a0: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
c3b0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c3c0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
c3d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20  .      if( rc<0 
c3e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c3f0: 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63     pInode->bProc
c400: 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  essLock = 1;.   
c410: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
c420: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
c430: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
c440: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
c450: 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69  rc = osFcntl(pFi
c460: 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20  le->h, F_SETLK, 
c470: 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65  pLock);.  }.  re
c480: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
c490: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
c4a0: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
c4b0: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
c4c0: 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
c4d0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
c4e0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
c4f0: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
c500: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
c510: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
c520: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
c530: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
c540: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
c550: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
c560: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
c570: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
c580: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
c590: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
c5a0: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
c5b0: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
c5c0: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
c5d0: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
c5e0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
c5f0: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
c600: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
c610: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
c620: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
c630: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
c640: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
c650: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
c660: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
c670: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
c680: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
c690: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
c6a0: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
c6b0: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
c6c0: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
c6d0: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
c6e0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
c6f0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
c700: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
c710: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
c720: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
c730: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
c740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c750: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
c760: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
c770: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
c780: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
c790: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
c7a0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
c7b0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
c7c0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
c7d0: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
c7e0: 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ock){.  /* The f
c7f0: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
c800: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
c810: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
c820: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
c830: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
c840: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
c850: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
c860: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
c870: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
c880: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
c890: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
c8a0: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
c8b0: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
c8c0: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
c8d0: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
c8e0: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
c8f0: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
c900: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
c910: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
c920: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
c930: 77 69 74 68 20 57 69 6e 64 6f 77 73 39 35 20 73  with Windows95 s
c940: 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65  ystems simultane
c950: 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73  ously.  ** acces
c960: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
c970: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20  tabase file, in 
c980: 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65  case that is eve
c990: 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a  r required..  **
c9a0: 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65  .  ** Symbols de
c9b0: 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e  fined in os.h in
c9c0: 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e  dentify the 'pen
c9d0: 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74  ding byte' and t
c9e0: 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a  he 'reserved.  *
c9f0: 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69  * byte', each si
ca00: 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65  ngle bytes at we
ca10: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73  ll known offsets
ca20: 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65  , and the 'share
ca30: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
ca40: 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35  e', a range of 5
ca50: 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65  10 bytes at a we
ca60: 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e  ll known offset.
ca70: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62  .  **.  ** To ob
ca80: 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
ca90: 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ck, a read-lock 
caa0: 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  is obtained on t
cab0: 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a  he 'pending.  **
cac0: 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73   byte'.  If this
cad0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
cae0: 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e  'shared byte ran
caf0: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
cb00: 65 64 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ed.  ** and the 
cb10: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e  lock on the 'pen
cb20: 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61  ding byte' relea
cb30: 73 65 64 2e 20 20 28 4c 65 67 61 63 79 20 6e 6f  sed.  (Legacy no
cb40: 74 65 3a 20 20 57 68 65 6e 0a 20 20 2a 2a 20 53  te:  When.  ** S
cb50: 51 4c 69 74 65 20 77 61 73 20 66 69 72 73 74 20  QLite was first 
cb60: 64 65 76 65 6c 6f 70 65 64 2c 20 57 69 6e 64 6f  developed, Windo
cb70: 77 73 39 35 20 73 79 73 74 65 6d 73 20 77 65 72  ws95 systems wer
cb80: 65 20 73 74 69 6c 6c 20 76 65 72 79 20 63 6f 6d  e still very com
cb90: 6d 6f 6e 2c 0a 20 20 2a 2a 20 61 6e 64 20 57 69  mon,.  ** and Wi
cba0: 64 6e 6f 77 73 39 35 20 6c 61 63 6b 73 20 61 20  dnows95 lacks a 
cbb0: 73 68 61 72 65 64 2d 6c 6f 63 6b 20 63 61 70 61  shared-lock capa
cbc0: 62 69 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 20 57  bility.  So on W
cbd0: 69 6e 64 6f 77 73 39 35 2c 20 61 0a 20 20 2a 2a  indows95, a.  **
cbe0: 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c 79   single randomly
cbf0: 20 73 65 6c 65 63 74 65 64 20 62 79 20 66 72 6f   selected by fro
cc00: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
cc10: 74 65 20 72 61 6e 67 65 27 20 69 73 20 6c 6f 63  te range' is loc
cc20: 6b 65 64 2e 0a 20 20 2a 2a 20 57 69 6e 64 6f 77  ked..  ** Window
cc30: 73 39 35 20 69 73 20 6e 6f 77 20 70 72 65 74 74  s95 is now prett
cc40: 79 20 6d 75 63 68 20 65 78 74 69 6e 63 74 2c 20  y much extinct, 
cc50: 62 75 74 20 74 68 69 73 20 77 6f 72 6b 2d 61 72  but this work-ar
cc60: 6f 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  ound for the.  *
cc70: 2a 20 6c 61 63 6b 20 6f 66 20 73 68 61 72 65 64  * lack of shared
cc80: 2d 6c 6f 63 6b 73 20 6f 6e 20 57 69 6e 64 6f 77  -locks on Window
cc90: 73 39 35 20 6c 69 76 65 73 20 6f 6e 2c 20 66 6f  s95 lives on, fo
cca0: 72 20 62 61 63 6b 77 61 72 64 73 0a 20 20 2a 2a  r backwards.  **
ccb0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 29   compatibility.)
ccc0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
ccd0: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
cce0: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
ccf0: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
cd00: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
cd10: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
cd20: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
cd30: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
cd40: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
cd50: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
cd60: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
cd70: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
cd80: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
cd90: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
cda0: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
cdb0: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
cdc0: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
cdd0: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
cde0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
cdf0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
ce00: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
ce10: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
ce20: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
ce30: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
ce40: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
ce50: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
ce60: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
ce70: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
ce80: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
ce90: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
cea0: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
ceb0: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
cec0: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
ced0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
cee0: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
cef0: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
cf00: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
cf10: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
cf20: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
cf30: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
cf40: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
cf50: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
cf60: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
cf70: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
cf80: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
cf90: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
cfa0: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
cfb0: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
cfc0: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
cfd0: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
cfe0: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
cff0: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
d000: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
d010: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
d020: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
d030: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
d040: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
d050: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
d060: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
d070: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
d080: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
d090: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
d0a0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
d0b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
d0c0: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
d0d0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
d0e0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
d0f0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
d100: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
d110: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
d120: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
d130: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
d140: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
d150: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
d160: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
d170: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
d180: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
d190: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
d1a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
d1b0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
d1c0: 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
d1d0: 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
d1e0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
d1f0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
d200: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
d210: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
d220: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
d230: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
d240: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
d250: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
d260: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
d270: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
d280: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
d290: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
d2a0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
d2b0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
d2c0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
d2d0: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
d2e0: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
d2f0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
d300: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
d310: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
d320: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
d330: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
d340: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d350: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
d360: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
d370: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
d380: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
d390: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
d3a0: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
d3b0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
d3c0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
d3d0: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
d3e0: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
d3f0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
d400: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
d410: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
d420: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
d430: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
d440: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
d450: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
d460: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
d470: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d480: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
d490: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
d4a0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
d4b0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
d4c0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
d4d0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d4e0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
d4f0: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
d500: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d510: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d520: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d530: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d540: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d550: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d560: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d570: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d580: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d590: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d5a0: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d5b0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d5c0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d5d0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d5e0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d5f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d600: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d610: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d620: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d630: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d640: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d650: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d660: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d670: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d680: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d690: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d6a0: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d6b0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d6c0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d6d0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d6e0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d6f0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d700: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d710: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d720: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d730: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d740: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d750: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d760: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d770: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d780: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d790: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d7a0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d7b0: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d7c0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d7d0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d7e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d7f0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d800: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d810: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d820: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d830: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d840: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d850: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d860: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d870: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d880: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d890: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d8a0: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d8b0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d8c0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d8d0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d8e0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d8f0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d900: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d910: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d920: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d930: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d940: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d950: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d960: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d970: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d980: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d990: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d9a0: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d9b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d9c0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d9d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d9e0: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d9f0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
da00: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
da10: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
da20: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
da30: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
da40: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
da50: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
da60: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
da70: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
da80: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
da90: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
daa0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
dab0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
dac0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
dad0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
dae0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
daf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
db00: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
db10: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
db20: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
db30: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
db40: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
db50: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
db60: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
db70: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
db80: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
db90: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
dba0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
dbb0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
dbc0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
dbd0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
dbe0: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
dbf0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
dc00: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
dc10: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
dc20: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
dc30: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
dc40: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
dc50: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
dc60: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
dc70: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
dc80: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
dc90: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
dca0: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
dcb0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
dcc0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
dcd0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
dce0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
dcf0: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
dd00: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
dd10: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
dd20: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
dd30: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
dd40: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
dd50: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
dd60: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
dd70: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
dd80: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
dd90: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
dda0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ddb0: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
ddc0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
ddd0: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
dde0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
ddf0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
de00: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
de10: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
de20: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
de30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
de40: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
de50: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
de60: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
de70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
de80: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
de90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
dea0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
deb0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
dec0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
ded0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
dee0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
def0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
df00: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
df10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
df20: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
df30: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
df40: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
df50: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
df60: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
df70: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
df80: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
df90: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
dfa0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
dfb0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
dfc0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
dfd0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
dfe0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
dff0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
e000: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
e010: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
e020: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
e030: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
e040: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
e050: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
e060: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
e070: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
e080: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
e090: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e0a0: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
e0b0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
e0c0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
e0d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
e0e0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
e0f0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e100: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
e110: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
e120: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
e130: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
e140: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
e150: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
e160: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e170: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
e180: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
e190: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
e1a0: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
e1b0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
e1c0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
e1d0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
e1e0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
e1f0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
e200: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
e210: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
e220: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e230: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
e240: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
e250: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
e260: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e270: 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
e280: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
e290: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
e2a0: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
e2b0: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
e2c0: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
e2d0: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
e2e0: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
e2f0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
e300: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
e310: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
e320: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
e330: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
e340: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
e350: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
e360: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
e370: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
e380: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
e390: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
e3a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
e3b0: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
e3c0: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
e3d0: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
e3e0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
e3f0: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
e400: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
e410: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
e420: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
e430: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
e440: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e450: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
e460: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
e470: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
e480: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
e490: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
e4a0: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
e4b0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
e4c0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
e4d0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
e4e0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
e4f0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
e500: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
e510: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
e520: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
e530: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
e540: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
e550: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e560: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
e570: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
e580: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
e590: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
e5a0: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
e5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e5c0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e5d0: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
e5e0: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
e5f0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e600: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
e610: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e620: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
e630: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
e640: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e650: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
e660: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
e670: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
e680: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
e690: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
e6a0: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
e6b0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
e6c0: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
e6d0: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
e6e0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
e6f0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e700: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e710: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e720: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
e730: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
e740: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
e750: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
e760: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
e770: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e780: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
e790: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
e7a0: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
e7b0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
e7c0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
e7d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e7e0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
e7f0: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
e800: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
e810: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
e820: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
e830: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
e840: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
e850: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
e860: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
e870: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
e880: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
e890: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
e8a0: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
e8b0: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
e8c0: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
e8d0: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
e8e0: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
e8f0: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
e900: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
e910: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
e920: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
e930: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
e940: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
e950: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
e960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
e970: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
e980: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e990: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
e9a0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
e9b0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e9c0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e9d0: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
e9e0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
e9f0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
ea00: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
ea10: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
ea20: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
ea30: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
ea40: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
ea50: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
ea60: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
ea70: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
ea80: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ea90: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
eaa0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
eab0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
eac0: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
ead0: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
eae0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
eaf0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
eb00: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
eb10: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
eb20: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
eb30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
eb40: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
eb50: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
eb60: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
eb70: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
eb80: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
eb90: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
eba0: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
ebb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
ebc0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
ebd0: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
ebe0: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
ebf0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
ec00: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
ec10: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
ec20: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
ec30: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
ec40: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
ec50: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
ec60: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
ec70: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
ec80: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
ec90: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
eca0: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
ecb0: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
ecc0: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
ecd0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ece0: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
ecf0: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
ed00: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
ed10: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
ed20: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
ed30: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
ed40: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
ed50: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
ed60: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
ed70: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
ed80: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
ed90: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
eda0: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
edb0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
edc0: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
edd0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
ede0: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
edf0: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
ee00: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
ee10: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
ee20: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
ee30: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
ee40: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
ee50: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
ee60: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
ee70: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
ee80: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
ee90: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
eea0: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
eeb0: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
eec0: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
eed0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
eee0: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
eef0: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
ef00: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
ef10: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
ef20: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
ef30: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
ef40: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
ef50: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
ef60: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
ef70: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
ef80: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ef90: 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69  OCK ){.#if !defi
efa0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
efb0: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
efc0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
efd0: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
efe0: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
eff0: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
f000: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
f010: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
f020: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
f030: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
f040: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
f050: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
f060: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
f070: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
f080: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
f090: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
f0a0: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
f0b0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
f0c0: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
f0d0: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
f0e0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
f0f0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
f100: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
f110: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f120: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
f130: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
f140: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
f150: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f160: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
f170: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f180: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f190: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
f1a0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f1b0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f1c0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
f1d0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
f1e0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
f1f0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
f200: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
f210: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
f230: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
f240: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
f250: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
f260: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
f270: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
f280: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
f290: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f2a0: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
f2b0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
f2c0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
f2d0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
f2e0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
f2f0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
f300: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
f310: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
f320: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
f330: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
f340: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
f350: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
f360: 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
f370: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
f380: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
f390: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f3a0: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f3b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f3c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f3d0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
f3e0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f3f0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f400: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f410: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
f420: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
f430: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
f440: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
f450: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
f460: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f470: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
f480: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
f490: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
f4a0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
f4b0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
f4c0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
f4d0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
f4e0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
f4f0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f500: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f510: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
f520: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
f530: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
f540: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f550: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
f560: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
f570: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
f580: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f590: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f5a0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f5b0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f5c0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
f5d0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
f5e0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
f5f0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f600: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
f620: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
f630: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
f640: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
f650: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
f660: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
f670: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
f680: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
f690: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
f6a0: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
f6b0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
f6c0: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
f6d0: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
f6e0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
f6f0: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
f700: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
f710: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
f720: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f730: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
f740: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
f750: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
f760: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
f770: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
f780: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
f790: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f7a0: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
f7b0: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
f7c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f7d0: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
f7e0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
f7f0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
f800: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
f810: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
f820: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f830: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
f840: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f850: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
f860: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f870: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f880: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
f890: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
f8a0: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
f8b0: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
f8c0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
f8d0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f8e0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f8f0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  k)==0 ){.      p
f900: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f910: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
f920: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f930: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f940: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f950: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f960: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
f970: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f980: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f990: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f9a0: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f9b0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f9c0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f9d0: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f9e0: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f9f0: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
fa00: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
fa10: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
fa20: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
fa30: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
fa40: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
fa50: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
fa60: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
fa70: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
fa80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
fa90: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
faa0: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
fab0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
fac0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
fad0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
fae0: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
faf0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
fb00: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
fb10: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
fb20: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
fb30: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
fb40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
fb50: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
fb60: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
fb70: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
fb80: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
fb90: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
fba0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
fbb0: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
fbc0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
fbd0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
fbe0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
fbf0: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
fc00: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
fc10: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
fc20: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
fc30: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
fc40: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
fc50: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
fc60: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
fc70: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
fc80: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
fc90: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
fca0: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
fcb0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
fcc0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
fcd0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
fce0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
fcf0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
fd00: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
fd10: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
fd20: 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63  }.  }..end_unloc
fd30: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
fd40: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
fd50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
fd60: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
fd70: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
fd80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fd90: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
fda0: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
fdb0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
fdc0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
fdd0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
fde0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
fdf0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
fe00: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
fe10: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
fe20: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
fe30: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
fe40: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
fe50: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
fe60: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
fe70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
fe80: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
fe90: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
fea0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
feb0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
fec0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
fed0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61  _MMAP_SIZE>0.  a
fee0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
fef0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
ff00: 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
ff10: 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
ff20: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
ff30: 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
ff40: 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
ff50: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
ff60: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
ff70: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
ff80: 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
ff90: 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
ffa0: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ;.static void un
ffb0: 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
ffc0: 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64  File *pFd);.#end
ffd0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
ffe0: 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
fff0: 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68   the parts of th
10000 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f  e "close file" o
10010 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d  peration .** com
10020 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
10030 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63  ng schemes. It c
10040 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74  loses the direct
10050 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20  ory and file.** 
10060 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79  handles, if they
10070 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20   are valid, and 
10080 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20  sets all fields 
10090 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
100a0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
100b0 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a  0..**.** It is *
100c0 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74  not* necessary t
100d0 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
100e0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
100f0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  ne is called,.**
10100 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73   even on VxWorks
10110 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20  .  A mutex will 
10120 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56  be acquired on V
10130 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a  xWorks by the.**
10140 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
10150 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e  ileId() routine.
10160 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
10170 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
10180 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
10190 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
101a0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
101b0 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  d;.#if SQLITE_MA
101c0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
101d0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
101e0 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ile);.#endif.  i
101f0 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
10200 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
10210 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
10220 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
10230 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
10240 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
10250 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
10260 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
10270 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
10280 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
10290 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
102a0 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
102b0 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
102c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
102d0 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
102e0 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
102f0 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
10300 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
10310 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49  fdef SQLITE_UNLI
10320 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20  NK_AFTER_CLOSE. 
10330 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
10340 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
10350 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f  _DELETE ){.    o
10360 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a  sUnlink(pFile->z
10370 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
10380 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a  e3_free(*(char**
10390 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  )&pFile->zPath);
103a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  .    pFile->zPat
103b0 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  h = 0;.  }.#endi
103c0 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
103d0 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
103e0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
103f0 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
10400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
10410 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  le->pUnused);.  
10420 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
10430 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
10440 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
10450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10460 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
10470 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
10480 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
10490 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
104a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
104b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
104c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
104d0 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69  id;.  verifyDbFi
104e0 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69  le(pFile);.  uni
104f0 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
10500 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  OCK);.  unixEnte
10510 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
10520 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20  unixFile.pInode 
10530 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
10540 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  here. Otherwise,
10550 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f   a different clo
10560 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  se.  ** routine 
10570 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  (e.g. nolockClos
10580 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61  e()) would be ca
10590 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  lled instead..  
105a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
105b0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
105c0 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49  k>0 || pFile->pI
105d0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
105e0 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41  ck==0 );.  if( A
105f0 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e  LWAYS(pFile->pIn
10600 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70  ode) && pFile->p
10610 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
10620 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10630 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
10640 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
10650 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
10660 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
10670 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
10680 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
10690 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
106a0 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
106b0 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
106c0 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
106d0 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
106e0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
106f0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
10700 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
10710 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
10720 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
10730 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
10740 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ile);.  }.  rele
10750 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
10760 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  le);.  rc = clos
10770 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10780 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
10790 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
107a0 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
107b0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
107c0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
107d0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
107e0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
107f0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10840 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
10850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10890 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108b0 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
108c0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
108f0 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
10900 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
10910 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
10920 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
10930 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
10940 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
10950 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
10960 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
10970 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
10980 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
10990 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
109a0 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
109b0 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
109c0 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
109d0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
109e0 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
109f0 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
10a00 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
10a10 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
10a20 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
10a30 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
10a40 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
10a50 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
10a60 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
10a70 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
10a80 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
10a90 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
10aa0 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
10ab0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
10ac0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
10ad0 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
10ae0 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
10af0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
10b00 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
10b10 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
10b20 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
10b30 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
10b40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
10b50 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
10b60 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
10b70 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
10b80 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
10b90 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
10ba0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
10bb0 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
10bc0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
10bd0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
10be0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
10bf0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52  NotUsed, int *pR
10c00 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
10c10 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
10c20 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
10c30 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
10c40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
10c50 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
10c60 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
10c70 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
10c80 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
10c90 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
10ca0 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
10cb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10cc0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
10cd0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
10ce0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
10cf0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
10d00 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10d10 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10d20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10d30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10d40 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
10d50 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
10d60 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
10d70 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10d80 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
10d90 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10da0 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
10dc0 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
10dd0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e40 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
10e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e90 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
10eb0 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
10ec0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
10ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ee0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
10ef0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
10f00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
10f10 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e 63  ses the existenc
10f20 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  e of separate lo
10f30 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61  ck.** files (rea
10f40 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29  lly a directory)
10f50 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
10f60 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
10f70 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a  se.  This works.
10f80 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74  ** on just about
10f90 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
10fa0 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
10fb0 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
10fc0 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
10fd0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
10fe0 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
10ff0 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
11000 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
11010 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
11020 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
11030 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
11040 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
11050 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
11060 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
11070 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
11080 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
11090 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
110a0 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
110b0 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
110c0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
110d0 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
110e0 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
110f0 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
11100 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
11110 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
11120 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
11130 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
11140 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
11150 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
11160 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
11170 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62  y creating a sub
11180 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65  directory in the
11190 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
111a0 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  as.** the databa
111b0 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
111c0 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
111d0 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
111e0 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
111f0 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   The existence o
11200 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  f a lock directo
11210 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  ry implies an EX
11220 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
11230 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b  ll other.** lock
11240 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
11250 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
11260 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
11270 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
11280 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
11290 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
112a0 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
112b0 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
112c0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
112d0 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  * lock directory
112e0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54  ..*/.#define DOT
112f0 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f  LOCK_SUFFIX ".lo
11300 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ck"../*.** This 
11310 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
11320 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
11330 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
11340 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
11350 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
11360 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
11370 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
11380 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
11390 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
113a0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
113b0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
113c0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
113d0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
113e0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
113f0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
11400 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
11410 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11420 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
11430 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65  **.** In dotfile
11440 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72   locking, either
11450 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f   a lock exists o
11460 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20  r it does not.  
11470 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61  So in this.** va
11480 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b  riation of Check
11490 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20  ReservedLock(), 
114a0 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
114b0 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c  to true if any l
114c0 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f  ock.** is held o
114d0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66  n the file and f
114e0 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65  alse if the file
114f0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f   is unlocked..*/
11500 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11510 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
11520 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11530 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11540 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
11550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11560 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
11570 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11580 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11590 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
115a0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
115b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
115c0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
115d0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
115e0 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65 72 76  File );.  reserv
115f0 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 28 63  ed = osAccess((c
11600 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
11610 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11620 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41  , 0)==0;.  OSTRA
11630 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11640 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
11650 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11660 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
11670 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11680 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11690 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
116a0 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
116b0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
116c0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
116d0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
116e0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
116f0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
11700 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11710 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11720 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11730 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11740 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11750 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11760 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11770 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11780 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11790 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
117a0 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
117b0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
117c0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
117d0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
117e0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
117f0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
11800 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11810 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11820 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11830 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11840 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11850 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11860 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11870 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11880 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11890 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
118a0 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
118b0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
118c0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
118d0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
118e0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
118f0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11900 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11910 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11920 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11930 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11940 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11950 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11960 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11970 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11980 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11990 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
119a0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
119b0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
119c0 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
119d0 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
119e0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
119f0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
11a00 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
11a10 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
11a20 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11a30 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11a40 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11a50 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11a60 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11a70 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
11a80 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11a90 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
11aa0 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
11ab0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
11ac0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
11ad0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11ae0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
11af0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
11b00 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
11b10 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
11b20 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
11b30 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
11b40 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
11b50 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
11b60 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
11b70 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11b80 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
11b90 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11ba0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
11bb0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
11bc0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
11bd0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
11be0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
11bf0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
11c00 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
11c10 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
11c20 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
11c30 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
11c40 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11c50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11c60 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11c70 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11c80 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
11c90 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
11ca0 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
11cb0 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
11cc0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
11cd0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
11ce0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
11cf0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
11d00 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
11d10 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
11d20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11d30 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11d40 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11d50 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11d60 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11d70 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
11d80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11d90 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
11da0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
11db0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
11dc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
11de0 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
11df0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
11e00 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
11e10 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11e20 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11e30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11e40 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11e50 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11e60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11e70 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
11e80 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
11e90 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
11ea0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
11eb0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
11ec0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
11ed0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
11ee0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
11ef0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
11f00 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
11f10 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
11f20 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11f30 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
11f40 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
11f50 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
11f60 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
11f70 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
11f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
11f90 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
11fa0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11fb0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
11fc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11fd0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11fe0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
11ff0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
12000 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
12010 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
12020 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12030 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
12040 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
12050 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
12060 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12070 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
12080 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12090 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
120a0 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
120b0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
120c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
120d0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
120e0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
120f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12100 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
12110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12120 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
12130 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
12140 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
12150 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
12160 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
12170 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
12180 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
12190 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
121a0 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
121b0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
121c0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
121d0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
121e0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
121f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12200 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
12210 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
12220 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
12230 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
12240 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
12250 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
12260 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
12270 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
12280 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
12290 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
122a0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
122b0 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e  f( tErrno==ENOEN
122c0 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  T ){.      rc = 
122d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
122e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
122f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12300 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
12310 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
12320 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
12330 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
12340 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
12350 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
12360 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
12370 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12380 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
12390 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
123a0 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
123b0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
123c0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
123d0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
123e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
123f0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
12400 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
12410 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
12420 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f  id!=0 );.  dotlo
12430 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
12440 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
12450 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
12460 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
12470 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
12480 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a  File(id);.}./***
12490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
124a0 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
124b0 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
124c0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
124d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
124e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
124f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
12530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12590 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
125a0 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
125b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
125c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
125d0 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
125e0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
125f0 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
12600 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
12610 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
12620 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
12630 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
12640 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
12650 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
12660 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
12670 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
12680 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
12690 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
126a0 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
126b0 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
126c0 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
126d0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
126e0 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
126f0 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
12700 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
12710 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
12720 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
12730 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
12740 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
12750 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
12760 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
12770 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
12780 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
12790 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
127a0 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
127b0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
127c0 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
127d0 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c  d off.*/.#if SQL
127e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
127f0 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
12800 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
12810 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
12820 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
12830 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
12840 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
12850 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
12860 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
12870 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
12880 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
12890 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
128a0 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
128b0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
128c0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
128d0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
128e0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
128f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12900 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12910 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12920 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12930 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12940 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
12950 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
12960 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
12970 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
12980 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
12990 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
129a0 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
129b0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
129c0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
129d0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
129e0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
129f0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
12a00 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12a10 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
12a20 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
12a30 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12a40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12a50 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
12a60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12a70 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12a80 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12a90 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12aa0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
12ab0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
12ac0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
12ad0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
12ae0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
12af0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
12b00 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
12b10 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
12b20 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
12b30 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
12b40 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12b50 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
12b60 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
12b70 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
12b80 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
12b90 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
12ba0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
12bb0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
12bc0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
12bd0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
12be0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
12bf0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
12c00 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12c10 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
12c20 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
12c30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
12c40 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
12c50 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
12c60 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
12c70 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12c80 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
12c90 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
12ca0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12cb0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
12cc0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
12cd0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
12ce0 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
12cf0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
12d00 20 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c   .        storeL
12d10 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12d20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
12d30 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
12d40 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
12d50 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12d60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12d70 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12d80 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
12d90 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
12da0 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
12db0 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
12dc0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12dd0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
12de0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
12df0 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
12e00 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
12e10 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
12e20 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12e30 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
12e40 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12e50 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
12e60 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12e70 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66  LOCK %d %d %d (f
12e80 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12e90 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
12ea0 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ));..#ifdef SQLI
12eb0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
12ec0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
12ed0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
12ee0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
12ef0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
12f00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12f10 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d   reserved=1;.  }
12f20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12f30 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12f40 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12f50 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12f60 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12f80 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12f90 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12fa0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12fb0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12fc0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12fd0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12fe0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12ff0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
13000 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
13010 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
13020 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
13030 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
13040 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
13050 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
13060 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
13070 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
13080 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
13090 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
130a0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
130b0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
130c0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
130d0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
130e0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
130f0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
13100 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
13110 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
13120 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
13130 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
13140 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
13150 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
13160 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
13170 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
13180 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
13190 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
131a0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
131b0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
131c0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
131d0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
131e0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
131f0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
13200 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
13210 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
13220 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c  CLUSIVE.**.** fl
13230 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c  ock() only reall
13240 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
13250 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
13260 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
13270 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
13280 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
13290 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
132a0 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
132b0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
132c0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
132d0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
132e0 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
132f0 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
13300 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
13310 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
13320 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
13330 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
13340 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
13350 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
13360 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
13370 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
13380 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
13390 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74   flockLock(sqlit
133a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
133b0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
133c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
133d0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
133e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
133f0 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
13400 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
13410 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
13420 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
13430 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
13440 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
13450 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
13460 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
13470 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
13480 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
13490 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
134a0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
134b0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
134c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
134d0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
134e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
134f0 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75  */.  .  if (robu
13500 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
13510 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
13520 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
13530 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13540 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
13550 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
13560 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13570 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13580 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13590 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
135a0 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
135b0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
135c0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
135d0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
135e0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  no);.    }.  } e
135f0 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
13600 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
13610 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
13620 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  */.    pFile->eF
13630 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13640 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ock;.  }.  OSTRA
13650 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
13660 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22  %s %s (flock)\n"
13670 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
13680 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
13690 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72  ), .           r
136a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
136b0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
136c0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
136d0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
136e0 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
136f0 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
13700 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
13710 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
13720 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
13730 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13740 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13750 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
13760 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
13770 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
13780 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
13790 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
137a0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
137b0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
137c0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
137d0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
137e0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
137f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
13800 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
13810 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
13820 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
13830 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
13840 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
13850 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13860 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13870 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
13880 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13890 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
138a0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
138b0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
138c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61  File*)id;.  .  a
138d0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
138e0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
138f0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
13900 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c   pid=%d (flock)\
13910 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
13920 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
13930 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13940 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
13950 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
13960 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
13970 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13980 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13990 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
139a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
139b0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
139c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
139d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
139e0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
139f0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
13a00 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
13a10 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
13a20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13a30 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
13a40 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13a50 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
13a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13a70 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
13a80 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
13a90 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75  k. */.  if( robu
13aa0 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
13ab0 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23  h, LOCK_UN) ){.#
13ac0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
13ad0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13ae0 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e  RRORS.    return
13af0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
13b00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13b10 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13b20 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74  RRORS */.    ret
13b30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13b40 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  _UNLOCK;.  }else
13b50 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13b60 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
13b70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13b80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
13b90 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
13ba0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13bb0 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
13bc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
13bd0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
13be0 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  );.  flockUnlock
13bf0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
13c00 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
13c10 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
13c20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13c30 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13c40 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
13c50 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
13c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13c70 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
13c80 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ca0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
13cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13cf0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
13d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d40 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13d60 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
13d70 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
13d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d90 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
13da0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
13db0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
13dc0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
13dd0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
13de0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
13df0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
13e00 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
13e10 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
13e20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
13e30 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
13e40 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
13e50 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
13e60 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
13e70 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
13e80 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
13e90 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
13ea0 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
13eb0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
13ec0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
13ed0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
13ee0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
13ef0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13f00 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13f10 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13f20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13f30 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13f40 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13f50 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13f60 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13f70 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
13f80 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
13f90 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
13fa0 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
13fb0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
13fc0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
13fd0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
13fe0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
13ff0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
14000 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
14010 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
14020 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63  tic int semXChec
14030 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
14040 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
14050 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
14060 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14070 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
14080 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
14090 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
140a0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
140b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
140c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
140d0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
140e0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
140f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14100 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
14110 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
14120 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
14130 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
14140 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
14150 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
14160 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
14170 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
14180 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
14190 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
141a0 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
141b0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
141c0 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
141d0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
141e0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
141f0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
14200 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
14210 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
14220 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
14230 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
14240 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
14250 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14260 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14270 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14280 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14290 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  LOCK);.        s
142a0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
142b0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
142c0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
142d0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
142e0 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
142f0 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
14300 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
14310 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
14320 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14330 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
14340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
14350 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
14360 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
14370 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
14380 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
14390 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
143a0 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
143b0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
143c0 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
143d0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
143e0 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
143f0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
14400 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14410 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
14420 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
14430 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
14440 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
14450 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
14460 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
14470 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
14480 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
14490 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
144a0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
144b0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
144c0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
144d0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
144e0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
144f0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
14500 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14510 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14520 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14530 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14540 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14550 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14560 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14570 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14580 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14590 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
145a0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
145b0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
145c0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
145d0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
145e0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
145f0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
14600 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14610 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14620 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14630 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14640 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14650 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14660 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14670 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14680 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14690 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
146a0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
146b0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
146c0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
146d0 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
146e0 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
146f0 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
14700 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
14710 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
14720 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
14730 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
14740 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
14750 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
14760 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
14770 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
14780 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
14790 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
147a0 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
147b0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
147c0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
147d0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
147e0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
147f0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
14800 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14810 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14820 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14830 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65   semXLock(sqlite
14840 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14850 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14860 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14870 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14880 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14890 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
148a0 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
148b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
148c0 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
148d0 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
148e0 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
148f0 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
14900 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
14910 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
14920 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
14930 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
14940 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
14950 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14960 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
14970 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
14980 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14990 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
149a0 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
149b0 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
149c0 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
149d0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
149e0 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
149f0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
14a00 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
14a10 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
14a30 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
14a40 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
14a50 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
14a60 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14a70 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
14a80 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
14a90 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
14aa0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
14ab0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
14ac0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
14ad0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
14ae0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
14af0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
14b00 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
14b10 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
14b20 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
14b30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
14b40 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
14b50 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
14b60 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
14b70 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
14b80 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
14b90 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14ba0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
14bb0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
14bc0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
14bd0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14be0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
14bf0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
14c00 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14c10 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14c20 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
14c30 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
14c40 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
14c50 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
14c60 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14c70 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14c80 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14c90 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
14ca0 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
14cb0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
14cc0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
14cd0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
14ce0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
14cf0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
14d00 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
14d10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14d20 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14d30 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
14d40 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
14d50 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
14d60 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
14d70 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
14d80 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
14d90 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14da0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14db0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
14dc0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
14dd0 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
14de0 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
14df0 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
14e00 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14e10 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
14e20 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
14e30 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
14e40 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
14e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
14e60 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
14e70 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
14e80 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
14e90 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
14ea0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
14eb0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
14ec0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
14ed0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
14ee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14ef0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
14f00 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
14f10 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
14f20 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
14f30 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
14f40 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
14f50 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14f60 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
14f70 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  mXUnlock(id, NO_
14f80 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
14f90 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
14fa0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14fb0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
14fc0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
14fd0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14fe0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
14ff0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
15000 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15010 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
15020 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
15030 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
15040 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
15050 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
15060 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
15070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
15080 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
15090 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
150a0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
150b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
150c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
150f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
15110 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
15120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15180 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
15190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
151b0 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
151c0 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
151d0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
151e0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
151f0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
15200 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
15210 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
15220 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
15230 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
15240 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
15250 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
15260 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
15270 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
15280 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
15290 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
152a0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
152b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
152c0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
152d0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
152e0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
152f0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
15300 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
15310 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
15320 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
15330 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
15340 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
15350 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
15360 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
15370 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
15380 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
15390 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
153a0 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
153b0 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
153c0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
153d0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
153e0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
153f0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
15400 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
15410 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
15420 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15430 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
15440 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
15450 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
15460 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
15470 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
15480 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
15490 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
154a0 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
154b0 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
154c0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
154d0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
154e0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
154f0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
15500 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
15510 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
15520 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
15530 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15550 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15560 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15570 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15580 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15590 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
155a0 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
155b0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
155c0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
155d0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
155e0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
155f0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
15600 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
15610 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
15620 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
15630 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
15640 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15650 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15660 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15670 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15680 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15690 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
156a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
156b0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
156c0 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
156d0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
156e0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
156f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
15700 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
15710 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
15720 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15730 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15740 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15750 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15760 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15770 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15780 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15790 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
157a0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
157b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
157c0 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
157d0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
157e0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
157f0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
15800 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
15810 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15820 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15830 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15840 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15850 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15860 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15870 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15880 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15890 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
158a0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
158b0 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
158c0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
158d0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
158e0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
158f0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
15900 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
15910 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15920 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15930 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15940 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15950 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15960 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15970 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15980 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15990 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
159a0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
159b0 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
159c0 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
159d0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
159e0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
159f0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
15a00 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
15a10 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15a20 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15a30 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15a40 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15a50 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15a60 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15a70 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15a80 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15a90 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15aa0 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
15ab0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
15ac0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
15ad0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
15ae0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
15af0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15b00 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15b10 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
15b20 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
15b30 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
15b40 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
15b50 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15b60 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
15b70 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
15b80 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
15b90 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15ba0 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
15bb0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
15bc0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
15bd0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
15be0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
15bf0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
15c00 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15c10 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15c20 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15c30 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15c40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15c50 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15c60 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15c70 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
15c80 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
15c90 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
15ca0 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
15cb0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
15cc0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15cd0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
15ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15cf0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
15d00 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
15d10 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15d20 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
15d30 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15d40 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  text;.  .  Simul
15d50 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
15d60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15d70 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15d80 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
15d90 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f  t( pFile );.  co
15da0 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
15db0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
15dc0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
15dd0 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
15de0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
15df0 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
15e00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15e10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
15e20 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
15e30 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
15e40 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
15e50 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
15e60 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
15e70 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
15e80 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
15e90 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
15ea0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15eb0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
15ec0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
15ed0 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
15ee0 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
15ef0 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
15f00 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
15f10 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
15f20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
15f30 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
15f40 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
15f50 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
15f60 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
15f70 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15f80 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
15f90 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
15fa0 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
15fb0 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
15fc0 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
15fd0 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
15fe0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
15ff0 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
16000 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
16010 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
16020 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
16030 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
16040 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
16050 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
16060 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
16070 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
16080 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
16090 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
160a0 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
160b0 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
160c0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
160d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
160e0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
160f0 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
16100 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
16110 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
16120 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
16130 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
16140 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
16150 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
16160 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
16170 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
16180 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
16190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
161a0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
161b0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
161c0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
161d0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
161e0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
161f0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
16200 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
16210 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
16220 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
16230 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
16240 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
16250 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
16260 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
16270 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
16280 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
16290 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
162a0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
162b0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
162c0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
162d0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
162e0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
162f0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
16300 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
16310 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
16320 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
16330 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
16340 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
16350 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
16360 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
16370 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
16380 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
16390 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
163a0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
163b0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
163c0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
163d0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
163e0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
163f0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
16400 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
16410 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
16420 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
16430 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
16440 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
16450 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
16460 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
16470 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
16480 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
16490 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
164a0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
164b0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
164c0 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
164d0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
164e0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
164f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16500 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
16510 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16520 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
16530 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
16540 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16550 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
16560 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
16570 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16580 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
16590 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
165a0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
165b0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
165c0 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
165d0 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
165e0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
165f0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
16600 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16610 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
16620 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
16630 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
16640 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
16650 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
16660 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
16670 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
16680 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16690 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
166a0 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
166b0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
166c0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
166d0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
166e0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
166f0 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
16700 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
16710 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
16720 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
16730 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16740 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16750 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
16760 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
16770 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16780 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
16790 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
167a0 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
167b0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
167c0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
167d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
167e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
167f0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
16800 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16810 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
16820 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
16830 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
16840 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
16850 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
16860 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
16870 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16880 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
16890 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
168a0 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
168b0 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
168c0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
168d0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
168e0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
168f0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
16900 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16910 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16920 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16930 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
16940 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
16950 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16960 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
16970 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16980 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16990 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
169a0 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
169b0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
169c0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
169d0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
169e0 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
169f0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
16a00 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16a10 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
16a20 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16a30 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
16a40 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
16a50 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
16a60 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
16a70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
16a80 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
16a90 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
16aa0 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
16ab0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
16ac0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
16ad0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
16ae0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
16af0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
16b00 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
16b10 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
16b20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16b30 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16b40 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
16b50 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
16b60 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
16b70 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
16b80 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
16b90 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
16ba0 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
16bb0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
16bc0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
16bd0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
16be0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
16bf0 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
16c00 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16c10 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
16c20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16c30 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16c40 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
16c50 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
16c60 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
16c70 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
16c80 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16c90 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16ca0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16cb0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
16cc0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
16cd0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
16ce0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
16cf0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
16d00 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
16d10 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16d20 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
16d30 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16d40 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
16d50 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
16d60 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
16d70 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
16d80 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
16d90 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
16da0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
16db0 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
16dc0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
16dd0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
16de0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
16df0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16e00 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
16e10 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
16e20 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
16e30 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16e40 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
16e50 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
16e60 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
16e70 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16e80 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16e90 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16ea0 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
16eb0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
16ec0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
16ed0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16ee0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
16ef0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
16f00 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16f10 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16f20 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16f30 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16f40 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16f50 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16f60 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16f70 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
16f80 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16f90 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
16fa0 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
16fb0 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
16fc0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
16fd0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16fe0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16ff0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
17000 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
17010 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
17020 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
17030 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
17040 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
17050 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
17060 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
17070 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
17080 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
17090 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
170a0 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
170b0 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
170c0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
170d0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
170e0 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
170f0 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
17100 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
17110 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
17120 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
17130 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17140 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
17150 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
17160 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
17170 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
17180 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17190 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
171a0 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
171b0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
171c0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
171d0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
171e0 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
171f0 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
17200 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17210 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
17220 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
17230 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
17240 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
17250 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72  ) ) {.      stor
17260 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
17270 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20  , lrc1Errno);.  
17280 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
17290 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
172a0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
172b0 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
172c0 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
172d0 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
172e0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
172f0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
17300 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
17310 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
17320 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
17330 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
17340 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17350 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
17360 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
17370 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
17380 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
17390 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
173a0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
173b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
173c0 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
173d0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
173e0 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
173f0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
17400 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
17410 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
17420 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
17430 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
17440 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
17450 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
17460 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
17470 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
17480 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
17490 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
174a0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
174b0 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
174c0 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
174d0 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
174e0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
174f0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
17500 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
17510 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
17520 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
17530 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17540 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
17550 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
17560 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
17570 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
17580 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
17590 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
175a0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
175b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
175c0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
175d0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
175e0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
175f0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
17600 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
17610 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
17620 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
17630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17640 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
17650 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
17660 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
17670 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
17680 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
17690 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
176a0 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
176b0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
176c0 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
176d0 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
176e0 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
176f0 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
17700 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
17710 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
17720 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
17730 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
17740 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
17750 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17760 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17770 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17790 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
177a0 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
177b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
177c0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
177d0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
177e0 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
177f0 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
17800 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
17810 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17820 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17830 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17840 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17850 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17870 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
17880 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
17890 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
178a0 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
178b0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
178c0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
178d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
178e0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
178f0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17900 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
17910 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
17920 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
17930 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
17940 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
17950 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
17960 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
17970 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
17980 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17990 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
179a0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
179b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
179c0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
179d0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
179e0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
179f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
17a00 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17a10 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
17a20 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
17a30 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
17a40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17a50 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17a60 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
17a70 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
17a80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17a90 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
17aa0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17ab0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
17ac0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
17ad0 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
17ae0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
17af0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
17b00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17b10 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
17b20 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
17b30 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
17b40 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
17b50 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
17b60 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17b70 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
17b80 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
17b90 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17ba0 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
17bb0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
17bc0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
17bd0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
17be0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
17bf0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
17c00 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
17c10 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
17c20 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
17c30 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
17c40 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
17c50 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17c60 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17c70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
17c80 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
17c90 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17ca0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
17cb0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
17cc0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
17cd0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
17ce0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
17cf0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
17d00 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
17d10 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17d20 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
17d30 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17d40 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
17d50 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17d60 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
17d70 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
17d80 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
17d90 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
17da0 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
17db0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
17dc0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
17dd0 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
17de0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
17df0 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
17e00 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
17e10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
17e20 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
17e30 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
17e40 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
17e50 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
17e60 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
17e70 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
17e80 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
17e90 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
17ea0 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
17eb0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
17ec0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
17ed0 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
17ee0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
17ef0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
17f00 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
17f10 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
17f20 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
17f30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17f40 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17f50 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
17f60 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
17f70 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17f80 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
17f90 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
17fa0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
17fb0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17fc0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17fd0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
17fe0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
17ff0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18000 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
18010 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
18020 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
18030 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
18040 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
18050 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
18060 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
18070 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
18080 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
18090 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
180a0 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
180b0 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
180c0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
180d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
180e0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
180f0 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
18100 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
18110 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
18120 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
18130 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18140 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
18150 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
18160 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
18170 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
18180 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
18190 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
181a0 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
181b0 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
181c0 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
181d0 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
181e0 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
181f0 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
18200 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
18210 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
18220 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
18230 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
18240 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
18250 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
18260 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
18270 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
18280 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
18290 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20  rChng==1 );.    
182a0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
182b0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
182c0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
182d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
182e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
182f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
18300 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18310 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18320 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
18330 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
18340 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
18350 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
18360 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
18370 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
18380 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20  ared>1) ){.     
18390 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
183a0 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
183b0 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
183c0 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
183d0 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
183e0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
183f0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
18400 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
18410 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18420 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18430 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
18440 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
18450 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
18460 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d      skipShared =
18470 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
18480 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
18490 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
184a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
184b0 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
184c0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
184d0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
184e0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
184f0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
18500 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
18510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18520 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18530 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
18540 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  && context->rese
18550 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  rved ){.      rc
18560 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18570 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18580 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
18590 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
185a0 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20    if( !rc ){ .  
185b0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
185c0 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20  eserved = 0; .  
185d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
185e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
185f0 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
18600 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
18610 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
18620 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  1)){.      pInod
18630 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
18640 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
18650 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
18660 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69  SQLITE_OK && eFi
18670 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
18680 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
18690 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
186a0 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
186b0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
186c0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
186d0 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
186e0 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
186f0 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
18700 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
18710 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
18720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
18730 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18740 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
18750 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
18760 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18770 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
18780 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
18790 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
187a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d  ==0 ){.      Sim
187b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
187c0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
187d0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
187e0 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
187f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
18800 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
18810 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a   !skipShared ){.
18820 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
18830 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18840 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18850 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
18860 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
18870 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
18880 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
18890 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
188a0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
188b0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
188c0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
188d0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
188e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
188f0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
18900 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
18910 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
18920 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
18930 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
18940 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
18950 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
18960 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
18970 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
18980 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
18990 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
189a0 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
189b0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
189c0 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
189d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
189e0 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
189f0 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
18a00 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
18a10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18a20 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
18a30 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
18a40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18a50 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18a60 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18a70 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
18a80 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f 63  =0 );.  afpUnloc
18a90 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18aa0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
18ab0 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ();.  if( pFile-
18ac0 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65  >pInode && pFile
18ad0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
18ae0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
18af0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
18b00 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
18b10 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
18b20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
18b30 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
18b40 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
18b50 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
18b60 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
18b70 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
18b80 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
18b90 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
18ba0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
18bb0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
18bc0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
18bd0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
18be0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
18bf0 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
18c00 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
18c10 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
18c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18c30 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
18c40 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d  Context);.  rc =
18c50 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
18c60 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
18c70 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
18c80 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
18c90 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
18ca0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18cb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18cc0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
18cd0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
18ce0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
18cf0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
18d00 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18d10 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18d20 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
18d30 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
18d40 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
18d50 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
18d60 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
18d70 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
18d80 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
18d90 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
18da0 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
18db0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
18dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18dd0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
18de0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
18df0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
18e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
18e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
18eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ec0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
18ed0 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FS Locking *****
18ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
18f00 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18f10 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18f20 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18f30 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  YLE./*. ** Lower
18f40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18f50 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
18f60 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
18f70 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
18f80 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65  Lock. ** must be
18f90 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18fa0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18fb0 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c   **. ** If the l
18fc0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
18fd0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
18fe0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
18ff0 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74  t or below. ** t
19000 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
19010 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
19020 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19030 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  -op.. */.static 
19040 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71  int nfsUnlock(sq
19050 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
19060 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
19070 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
19080 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
19090 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
190a0 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
190b0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
190c0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
190d0 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
190e0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
190f0 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
19100 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
19110 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
19120 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
19130 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
19140 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
19150 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
19160 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
19170 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
19180 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
19190 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
191a0 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
191b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
191c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
191d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
191e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
19230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19270 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19280 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
19290 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
192a0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
192b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192c0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
192d0 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
192e0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
192f0 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
19300 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
19310 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
19320 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
19330 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
19340 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
19350 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
19360 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
19370 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
19380 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
19390 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
193a0 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
193b0 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
193c0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
193d0 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
193e0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
193f0 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
19400 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
19410 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
19420 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
19430 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
19440 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
19450 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
19460 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
19470 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
19480 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
19490 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
194a0 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
194b0 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
194c0 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
194d0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
194e0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
194f0 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
19500 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
19510 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
19520 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
19530 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
19540 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
19550 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79  _PREAD.** in any
19560 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
19570 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
19580 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
19590 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
195a0 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
195b0 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
195c0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
195d0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
195e0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
195f0 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
19600 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
19610 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
19620 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
19630 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
19640 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
19650 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
19660 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
19670 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
19680 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69  t got;.  int pri
19690 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65  or = 0;.#if (!de
196a0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
196b0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
196c0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
196d0 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
196e0 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
196f0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  ;.  assert( cnt=
19700 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29  =(cnt&0x1ffff) )
19710 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  ;.  assert( id->
19720 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66  h>2 );.  do{.#if
19730 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19740 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
19750 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
19760 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19770 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19780 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19790 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
197a0 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
197b0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
197c0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
197d0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
197e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
197f0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
19800 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19810 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19820 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19830 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19840 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19850 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66  t = -1 );.    if
19860 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29 7b  ( newOffset<0 ){
19870 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
19880 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
19890 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  )id, errno);.   
198a0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
198b0 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73    }.    got = os
198c0 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  Read(id->h, pBuf
198d0 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20  , cnt);.#endif. 
198e0 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20     if( got==cnt 
198f0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
19900 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20   got<0 ){.      
19910 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52  if( errno==EINTR
19920 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e   ){ got = 1; con
19930 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70  tinue; }.      p
19940 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
19950 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
19960 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20 65  unixFile*)id,  e
19970 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65  rrno);.      bre
19980 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
19990 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20  ( got>0 ){.     
199a0 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20   cnt -= got;.   
199b0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74     offset += got
199c0 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d  ;.      prior +=
199d0 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66   got;.      pBuf
199e0 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b   = (void*)(got +
199f0 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20   (char*)pBuf);. 
19a00 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67     }.  }while( g
19a10 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ot>0 );.  TIMER_
19a20 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
19a30 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
19a40 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
19a50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d  .            id-
19a60 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f  >h, got+prior, o
19a70 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d  ffset-prior, TIM
19a80 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
19a90 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72  return got+prior
19aa0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
19ab0 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
19ac0 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
19ad0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
19ae0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
19af0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
19b00 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
19b10 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
19b20 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
19b30 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
19b40 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
19b50 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19b60 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
19b70 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
19b80 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
19b90 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
19ba0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
19bb0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
19bc0 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
19bd0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  d );.  assert( o
19be0 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73  ffset>=0 );.  as
19bf0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
19c00 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19c10 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19c20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
19c30 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
19c40 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
19c50 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
19c60 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
19c70 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
19c80 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
19c90 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
19ca0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
19cb0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
19cc0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
19cd0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
19ce0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
19cf0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
19d00 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   );.#endif..#if 
19d10 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
19d20 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
19d30 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
19d40 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
19d50 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
19d60 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
19d70 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
19d80 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
19d90 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
19da0 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
19db0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
19dc0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
19dd0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
19de0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
19df0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
19e00 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
19e10 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
19e20 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
19e30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19e40 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
19e50 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
19e60 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19e70 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
19e80 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
19e90 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
19ea0 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
19eb0 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
19ec0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
19ed0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
19ee0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
19ef0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
19f00 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
19f10 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f    }.#endif..  go
19f20 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
19f30 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
19f40 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
19f50 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
19f60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19f70 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
19f80 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
19f90 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
19fa0 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
19fb0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19fc0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
19fd0 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c  else{.    storeL
19fe0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
19ff0 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73  0);   /* not a s
1a000 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
1a010 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
1a020 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
1a030 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
1a040 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
1a050 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
1a060 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
1a070 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
1a080 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
1a090 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
1a0a0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
1a0b0 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64   seek the file-d
1a0c0 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64  escriptor passed
1a0d0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
1a0e0 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73  gument to.** abs
1a0f0 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66  olute offset iOf
1a100 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  f, then attempt 
1a110 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79  to write nBuf by
1a120 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d  tes of data from
1a130 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20  .** pBuf to it. 
1a140 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1a150 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e  rs, return -1 an
1a160 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20  d set *piErrno. 
1a170 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72  Otherwise, .** r
1a180 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c  eturn the actual
1a190 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1a1a0 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20   written (which 
1a1b0 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e  may be less than
1a1c0 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74  .** nBuf)..*/.st
1a1d0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
1a1e0 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66  WriteFd(.  int f
1a1f0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1a200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
1a210 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1a220 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
1a230 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20  64 iOff,        
1a240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a250 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f  * File offset to
1a260 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
1a270 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  t */.  const voi
1a280 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
1a290 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64         /* Copy d
1a2a0 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75  ata from this bu
1a2b0 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65  ffer to the file
1a2c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20   */.  int nBuf, 
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1a2f0 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20   buffer pBuf in 
1a300 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
1a310 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20  piErrno         
1a320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1a330 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20  T: Error number 
1a340 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  if error occurs 
1a350 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
1a360 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1a370 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1a380 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73   returned by sys
1a390 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61  tem call */..  a
1a3a0 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42  ssert( nBuf==(nB
1a3b0 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20  uf&0x1ffff) );. 
1a3c0 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b   assert( fd>2 );
1a3d0 0a 20 20 61 73 73 65 72 74 28 20 70 69 45 72 72  .  assert( piErr
1a3e0 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20  no!=0 );.  nBuf 
1a3f0 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49  &= 0x1ffff;.  TI
1a400 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20  MER_START;..#if 
1a410 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1a420 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  D).  do{ rc = (i
1a430 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20  nt)osPwrite(fd, 
1a440 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
1a450 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
1a460 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
1a470 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1a480 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1a490 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73  do{ rc = (int)os
1a4a0 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75  Pwrite64(fd, pBu
1a4b0 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d  f, nBuf, iOff);}
1a4c0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
1a4d0 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65  rrno==EINTR);.#e
1a4e0 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36  lse.  do{.    i6
1a4f0 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28  4 iSeek = lseek(
1a500 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53  fd, iOff, SEEK_S
1a510 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1a520 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20  eIOError( iSeek 
1a530 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  = -1 );.    if( 
1a540 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20  iSeek<0 ){.     
1a550 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1a560 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a570 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1a580 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1a590 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a5a0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a5b0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1a5c0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1a5d0 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1a5e0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a5f0 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1a600 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a610 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a  ..  if( rc<0 ) *
1a620 70 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  piErrno = errno;
1a630 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a640 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
1a650 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
1a660 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
1a670 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
1a680 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
1a690 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a6a0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
1a6b0 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
1a6c0 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   offset..**.** T
1a6d0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
1a6e0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
1a6f0 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69   on a failed wri
1a700 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  te the lastErrno
1a710 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
1a720 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a730 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1a740 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
1a750 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
1a760 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
1a770 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
1a780 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65  t){.  return see
1a790 6b 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e  kAndWriteFd(id->
1a7a0 68 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  h, offset, pBuf,
1a7b0 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45   cnt, &id->lastE
1a7c0 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rrno);.}.../*.**
1a7d0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
1a7e0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
1a7f0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
1a800 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1a810 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
1a820 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a830 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
1a840 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
1a850 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
1a860 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
1a870 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
1a880 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
1a890 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
1a8a0 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20   .){.  unixFile 
1a8b0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1a8c0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72  le*)id;.  int wr
1a8d0 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
1a8e0 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
1a8f0 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
1a900 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
1a910 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
1a920 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
1a930 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
1a940 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
1a950 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
1a960 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
1a970 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
1a980 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
1a990 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
1a9a0 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
1a9b0 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1a9c0 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1a9d0 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1a9e0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1a9f0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1aa00 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1aa10 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1aa20 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1aa30 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1aa40 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1aa50 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1aa60 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
1aa70 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1aa80 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1aa90 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1aaa0 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
1aab0 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1aac0 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
1aad0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1aae0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
1aaf0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
1ab00 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1ab10 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
1ab20 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
1ab30 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
1ab40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1ab50 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1ab60 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
1ab70 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
1ab80 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
1ab90 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1aba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
1abb0 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
1abc0 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
1abd0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1abe0 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
1abf0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1ac00 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1ac10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
1ac20 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
1ac30 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
1ac40 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ac50 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1ac60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
1ac70 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
1ac80 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
1ac90 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
1aca0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1acb0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1acc0 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
1acd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1ace0 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
1acf0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1ad00 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
1ad10 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1ad20 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
1ad30 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
1ad40 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1ad50 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1ad60 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
1ad70 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1ad80 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1ad90 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1ada0 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1adb0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1adc0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1add0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1ade0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1adf0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1ae00 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1ae10 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
1ae20 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1ae30 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1ae40 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
1ae50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ae60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1ae70 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1ae80 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1ae90 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1aea0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
1aeb0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1aec0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1aed0 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
1aee0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1aef0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1af00 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1af10 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1af20 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1af30 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1af40 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74   .  while( (wrot
1af50 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1af60 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1af70 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20  pBuf, amt))<amt 
1af80 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20  && wrote>0 ){.  
1af90 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1afa0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1afb0 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1afc0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1afd0 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1afe0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1aff0 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1b000 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1b010 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1b020 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1b030 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f  ;..  if( amt>wro
1b040 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  te ){.    if( wr
1b050 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1b060 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1b070 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1b080 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1b090 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1b0a0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b0b0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1b0c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b0d0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1b0e0 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f  pFile, 0); /* no
1b0f0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1b100 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1b110 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1b120 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1b130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b150 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1b160 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1b170 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1b180 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1b190 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1b1a0 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1b1b0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1b1c0 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1b1d0 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1b1e0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1b1f0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1b200 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1b210 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1b220 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1b230 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1b240 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1b250 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1b260 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1b270 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1b280 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1b290 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1b2a0 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1b2b0 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1b2c0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1b2d0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1b2e0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1b2f0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1b300 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1b310 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1b320 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1b330 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44  ync or -DHAVE_FD
1b340 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21  ATASYNC.*/.#if !
1b350 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1b360 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54  c) && !HAVE_FDAT
1b370 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
1b380 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
1b390 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1b3a0 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b3b0 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
1b3c0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1b3d0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
1b3e0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
1b3f0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
1b400 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
1b410 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
1b420 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
1b430 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
1b440 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
1b450 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
1b460 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
1b470 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
1b480 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
1b490 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
1b4a0 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1b4b0 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
1b4c0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
1b4d0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
1b4e0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
1b4f0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
1b500 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
1b510 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
1b520 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
1b530 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
1b540 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
1b550 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
1b560 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
1b570 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
1b580 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
1b590 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
1b5a0 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
1b5b0 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
1b5c0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
1b5d0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
1b5e0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
1b5f0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
1b600 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
1b610 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
1b620 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1b630 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
1b640 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
1b650 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
1b660 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
1b670 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1b680 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
1b690 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
1b6a0 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
1b6b0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b6c0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1b6d0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
1b6e0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
1b6f0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
1b700 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
1b710 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
1b720 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
1b730 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
1b740 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
1b750 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
1b760 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
1b770 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
1b780 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
1b790 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
1b7a0 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
1b7b0 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
1b7c0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
1b7d0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
1b7e0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
1b7f0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
1b800 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
1b810 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1b820 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
1b830 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
1b840 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
1b850 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1b860 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
1b870 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
1b880 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
1b890 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
1b8a0 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
1b8b0 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
1b8c0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
1b8d0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1b8e0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
1b8f0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
1b900 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
1b910 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
1b920 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
1b930 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
1b940 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
1b950 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
1b960 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
1b970 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
1b980 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
1b990 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
1b9a0 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
1b9b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
1b9c0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
1b9d0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
1b9e0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
1b9f0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
1ba00 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
1ba10 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
1ba20 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
1ba30 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
1ba40 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
1ba50 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
1ba60 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
1ba70 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
1ba80 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
1ba90 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
1baa0 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
1bab0 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
1bac0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1bad0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
1bae0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1baf0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1bb00 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1bb10 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1bb20 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
1bb30 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1bb40 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1bb50 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1bb60 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
1bb70 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1bb80 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1bb90 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1bba0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
1bbb0 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
1bbc0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
1bbd0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
1bbe0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
1bbf0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
1bc00 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
1bc10 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
1bc20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
1bc30 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
1bc40 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
1bc50 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
1bc60 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1bc70 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1bc80 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
1bc90 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1bca0 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
1bcb0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
1bcc0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
1bcd0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
1bce0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1bcf0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1bd00 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1bd10 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65 61  op.  But go ahea
1bd20 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61 74  d and call fstat
1bd30 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20 74  () to validate t
1bd40 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  he file.  ** des
1bd50 63 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e 65  criptor as we ne
1bd60 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20 70  ed a method to p
1bd70 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72 65  rovoke a failure
1bd80 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f 76   during.  ** cov
1bd90 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a 20  erate testing.. 
1bda0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1bdb0 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20 20  E_NO_SYNC.  {.  
1bdc0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1bdd0 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  f;.    rc = osFs
1bde0 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a 20  tat(fd, &buf);. 
1bdf0 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55   }.#elif HAVE_FU
1be00 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1be10 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
1be20 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   = osFcntl(fd, F
1be30 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
1be40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1be50 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1be60 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1be70 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1be80 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1be90 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1bea0 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1beb0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1bec0 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1bed0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1bee0 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1bef0 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1bf00 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1bf10 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1bf20 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1bf30 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1bf40 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1bf50 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1bf60 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1bf70 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1bf80 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1bf90 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1bfa0 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1bfb0 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1bfc0 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1bfd0 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1bfe0 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1bff0 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1c000 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1c010 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1c020 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1c030 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1c040 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1c050 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1c060 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1c070 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1c080 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1c090 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1c0a0 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1c0b0 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1c0c0 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1c0d0 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1c0e0 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1c0f0 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c100 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1c110 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1c120 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1c130 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1c140 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1c150 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1c160 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1c170 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1c180 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1c190 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1c1a0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1c1b0 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1c1c0 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1c1d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1c1e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c1f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1c200 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c210 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1c220 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1c230 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1c240 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1c250 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1c260 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1c270 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1c280 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c290 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1c2a0 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1c2b0 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1c2c0 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1c2d0 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1c2e0 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1c2f0 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1c300 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1c310 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1c320 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1c330 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1c340 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1c350 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1c360 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1c370 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1c380 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1c390 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1c3a0 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1c3b0 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1c3c0 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1c3d0 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1c3e0 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1c3f0 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1c400 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1c410 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1c420 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1c430 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1c440 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1c450 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1c460 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1c470 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1c480 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1c490 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1c4a0 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1c4b0 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1c4c0 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1c4d0 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1c4e0 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1c4f0 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1c500 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1c510 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1c520 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1c530 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1c540 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1c550 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1c560 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1c570 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1c580 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1c590 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1c5a0 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1c5b0 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1c5c0 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1c5d0 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1c5e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1c5f0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1c600 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1c610 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1c620 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1c630 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1c640 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c650 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1c660 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1c670 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1c680 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1c690 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1c6a0 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1c6b0 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1c6c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1c6d0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1c6e0 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1c6f0 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1c700 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1c710 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26 20  rname); ii>0 && 
1c720 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1c730 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1c740 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1c750 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1c760 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1c770 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d 27  ( zDirname[0]!='
1c780 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30 5d  /' ) zDirname[0]
1c790 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69 72   = '.';.    zDir
1c7a0 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d  name[1] = 0;.  }
1c7b0 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
1c7c0 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1c7d0 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1c7e0 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30   0);.  if( fd>=0
1c7f0 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1c800 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1c810 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1c820 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46 64  me));.  }.  *pFd
1c830 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64 3e   = fd;.  if( fd>
1c840 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1c850 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20  TE_OK;.  return 
1c860 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1c870 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1c880 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72  T, "openDirector
1c890 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d  y", zDirname);.}
1c8a0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1c8b0 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1c8c0 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1c8d0 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1c8e0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1c8f0 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1c900 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1c910 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1c920 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1c930 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1c940 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1c950 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1c960 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1c970 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1c980 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1c990 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1c9a0 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1c9b0 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1c9c0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1c9d0 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1c9e0 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1c9f0 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1ca00 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1ca10 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1ca20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1ca30 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1ca40 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1ca50 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1ca60 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1ca70 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1ca80 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1ca90 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1caa0 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1cab0 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1cac0 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1cad0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1cae0 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1caf0 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1cb00 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1cb10 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1cb20 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1cb30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1cb40 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1cb50 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1cb60 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1cb70 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1cb80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1cb90 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1cba0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1cbb0 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1cbc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1cbd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1cbe0 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1cbf0 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1cc00 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1cc10 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1cc20 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1cc30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1cc40 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1cc50 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1cc60 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1cc70 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1cc80 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1cc90 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1cca0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1ccb0 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1ccc0 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1ccd0 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1cce0 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1ccf0 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1cd00 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1cd10 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1cd20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1cd30 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1cd40 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1cd50 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1cd60 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1cd70 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1cd80 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1cd90 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1cda0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1cdb0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1cdc0 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1cdd0 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1cde0 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1cdf0 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1ce00 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1ce10 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1ce20 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1ce30 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1ce40 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1ce50 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1ce60 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1ce70 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1ce80 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1ce90 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1cea0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1ceb0 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1cec0 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1ced0 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1cee0 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1cef0 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1cf00 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1cf10 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79  ccurrence.  Many
1cf20 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1cf30 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1cf40 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1cf50 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1cf60 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1cf70 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1cf80 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1cf90 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1cfa0 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1cfb0 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1cfc0 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1cfd0 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1cfe0 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1cff0 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1d000 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1d010 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1d020 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1d030 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1d040 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1d050 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1d060 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1d070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d080 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1d090 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rfd, 0, 0);.    
1d0a0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1d0b0 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1d0c0 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
1d0d0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1d0e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1d0f0 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
1d100 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d110 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1d120 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1d130 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1d140 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d150 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1d160 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1d170 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1d180 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1d190 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1d1a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d1b0 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1d1c0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d1d0 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1d1e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1d1f0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1d200 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1d210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d220 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1d230 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1d240 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1d250 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1d260 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1d270 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1d280 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1d290 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1d2a0 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1d2b0 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1d2c0 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1d2d0 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1d2e0 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1d2f0 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1d300 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1d310 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1d320 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1d330 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
1d340 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1d350 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1d360 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1d370 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1d380 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1d390 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1d3a0 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1d3b0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1d3c0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1d3d0 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1d3e0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1d3f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d400 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1d410 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1d420 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
1d430 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
1d440 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
1d450 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1d460 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1d470 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1d480 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1d490 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1d4a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1d4b0 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1d4c0 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1d4d0 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1d4e0 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1d4f0 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1d500 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1d510 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1d520 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1d530 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1d540 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1d550 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1d560 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1d570 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1d580 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1d590 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1d5a0 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1d5b0 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1d5c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1d5d0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1d5e0 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1d5f0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1d600 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1d610 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  .    }.#endif..#
1d620 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1d630 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a  AP_SIZE>0.    /*
1d640 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
1d650 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20   just truncated 
1d660 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
1d670 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1d680 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ntly.    ** mapp
1d690 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
1d6a0 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1d6b0 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
1d6c0 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
1d6d0 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61  l.    ** use rea
1d6e0 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
1d6f0 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
1d700 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
1d710 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a   from now on.  .
1d720 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1d730 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
1d740 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46  Size ){.      pF
1d750 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
1d760 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  nByte;.    }.#en
1d770 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
1d780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1d790 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1d7a0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1d7b0 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1d7c0 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1d7d0 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1d7e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1d7f0 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1d800 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1d810 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1d820 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1d830 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e  c = osFstat(((un
1d840 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
1d850 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
1d860 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1d870 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
1d880 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1d890 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1d8a0 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  d, errno);.    r
1d8b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d8c0 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
1d8d0 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
1d8e0 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
1d8f0 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
1d900 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
1d910 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
1d920 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
1d930 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
1d940 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
1d950 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
1d960 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
1d970 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
1d980 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
1d990 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
1d9a0 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
1d9b0 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
1d9c0 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
1d9d0 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
1d9e0 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
1d9f0 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
1da00 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
1da10 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
1da20 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
1da30 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
1da40 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
1da50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1da60 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1da70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1da80 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1da90 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
1daa0 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
1dab0 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
1dac0 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
1dad0 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
1dae0 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
1daf0 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
1db00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1db10 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
1db20 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1db30 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
1db40 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
1db50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1db60 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c  o handle the SQL
1db70 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1db80 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e  INT .** file-con
1db90 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20  trol operation. 
1dba0 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74   Enlarge the dat
1dbb0 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20  abase to nBytes 
1dbc0 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e  in size.** (roun
1dbd0 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  ded up to the ne
1dbe0 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20  xt chunk-size). 
1dbf0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1dc00 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e   is already.** n
1dc10 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c  Bytes or larger,
1dc20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1dc30 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1dc40 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a  tic int fcntlSiz
1dc50 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a  eHint(unixFile *
1dc60 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65  pFile, i64 nByte
1dc70 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
1dc80 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
1dc90 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20   i64 nSize;     
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dcb0 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20  * Required file 
1dcc0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
1dcd0 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20  ct stat buf;    
1dce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1dcf0 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e  d to hold return
1dd00 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74   values of fstat
1dd10 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66  () */.   .    if
1dd20 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  ( osFstat(pFile-
1dd30 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
1dd40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1dd50 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1dd60 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d    }..    nSize =
1dd70 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1dd80 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1dd90 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1dda0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1ddb0 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1ddc0 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1ddd0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1dde0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1ddf0 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1de00 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1de10 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1de20 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1de30 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1de40 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1de50 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1de60 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1de70 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1de80 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1de90 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1dea0 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1deb0 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1dec0 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1ded0 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1dee0 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1def0 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1df00 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1df10 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1df20 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1df30 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1df40 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1df50 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1df60 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1df70 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
1df80 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1df90 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1dfa0 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1dfb0 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1dfc0 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1dfd0 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20  it. Write a .   
1dfe0 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
1dff0 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
1e000 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1e010 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69   that falls enti
1e020 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69  rely.      ** wi
1e030 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1e040 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20  d region. Then, 
1e050 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73  if required, a s
1e060 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20  ingle byte.     
1e070 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e   ** at offset (n
1e080 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20  Size-1), to set 
1e090 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e0a0 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a  file correctly..
1e0b0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
1e0c0 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e   a similar techn
1e0d0 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65  ique to that use
1e0e0 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79  d by glibc on sy
1e0f0 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74  stems.      ** t
1e100 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1e110 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1e120 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  () call..      *
1e130 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1e140 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1e150 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1e160 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1e170 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
1e180 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1e190 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e1a0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  bytes written by
1e1b0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
1e1c0 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1e1d0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e1e0 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1e1f0 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1e200 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  ..      iWrite =
1e210 20 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42   (buf.st_size/nB
1e220 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20  lk)*nBlk + nBlk 
1e230 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1e240 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73  t( iWrite>=buf.s
1e250 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  t_size );.      
1e260 61 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65  assert( ((iWrite
1e270 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a  +1)%nBlk)==0 );.
1e280 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f        for(/*no-o
1e290 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a  p*/; iWrite<nSiz
1e2a0 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65  e+nBlk-1; iWrite
1e2b0 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  +=nBlk ){.      
1e2c0 20 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53    if( iWrite>=nS
1e2d0 69 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e  ize ) iWrite = n
1e2e0 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20  Size - 1;.      
1e2f0 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41    nWrite = seekA
1e300 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69  ndWrite(pFile, i
1e310 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20  Write, "", 1);. 
1e320 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74         if( nWrit
1e330 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
1e340 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1e350 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1e360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
1e370 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1e380 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
1e390 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1e3a0 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1e3b0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1e3c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1e3d0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e3e0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1e3f0 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1e400 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1e410 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  e) ){.        st
1e420 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1e430 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1e440 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1e450 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1e460 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1e470 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1e480 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1e490 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1e4a0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1e4b0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1e4c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e4d0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1e4e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e4f0 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1e500 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61  s initially nega
1e510 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1e520 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1e530 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1e540 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1e550 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1e560 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1e570 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1e580 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1e590 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1e5a0 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1e5b0 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1e5c0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e5d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e5e0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69   unixModeBit(uni
1e5f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  xFile *pFile, un
1e600 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1e610 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1e620 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1e630 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1e640 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1e650 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1e660 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1e670 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1e680 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1e690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1e6a0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e6b0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1e6c0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1e6d0 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1e6e0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
1e6f0 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
1e700 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a  har *zBuf);../*.
1e710 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
1e720 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
1e730 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1e740 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1e750 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
1e760 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1e770 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
1e780 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
1e790 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1e7a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
1e7b0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1e7c0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e7d0 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
1e7e0 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
1e7f0 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  = pFile->eFileLo
1e800 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ck;.      return
1e810 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e820 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e830 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52  E_FCNTL_LAST_ERR
1e840 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
1e850 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d  t*)pArg = pFile-
1e860 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
1e870 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e880 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1e890 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1e8a0 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20  CHUNK_SIZE: {.  
1e8b0 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75      pFile->szChu
1e8c0 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72  nk = *(int *)pAr
1e8d0 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  g;.      return 
1e8e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1e8f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1e900 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1e910 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  : {.      int rc
1e920 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e930 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
1e940 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e  ;.      rc = fcn
1e950 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65  tlSizeHint(pFile
1e960 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b  , *(i64 *)pArg);
1e970 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1e980 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1e990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e9b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
1e9c0 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20  RSIST_WAL: {.   
1e9d0 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
1e9e0 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
1e9f0 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74  ERSIST_WAL, (int
1ea00 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72  *)pArg);.      r
1ea10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ea20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ea30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
1ea40 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
1ea50 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f  : {.      unixMo
1ea60 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49  deBit(pFile, UNI
1ea70 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74  XFILE_PSOW, (int
1ea80 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72  *)pArg);.      r
1ea90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1eaa0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1eab0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53  SQLITE_FCNTL_VFS
1eac0 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  NAME: {.      *(
1ead0 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71  char**)pArg = sq
1eae0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1eaf0 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d  s", pFile->pVfs-
1eb00 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72  >zName);.      r
1eb10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1eb20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1eb30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d  SQLITE_FCNTL_TEM
1eb40 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20  PFILENAME: {.   
1eb50 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20     char *zTFile 
1eb60 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1eb70 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d  64( pFile->pVfs-
1eb80 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20  >mxPathname );. 
1eb90 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20       if( zTFile 
1eba0 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47  ){.        unixG
1ebb0 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65  etTempname(pFile
1ebc0 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
1ebd0 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20  me, zTFile);.   
1ebe0 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
1ebf0 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20  rg = zTFile;.   
1ec00 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1ec10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1ec20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1ec30 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56  TE_FCNTL_HAS_MOV
1ec40 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  ED: {.      *(in
1ec50 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61  t*)pArg = fileHa
1ec60 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20  sMoved(pFile);. 
1ec70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1ec80 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66  TE_OK;.    }.#if
1ec90 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1eca0 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65  _SIZE>0.    case
1ecb0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d   SQLITE_FCNTL_MM
1ecc0 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  AP_SIZE: {.     
1ecd0 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20   i64 newLimit = 
1ece0 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20  *(i64*)pArg;.   
1ecf0 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
1ed00 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28  TE_OK;.      if(
1ed10 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65   newLimit>sqlite
1ed20 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
1ed30 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Mmap ){.        
1ed40 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  newLimit = sqlit
1ed50 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1ed60 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 20  xMmap;.      }. 
1ed70 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72 67       *(i64*)pArg
1ed80 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69   = pFile->mmapSi
1ed90 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66 28  zeMax;.      if(
1eda0 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20   newLimit>=0 && 
1edb0 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d  newLimit!=pFile-
1edc0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26 20  >mmapSizeMax && 
1edd0 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74  pFile->nFetchOut
1ede0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
1edf0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1ee00 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20  x = newLimit;.  
1ee10 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
1ee20 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20  >mmapSize>0 ){. 
1ee30 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e 6d           unixUnm
1ee40 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20  apfile(pFile);. 
1ee50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
1ee60 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  ixMapfile(pFile,
1ee70 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   -1);.        }.
1ee80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1ee90 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23  turn rc;.    }.#
1eea0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
1eeb0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
1eec0 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c 73   The pager calls
1eed0 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f 20   this method to 
1eee0 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20 68  signal that it h
1eef0 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61  as done.    ** a
1ef00 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68   rollback and th
1ef10 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  at the database 
1ef20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e 63  is therefore unc
1ef30 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20 2a  hanged and.    *
1ef40 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69 73  * it hence it is
1ef50 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61 6e   OK for the tran
1ef60 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20 63  saction change c
1ef70 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20 20  ounter to be.   
1ef80 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   ** unchanged.. 
1ef90 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1efa0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
1efb0 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20  NCHANGED: {.    
1efc0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
1efd0 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  )->dbUpdate = 0;
1efe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1eff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23  LITE_OK;.    }.#
1f000 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
1f010 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1f020 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
1f030 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20  (__APPLE__).    
1f040 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f050 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
1f060 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ILE:.    case SQ
1f070 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c  LITE_FCNTL_GET_L
1f080 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a  OCKPROXYFILE: {.
1f090 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f        return pro
1f0a0 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64  xyFileControl(id
1f0b0 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d  ,op,pArg);.    }
1f0c0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f0d0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1f0e0 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1f0f0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
1f100 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
1f110 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a  ITE_NOTFOUND;.}.
1f120 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f130 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
1f140 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
1f150 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
1f160 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
1f170 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
1f180 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
1f190 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
1f1a0 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
1f1b0 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
1f1c0 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
1f1d0 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
1f1e0 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
1f1f0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
1f200 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
1f210 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
1f220 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
1f230 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
1f240 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
1f250 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
1f260 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
1f270 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
1f280 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
1f290 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
1f2a0 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
1f2b0 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54  .#ifndef __QNXNT
1f2c0 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  O__ .static int 
1f2d0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
1f2e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
1f2f0 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
1f300 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
1f310 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d);.  return SQL
1f320 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1f330 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69  OR_SIZE;.}.#endi
1f340 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
1f350 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f  lowing version o
1f360 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65  f unixSectorSize
1f370 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20  () is optimized 
1f380 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64  for QNX..*/.#ifd
1f390 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69  ef __QNXNTO__.#i
1f3a0 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64  nclude <sys/dcmd
1f3b0 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  _blk.h>.#include
1f3c0 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e   <sys/statvfs.h>
1f3d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
1f3e0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
1f3f0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
1f400 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1f410 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1f420 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
1f430 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b  ctorSize == 0 ){
1f440 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1f450 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20  vfs fsInfo;.    
1f460 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64     .    /* Set d
1f470 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d  efaults for non-
1f480 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79  supported filesy
1f490 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69  stems */.    pFi
1f4a0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f4b0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
1f4c0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20  SECTOR_SIZE;.   
1f4d0 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
1f4e0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20  aracteristics = 
1f4f0 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61 74  0;.    if( fstat
1f500 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66  vfs(pFile->h, &f
1f510 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b  sInfo) == -1 ) {
1f520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 46  .      return pF
1f530 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ile->sectorSize;
1f540 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1f550 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
1f560 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22  _basetype, "tmp"
1f570 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c  ) ) {.      pFil
1f580 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
1f590 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
1f5a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
1f5b0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f5c0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
1f5d0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1f5e0 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c  4K |       /* Al
1f5f0 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  l ram filesystem
1f600 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d   writes are atom
1f610 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
1f620 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1f630 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
1f640 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
1f650 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
1f660 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
1f670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f680 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
1f690 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
1f6a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f6b0 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
1f6c0 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
1f6d0 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
1f6e0 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
1f6f0 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f710 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
1f720 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
1f730 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
1f740 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
1f750 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
1f760 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20  pe, "etfs") ){. 
1f770 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
1f780 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
1f790 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
1f7a0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
1f7b0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
1f7c0 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c        /* etfs cl
1f7d0 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65  uster size write
1f7e0 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
1f7f0 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e          (pFile->
1f800 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
1f810 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
1f820 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20  ATOMIC512) |.   
1f830 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
1f840 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
1f850 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
1f860 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
1f870 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
1f880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8a0 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
1f8b0 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
1f8c0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f8d0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1f8e0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1f8f0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1f900 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f930 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1f940 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1f950 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1f960 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1f970 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
1f980 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  6") ){.      pFi
1f990 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f9a0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f9b0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f9c0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f9d0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1f9e0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f9f0 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41  C |         /* A
1fa00 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  ll filesystem wr
1fa10 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
1fa20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
1fa30 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1fa40 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
1fa50 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
1fa60 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
1fa70 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
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 2a 2a 20 74 68 65 20 77          ** the w
1faa0 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
1fab0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1fac0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1fad0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1fae0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1faf0 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1fb00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
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 2a 2a 20 73 6f 20 69 74 20         ** so it 
1fb30 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1fb40 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1fb50 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66  se if( !strcmp(f
1fb60 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
1fb70 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20  , "qnx4") ){.   
1fb80 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
1fb90 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
1fba0 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
1fbb0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1fbc0 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
1fbd0 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73      /* full bits
1fbe0 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72  et of atomics fr
1fbf0 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69  om max sector si
1fc00 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a  ze and smaller *
1fc10 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c  /.        ((pFil
1fc20 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20  e->sectorSize / 
1fc30 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43  512 * SQLITE_IOC
1fc40 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c  AP_ATOMIC512) <<
1fc50 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20   1) - 2 |.      
1fc60 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
1fc70 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
1fc80 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
1fc90 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
1fca0 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
1fcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fcd0 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
1fce0 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
1fcf0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1fd00 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f  strstr(fsInfo.f_
1fd10 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29  basetype, "dos")
1fd20 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1fd30 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1fd40 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1fd50 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1fd60 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fd70 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
1fd80 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
1fd90 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
1fda0 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
1fdb0 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
1fdc0 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
1fdd0 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
1fde0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
1fdf0 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
1fe00 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
1fe10 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1fe20 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
1fe30 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
1fe40 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
1fe50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fe70 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
1fe80 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
1fe90 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
1fea0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
1feb0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fec0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
1fed0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
1fee0 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f  OMIC512 |      /
1fef0 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f  * blocks are ato
1ff00 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1ff10 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1ff20 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1ff30 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1ff40 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1ff50 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1ff60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1ff80 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1ff90 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  s */.        0;.
1ffa0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c      }.  }.  /* L
1ffb0 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66  ast chance verif
1ffc0 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  ication.  If the
1ffd0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e   sector size isn
1ffe0 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  't a multiple of
1fff0 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69   512.  ** then i
20000 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f  t isn't valid.*/
20010 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65  .  if( pFile->se
20020 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21  ctorSize % 512 !
20030 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  = 0 ){.    pFile
20040 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
20050 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20  ristics = 0;.   
20060 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
20070 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
20080 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
20090 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46  .  }.  return pF
200a0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ile->sectorSize;
200b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51  .}.#endif /* __Q
200c0 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a  NXNTO__ */../*.*
200d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
200e0 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
200f0 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ics for the file
20100 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53  ..**.** This VFS
20110 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65   is set up to re
20120 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41  turn SQLITE_IOCA
20130 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
20140 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74  WRITE by default
20150 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68  ..** However, th
20160 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e  at choice is con
20170 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65  troversial since
20180 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65   technically the
20190 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66   underlying.** f
201a0 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ile system does 
201b0 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69  not always provi
201c0 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65  de powersafe ove
201d0 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74  rwrites.  (In ot
201e0 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66  her.** words, af
201f0 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73  ter a power-loss
20200 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66   event, parts of
20210 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
20220 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69  ere never.** wri
20230 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75  tten might end u
20240 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e  p being altered.
20250 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d  )  However, non-
20260 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73  PSOW behavior is
20270 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72   very,.** very r
20280 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74  are.  And assert
20290 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61  ing PSOW makes a
202a0 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e   large reduction
202b0 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a   in the amount.*
202c0 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f  * of required I/
202d0 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67  O for journaling
202e0 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66  , since a lot of
202f0 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d   padding is elim
20300 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63  inated..**  Henc
20310 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41  e, while POWERSA
20320 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20  FE_OVERWRITE is 
20330 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74  on by default, t
20340 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63  here is a file-c
20350 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61  ontrol.** availa
20360 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
20370 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79  ff and URI query
20380 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c   parameter avail
20390 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
203a0 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
203b0 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61  nt unixDeviceCha
203c0 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c  racteristics(sql
203d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
203e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
203f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
20400 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
20410 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20  def __QNXNTO__. 
20420 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69   if( p->sectorSi
20430 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74  ze==0 ) unixSect
20440 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63  orSize(id);.  rc
20450 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72   = p->deviceChar
20460 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e  acteristics;.#en
20470 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72  dif.  if( p->ctr
20480 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
20490 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63  E_PSOW ){.    rc
204a0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50   |= SQLITE_IOCAP
204b0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
204c0 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RITE;.  }.  retu
204d0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64  rn rc;.}..#if !d
204e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
204f0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
20500 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
20510 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  0../*.** Return 
20520 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20  the system page 
20530 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  size..**.** This
20540 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
20550 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64   not be called d
20560 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72  irectly by other
20570 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69   code in this fi
20580 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c  le. .** Instead,
20590 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61   it should be ca
205a0 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f  lled via macro o
205b0 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a  sGetpagesize()..
205c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
205d0 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
205e0 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  id){.#if OS_VXWO
205f0 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32  RKS.  return 102
20600 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  4;.#elif defined
20610 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20  (_BSD_SOURCE).  
20620 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69  return getpagesi
20630 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65  ze();.#else.  re
20640 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e  turn (int)syscon
20650 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b  f(_SC_PAGESIZE);
20660 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69  .#endif.}..#endi
20670 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
20680 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
20690 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
206a0 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66  P_SIZE>0 */..#if
206b0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
206c0 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  _WAL../*.** Obje
206d0 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65  ct used to repre
206e0 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d  sent an shared m
206f0 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a  emory buffer.  .
20700 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69  **.** When multi
20710 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20  ple threads all 
20720 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61  reference the sa
20730 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61  me wal-index, ea
20740 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73  ch thread.** has
20750 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d   its own unixShm
20760 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65   object, but the
20770 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61  y all point to a
20780 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65   single instance
20790 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78  .** of this unix
207a0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20  ShmNode object. 
207b0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
207c0 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20   each wal-index 
207d0 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c  is opened.** onl
207e0 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65  y once per proce
207f0 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75  ss..**.** Each u
20800 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
20810 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74  t is connected t
20820 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49  o a single unixI
20830 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e  nodeInfo object.
20840 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61  .** We could coa
20850 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63  lesce this objec
20860 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65  t into unixInode
20870 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77  Info, but that w
20880 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65  ould mean.** eve
20890 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61  ry open file tha
208a0 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  t does not use s
208b0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e  hared memory (in
208c0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f   other words, mo
208d0 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73  st.** open files
208e0 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20  ) would have to 
208f0 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69  carry around thi
20900 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  s extra informat
20910 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20  ion.  So.** the 
20920 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
20930 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  ject contains a 
20940 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20  pointer to this 
20950 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20960 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e  ct.** and the un
20970 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
20980 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79   is created only
20990 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a   when needed..**
209a0 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
209b0 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
209c0 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
209d0 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
209e0 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
209f0 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
20a00 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
20a10 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
20a20 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
20a30 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
20a40 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  g fields are rea
20a50 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65  d-only after the
20a60 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
20a70 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20  ed:.** .**      
20a80 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c  fid.**      zFil
20a90 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68  ename.**.** Eith
20aa0 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d  er unixShmNode.m
20ab0 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
20ac0 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65  d or unixShmNode
20ad0 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20  .nRef==0 and.** 
20ae0 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
20af0 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61  is true when rea
20b00 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
20b10 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a  any other field.
20b20 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  ** in this struc
20b30 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ture..*/.struct 
20b40 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20  unixShmNode {.  
20b50 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
20b60 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e  Inode;     /* un
20b70 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74  ixInodeInfo that
20b80 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e   owns this SHM n
20b90 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ode */.  sqlite3
20ba0 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
20bb0 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20      /* Mutex to 
20bc0 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65  access this obje
20bd0 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  ct */.  char *zF
20be0 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
20bf0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
20c00 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a  e mmapped file *
20c10 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
20c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c30 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
20c40 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  riptor */.  int 
20c50 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  szRegion;       
20c60 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20c70 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  f shared-memory 
20c80 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36  regions */.  u16
20c90 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20   nRegion;       
20ca0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20cb0 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f  of array apRegio
20cc0 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64  n */.  u8 isRead
20cd0 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  only;           
20ce0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
20cf0 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72  d-only */.  char
20d00 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
20d10 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
20d20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
20d30 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
20d40 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
20d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
20d70 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
20d80 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
20d90 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
20da0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
20db0 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
20dc0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
20dd0 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
20de0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
20df0 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
20e00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20e10 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
20e20 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
20e30 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
20e40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
20e50 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
20e60 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
20e70 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
20e80 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
20e90 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
20ea0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
20eb0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
20ec0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
20ed0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
20ee0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
20ef0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
20f00 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
20f10 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
20f20 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
20f30 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
20f40 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
20f50 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
20f60 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
20f70 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
20f80 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
20f90 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
20fa0 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
20fb0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
20fc0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
20fd0 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
20fe0 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
20ff0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
21000 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
21010 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
21020 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
21030 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
21040 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
21050 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
21060 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
21070 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
21080 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
21090 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
210a0 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
210b0 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
210c0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
210d0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
210e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
210f0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
21100 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
21110 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
21120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21130 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
21140 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
21150 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
21160 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
21170 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
21180 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
21190 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
211a0 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
211b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
211c0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
211d0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
211e0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
211f0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
21200 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
21210 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
21220 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
21230 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
21240 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
21250 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
21260 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
21270 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
21280 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
21290 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
212a0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
212b0 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
212c0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
212d0 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
212e0 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
212f0 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
21300 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
21310 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
21320 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
21330 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
21340 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
21350 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
21360 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
21370 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
21380 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
21390 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
213a0 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
213b0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
213c0 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
213d0 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
213e0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
213f0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
21400 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
21410 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
21420 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
21430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21440 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
21450 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
21460 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
21470 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
21480 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
21490 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
214a0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
214b0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
214c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
214d0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
214e0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
214f0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
21500 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
21510 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
21520 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
21530 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
21540 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
21550 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
21560 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
21570 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
21580 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
21590 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
215a0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
215b0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
215c0 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
215d0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
215e0 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
215f0 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
21600 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
21610 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
21620 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
21630 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
21640 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
21650 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
21660 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49   n>=1 && n<=SQLI
21670 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
21680 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
21690 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
216a0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
216b0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
216c0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
216d0 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
216e0 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
216f0 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
21700 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
21710 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
21720 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
21730 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
21740 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
21750 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
21760 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
21770 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
21780 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
21790 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
217a0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
217b0 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
217c0 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
217d0 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
217e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
217f0 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
21800 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
21810 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66  "));.  mask = of
21820 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a  st>31 ? 0xffff :
21830 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
21840 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
21850 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21860 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
21870 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
21880 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21890 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
218a0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
218b0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
218c0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
218d0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
218e0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
218f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
21900 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
21910 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21920 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
21930 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
21940 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
21950 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
21960 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
21970 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
21980 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
21990 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
219a0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
219b0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
219c0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
219d0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
219e0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
219f0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
21a00 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
21a10 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
21a20 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
21a30 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
21a40 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
21a50 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
21a60 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
21a70 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
21a80 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
21a90 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
21aa0 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
21ab0 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
21ac0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21ad0 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
21ae0 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
21af0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
21b00 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
21b10 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
21b20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
21b30 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
21b40 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
21b50 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
21b60 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
21b70 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
21b80 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
21b90 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
21ba0 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a          .}../*.*
21bb0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e  * Return the min
21bc0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33  imum number of 3
21bd0 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20  2KB shm regions 
21be0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  that should be m
21bf0 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69  apped at.** a ti
21c00 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  me, assuming tha
21c10 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  t each mapping m
21c20 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
21c30 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
21c40 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73  e.** current sys
21c50 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a  tem page-size..*
21c60 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
21c70 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63  is is 1. The exc
21c80 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20  eption seems to 
21c90 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  be systems that 
21ca0 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  are configured.*
21cb0 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61  * to use 64KB pa
21cc0 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61  ges - in this ca
21cd0 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  se each mapping 
21ce0 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65  must cover at le
21cf0 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72  ast two.** shm r
21d00 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  egions..*/.stati
21d10 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67  c int unixShmReg
21d20 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b  ionPerMap(void){
21d30 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33  .  int shmsz = 3
21d40 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20  2*1024;         
21d50 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e     /* SHM region
21d60 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70   size */.  int p
21d70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73  gsz = osGetpages
21d80 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74  ize();   /* Syst
21d90 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  em page size */.
21da0 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a    assert( ((pgsz
21db0 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20  -1)&pgsz)==0 ); 
21dc0 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d    /* Page size m
21dd0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
21de0 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73  f 2 */.  if( pgs
21df0 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e  z<shmsz ) return
21e00 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73   1;.  return pgs
21e10 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  z/shmsz;.}../*.*
21e20 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
21e30 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
21e40 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
21e50 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
21e60 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
21e70 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
21e80 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
21e90 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
21ea0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
21eb0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
21ec0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
21ed0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
21ee0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
21ef0 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
21f00 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
21f10 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
21f20 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
21f30 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
21f40 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
21f50 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d  ( p && ALWAYS(p-
21f60 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20  >nRef==0) ){.   
21f70 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
21f80 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
21f90 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74  erMap();.    int
21fa0 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
21fb0 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
21fc0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
21fd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
21fe0 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
21ff0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
22000 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
22010 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
22020 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
22030 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
22040 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
22050 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
22060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22070 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
22080 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
22090 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
220a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
220b0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
220c0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
220d0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
220e0 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
220f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
22100 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
22110 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
22120 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
22130 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
22140 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65    }.}../*.** Ope
22150 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
22160 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
22170 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
22180 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
22190 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
221a0 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
221b0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
221c0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
221d0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
221e0 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
221f0 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
22200 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
22210 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
22220 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
22230 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
22240 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
22250 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
22260 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
22270 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
22280 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
22290 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
222a0 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
222b0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
222c0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
222d0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
222e0 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
222f0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
22300 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
22310 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
22320 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
22330 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
22340 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
22350 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
22360 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
22370 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
22380 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
22390 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
223a0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
223b0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
223c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
223d0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
223e0 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
223f0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
22400 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
22410 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
22420 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
22430 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
22440 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
22450 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
22460 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
22470 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
22480 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
22490 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
224a0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
224b0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
224c0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
224d0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
224e0 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
224f0 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
22500 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
22510 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
22520 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
22530 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
22540 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
22550 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
22560 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
22570 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
22580 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
22590 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
225a0 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
225b0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
225c0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
225d0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
225e0 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
225f0 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
22600 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
22610 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
22620 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
22630 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
22640 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
22650 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
22660 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
22670 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
22680 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
22690 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
226a0 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
226b0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
226c0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
226d0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
226e0 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
226f0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
22700 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
22710 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
22720 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
22730 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
22740 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
22750 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
22760 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
22770 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
22780 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
22790 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
227a0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
227b0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
227c0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
227d0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
227e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
227f0 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
22800 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
22810 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
22820 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
22830 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
22840 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22850 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
22860 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
22870 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
22880 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
22890 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
228a0 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
228b0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
228c0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
228d0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
228e0 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
228f0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
22900 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
22910 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
22920 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
22930 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
22940 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
22950 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
22960 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
22970 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
22980 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
22990 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
229a0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
229b0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
229c0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
229d0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
229e0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
229f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
22a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a10 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
22a20 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
22a30 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
22a40 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
22a50 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
22a60 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
22a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
22a80 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
22a90 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
22aa0 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
22ab0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
22ac0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
22ad0 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
22ae0 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
22af0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
22b00 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
22b10 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
22b20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
22b30 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29  oc64( sizeof(*p)
22b40 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
22b50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
22b60 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d  OMEM_BKPT;.  mem
22b70 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
22b80 28 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (*p));.  assert(
22b90 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20   pDbFd->pShm==0 
22ba0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
22bb0 6f 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53  o see if a unixS
22bc0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c  hmNode object al
22bd0 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65  ready exists. Re
22be0 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a  use an existing.
22bf0 20 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73    ** one if pres
22c00 65 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65  ent. Create a ne
22c10 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61  w one if necessa
22c20 72 79 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ry..  */.  unixE
22c30 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
22c40 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
22c50 49 6e 6f 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64  Inode;.  pShmNod
22c60 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  e = pInode->pShm
22c70 4e 6f 64 65 3b 0a 20 20 69 66 28 20 70 53 68 6d  Node;.  if( pShm
22c80 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Node==0 ){.    s
22c90 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
22ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22cb0 20 20 2f 2a 20 66 73 74 61 74 28 29 20 69 6e 66    /* fstat() inf
22cc0 6f 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 66  o for database f
22cd0 69 6c 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ile */.#ifndef S
22ce0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
22cf0 4f 52 59 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ORY.    const ch
22d00 61 72 20 2a 7a 42 61 73 65 50 61 74 68 20 3d 20  ar *zBasePath = 
22d10 70 44 62 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65  pDbFd->zPath;.#e
22d20 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  ndif..    /* Cal
22d30 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69 67  l fstat() to fig
22d40 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72 6d  ure out the perm
22d50 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64  issions on the d
22d60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
22d70 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d  .    ** a new *-
22d80 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65 61  shm file is crea
22d90 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74 20  ted, an attempt 
22da0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f 20  will be made to 
22db0 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a 2a  create it.    **
22dc0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 70   with the same p
22dd0 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20  ermissions..    
22de0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74  */.    if( osFst
22df0 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73 53  at(pDbFd->h, &sS
22e00 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 72 63  tat) ){.      rc
22e10 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
22e20 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
22e30 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
22e40 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
22e50 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22e60 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
22e70 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
22e80 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22e90 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
22ea0 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
22eb0 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
22ec0 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65  n(zBasePath);.#e
22ed0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
22ee0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
22ef0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53  oc64( sizeof(*pS
22f00 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
22f10 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
22f20 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
22f30 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22f40 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
22f50 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
22f60 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
22f70 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64    memset(pShmNod
22f80 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53  e, 0, sizeof(*pS
22f90 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65  hmNode)+nShmFile
22fa0 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46  name);.    zShmF
22fb0 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f  ilename = pShmNo
22fc0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  de->zFilename = 
22fd0 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65  (char*)&pShmNode
22fe0 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
22ff0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
23000 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
23010 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
23020 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  me, zShmFilename
23030 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
23040 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53          SQLITE_S
23050 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73  HM_DIRECTORY "/s
23060 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22  qlite-shm-%x-%x"
23070 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23080 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61         (u32)sSta
23090 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73  t.st_ino, (u32)s
230a0 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65  Stat.st_dev);.#e
230b0 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  lse.    sqlite3_
230c0 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c  snprintf(nShmFil
230d0 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e  ename, zShmFilen
230e0 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a  ame, "%s-shm", z
230f0 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73  BasePath);.    s
23100 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
23110 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  3(pDbFd->zPath, 
23120 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  zShmFilename);.#
23130 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f  endif.    pShmNo
23140 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20  de->h = -1;.    
23150 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
23160 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f  ShmNode = pShmNo
23170 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  de;.    pShmNode
23180 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64  ->pInode = pDbFd
23190 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53  ->pInode;.    pS
231a0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
231b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
231c0 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
231d0 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20  _FAST);.    if( 
231e0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d  pShmNode->mutex=
231f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
23200 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
23210 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  PT;.      goto s
23220 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23230 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   }..    if( pIno
23240 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
23250 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
23260 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
23270 44 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20  DWR | O_CREAT;. 
23280 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
23290 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62  _uri_boolean(pDb
232a0 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64  Fd->zPath, "read
232b0 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b  only_shm", 0) ){
232c0 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
232d0 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
232e0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
232f0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
23300 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
23310 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
23320 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
23330 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  ename, openFlags
23340 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
23350 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69  &0777));.      i
23360 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
23370 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
23380 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
23390 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
233a0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
233b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
233c0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
233d0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _err;.      }.. 
233e0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
233f0 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69  process is runni
23400 6e 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65  ng as root, make
23410 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53   sure that the S
23420 48 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a  HM file.      **
23430 20 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65   is owned by the
23440 20 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20   same user that 
23450 6f 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61  owns the origina
23460 6c 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68  l database.  Oth
23470 65 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a  erwise,.      **
23480 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77   the original ow
23490 6e 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  ner will not be 
234a0 61 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e  able to connect.
234b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
234c0 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53 68  robustFchown(pSh
234d0 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e  mNode->h, sStat.
234e0 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74  st_uid, sStat.st
234f0 5f 67 69 64 29 3b 0a 20 20 0a 20 20 20 20 20 20  _gid);.  .      
23500 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
23510 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65  if another proce
23520 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68  ss is holding th
23530 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63  e dead-man switc
23540 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e  h..      ** If n
23550 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  ot, truncate the
23560 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
23570 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  ngth. .      */.
23580 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23590 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
235a0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
235b0 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
235c0 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
235d0 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
235e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62  .        if( rob
235f0 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
23600 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b  hmNode->h, 0) ){
23610 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
23620 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
23630 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
23640 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  N, "ftruncate", 
23650 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
23660 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
23670 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
23680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23690 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
236a0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
236b0 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f  , F_RDLCK, UNIX_
236c0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
236d0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
236e0 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65  c ) goto shm_ope
236f0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  n_err;.    }.  }
23700 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20  ..  /* Make the 
23710 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  new connection a
23720 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e   child of the un
23730 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70  ixShmNode */.  p
23740 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68  ->pShmNode = pSh
23750 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51  mNode;.#ifdef SQ
23760 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e  LITE_DEBUG.  p->
23770 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  id = pShmNode->n
23780 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64  extShmId++;.#end
23790 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  if.  pShmNode->n
237a0 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e  Ref++;.  pDbFd->
237b0 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78  pShm = p;.  unix
237c0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20  LeaveMutex();.. 
237d0 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63   /* The referenc
237e0 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e  e count on pShmN
237f0 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  ode has already 
23800 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64  been incremented
23810 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20   under.  ** the 
23820 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69  cover of the uni
23830 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75  xEnterMutex() mu
23840 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e  tex and the poin
23850 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a  ter from the.  *
23860 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e  * new (struct un
23870 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f  ixShm) object to
23880 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61   the pShmNode ha
23890 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20  s been set. All 
238a0 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66  that is.  ** lef
238b0 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69  t to do is to li
238c0 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63  nk the new objec
238d0 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65  t into the linke
238e0 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a  d list starting.
238f0 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65    ** at pShmNode
23900 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d  ->pFirst. This m
23910 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c  ust be done whil
23920 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53  e holding the pS
23930 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20  hmNode->mutex . 
23940 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a   ** mutex..  */.
23950 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23960 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
23970 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65  mutex);.  p->pNe
23980 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  xt = pShmNode->p
23990 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64  First;.  pShmNod
239a0 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20  e->pFirst = p;. 
239b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
239c0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
239d0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
239e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
239f0 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e   Jump here on an
23a00 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f  y error */.shm_o
23a10 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53  pen_err:.  unixS
23a20 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 20  hmPurge(pDbFd); 
23a30 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
23a40 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64  ll frees pShmNod
23a50 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  e if required */
23a60 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
23a70 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  p);.  unixLeaveM
23a80 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
23a90 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
23aa0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
23ab0 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
23ac0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67  a pointer to reg
23ad0 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74  ion iRegion of t
23ae0 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65  he .** shared-me
23af0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
23b00 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
23b10 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65  e file fd. Share
23b20 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
23b30 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65   .** are numbere
23b40 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20  d starting from 
23b50 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65  zero. Each share
23b60 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
23b70 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20  is szRegion .** 
23b80 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
23b90 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
23ba0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
23bb0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
23bc0 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65  ed and *pp is se
23bd0 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
23be0 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
23bf0 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d  he bExtend param
23c00 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
23c10 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
23c20 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67  ed-memory.** reg
23c30 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
23c40 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61   allocated (by a
23c50 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75  ny client, inclu
23c60 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67  ding one running
23c70 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74   in a.** separat
23c80 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e  e process), then
23c90 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e   *pp is set to N
23ca0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
23cb0 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a  K returned. If .
23cc0 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f  ** bExtend is no
23cd0 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72  n-zero and the r
23ce0 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d  equested shared-
23cf0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61  memory region ha
23d00 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65  s not yet .** be
23d10 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
23d20 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
23d30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
23d40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61  **.** If the sha
23d50 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f  red-memory regio
23d60 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
23d70 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20  en allocated or 
23d80 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a  is allocated by.
23d90 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20  ** this call as 
23da0 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c  described above,
23db0 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70   then it is mapp
23dc0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
23dd0 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65  cesses .** addre
23de0 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20  ss space (if it 
23df0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c  is not already),
23e00 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70   *pp is set to p
23e10 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70  oint to the mapp
23e20 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e  ed .** memory an
23e30 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
23e40 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
23e50 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a  int unixShmMap(.
23e60 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
23e70 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
23e80 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e    /* Handle open
23e90 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   on database fil
23ea0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69  e */.  int iRegi
23eb0 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  on,             
23ec0 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e         /* Region
23ed0 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a   to retrieve */.
23ee0 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20    int szRegion, 
23ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67    /* Size of reg
23f10 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45  ions */.  int bE
23f20 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20  xtend,          
23f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
23f40 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65  e to extend file
23f50 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
23f60 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65  .  void volatile
23f70 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20   **pp           
23f80 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65     /* OUT: Mappe
23f90 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
23fa0 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
23fb0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
23fc0 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a  ;.  unixShm *p;.
23fd0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
23fe0 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72  ShmNode;.  int r
23ff0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
24000 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
24010 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
24020 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e  erMap();.  int n
24030 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a  ReqRegion;..  /*
24040 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
24050 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e  emory file has n
24060 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
24070 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
24080 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d   */.  if( pDbFd-
24090 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  >pShm==0 ){.    
240a0 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61  rc = unixOpenSha
240b0 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29  redMemory(pDbFd)
240c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
240d0 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
240e0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20   rc;.  }..  p = 
240f0 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70  pDbFd->pShm;.  p
24100 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
24110 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33  mNode;.  sqlite3
24120 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
24130 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
24140 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f   assert( szRegio
24150 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52  n==pShmNode->szR
24160 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64  egion || pShmNod
24170 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b  e->nRegion==0 );
24180 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
24190 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
241a0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
241b0 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
241c0 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
241d0 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
241e0 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
241f0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
24200 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
24210 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
24220 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d  ck==0 );..  /* M
24230 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
24240 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72 65   regions require
24250 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e 20  d to be mapped. 
24260 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e 20  */.  nReqRegion 
24270 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d  = ((iRegion+nShm
24280 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65  PerMap) / nShmPe
24290 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d  rMap) * nShmPerM
242a0 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e  ap;..  if( pShmN
242b0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65  ode->nRegion<nRe
242c0 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63  qRegion ){.    c
242d0 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20  har **apNew;    
242e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242f0 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f    /* New apRegio
24300 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  n[] array */.   
24310 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52 65   int nByte = nRe
24320 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e  qRegion*szRegion
24330 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72  ;   /* Minimum r
24340 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
24350 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
24360 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
24370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
24380 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a  sed by fstat() *
24390 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  /..    pShmNode-
243a0 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65  >szRegion = szRe
243b0 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70  gion;..    if( p
243c0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
243d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65  .      /* The re
243e0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69  quested region i
243f0 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74  s not mapped int
24400 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
24410 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a   address space..
24420 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74        ** Check t
24430 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20  o see if it has 
24440 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28  been allocated (
24450 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d  i.e. if the wal-
24460 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20  index file is.  
24470 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f      ** large eno
24480 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ugh to contain t
24490 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
244a0 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ion)..      */. 
244b0 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
244c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73  (pShmNode->h, &s
244d0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
244e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
244f0 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20  RR_SHMSIZE;.    
24500 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
24510 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
24520 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74  .      if( sStat
24530 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29  .st_size<nByte )
24540 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
24550 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
24560 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f  y region does no
24570 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74  t exist. If bExt
24580 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20  end is set to.  
24590 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20        ** false, 
245a0 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20  exit early. *pp 
245b0 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e  will be set to N
245c0 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ULL and SQLITE_O
245d0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20  K returned..    
245e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
245f0 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a 20  f( !bExtend ){. 
24600 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
24610 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
24620 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
24630 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20   Alternatively, 
24640 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72  if bExtend is tr
24650 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20 66  ue, extend the f
24660 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79 0a  ile. Do this by.
24670 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 69          ** writi
24680 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  ng a single byte
24690 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 65   to the end of e
246a0 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62 65  ach (OS) page be
246b0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
246c0 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65  llocated or exte
246d0 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c  nded. Technicall
246e0 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20  y, we need only 
246f0 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20 20  write to the.   
24700 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61 67       ** last pag
24710 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78  e in order to ex
24720 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 42  tend the file. B
24730 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6c  ut writing to al
24740 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a  l new.        **
24750 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74 68   pages forces th
24760 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65  e OS to allocate
24770 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c   them immediatel
24780 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65 73  y, which reduces
24790 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
247a0 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42 55  chances of SIGBU
247b0 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  S while accessin
247c0 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67  g the mapped reg
247d0 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20  ion later on..  
247e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
247f0 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20   else{.         
24800 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
24810 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20  t pgsz = 4096;. 
24820 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 67           int iPg
24830 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
24840 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61 73  Write to the las
24850 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 6e  t byte of each n
24860 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f  ewly allocated o
24870 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65 20  r extended page 
24880 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  */.          ass
24890 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70 67  ert( (nByte % pg
248a0 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sz)==0 );.      
248b0 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53 74      for(iPg=(sSt
248c0 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29  at.st_size/pgsz)
248d0 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67 73  ; iPg<(nByte/pgs
248e0 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  z); iPg++){.    
248f0 20 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20          int x = 
24900 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  0;.            i
24910 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  f( seekAndWriteF
24920 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69  d(pShmNode->h, i
24930 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31  Pg*pgsz + pgsz-1
24940 2c 20 22 22 2c 20 31 2c 20 26 78 29 21 3d 31 20  , "", 1, &x)!=1 
24950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
24960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
24970 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  le = pShmNode->z
24980 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
24990 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
249a0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
249b0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
249c0 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b  "write", zFile);
249d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
249e0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
249f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
24a00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24a10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24a20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
24a30 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
24a40 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
24a50 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
24a60 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
24a70 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
24a80 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
24a90 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
24aa0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
24ab0 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69  n, nReqRegion*si
24ac0 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20  zeof(char *).   
24ad0 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
24ae0 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
24af0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
24b00 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
24b10 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
24b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d  ;.    }.    pShm
24b30 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d  Node->apRegion =
24b40 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c   apNew;.    whil
24b50 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  e( pShmNode->nRe
24b60 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
24b70 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61  ){.      int nMa
24b80 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68  p = szRegion*nSh
24b90 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69  mPerMap;.      i
24ba0 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64  nt i;.      void
24bb0 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66   *pMem;.      if
24bc0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
24bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d   ){.        pMem
24be0 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61   = osMmap(0, nMa
24bf0 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  p,.            p
24c00 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
24c10 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20  nly ? PROT_READ 
24c20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54  : PROT_READ|PROT
24c30 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20  _WRITE, .       
24c40 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c       MAP_SHARED,
24c50 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a   pShmNode->h, sz
24c60 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d  Region*(i64)pShm
24c70 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20  Node->nRegion.  
24c80 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
24c90 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46   if( pMem==MAP_F
24ca0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
24cb0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
24cc0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
24cd0 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22  R_SHMMAP, "mmap"
24ce0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  , pShmNode->zFil
24cf0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
24d00 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
24d10 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
24d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
24d30 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65     pMem = sqlite
24d40 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67  3_malloc64(szReg
24d50 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ion);.        if
24d60 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20  ( pMem==0 ){.   
24d70 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24d80 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
24d90 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68           goto sh
24da0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
24db0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d     }.        mem
24dc0 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52  set(pMem, 0, szR
24dd0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  egion);.      }.
24de0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
24df0 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b  i<nShmPerMap; i+
24e00 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d  +){.        pShm
24e10 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70  Node->apRegion[p
24e20 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24e30 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a 29 70  +i] = &((char*)p
24e40 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d  Mem)[szRegion*i]
24e50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24e60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
24e70 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b  n += nShmPerMap;
24e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70  .    }.  }..shmp
24e90 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70  age_out:.  if( p
24ea0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24eb0 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  >iRegion ){.    
24ec0 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  *pp = pShmNode->
24ed0 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e  apRegion[iRegion
24ee0 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
24ef0 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  *pp = 0;.  }.  i
24f00 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  f( pShmNode->isR
24f10 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53  eadonly && rc==S
24f20 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
24f30 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
24f40 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
24f50 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
24f60 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
24f70 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
24f80 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73  hange the lock s
24f90 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65  tate for a share
24fa0 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d-memory segment
24fb0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
24fc0 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  t the relationsh
24fd0 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45  ip between SHARE
24fe0 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20  d and EXCLUSIVE 
24ff0 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c  locks is a littl
25000 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68  e.** different h
25010 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69  ere than in posi
25020 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28  x.  In xShmLock(
25030 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72  ), one can go fr
25040 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74  om unlocked.** t
25050 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63  o shared and bac
25060 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  k or from unlock
25070 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
25080 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f  and back.  But o
25090 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f  ne may.** not go
250a0 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20   from shared to 
250b0 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f  exclusive or fro
250c0 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73  m exclusive to s
250d0 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  hared..*/.static
250e0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b   int unixShmLock
250f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
25100 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f   *fd,          /
25110 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
25120 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72  holding the shar
25130 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  ed memory */.  i
25140 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20  nt ofst,        
25150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
25160 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69  st lock to acqui
25170 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  re or release */
25180 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
25190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
251a0 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73   Number of locks
251b0 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
251c0 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
251d0 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20  flags           
251e0 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74         /* What t
251f0 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f  o do with the lo
25200 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  ck */.){.  unixF
25210 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
25220 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20  ixFile*)fd;     
25230 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68   /* Connection h
25240 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65  olding shared me
25250 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68  mory */.  unixSh
25260 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53  m *p = pDbFd->pS
25270 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
25280 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65  /* The shared me
25290 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65  mory being locke
252a0 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  d */.  unixShm *
252b0 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pX;             
252c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
252d0 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
252e0 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f   all siblings */
252f0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
25300 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
25310 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20  hmNode;  /* The 
25320 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20  underlying file 
25330 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72  iNode */.  int r
25340 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
25350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25360 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
25370 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20  */.  u16 mask;  
25380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
253a0 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74  sk of locks to t
253b0 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ake or release *
253c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  /..  assert( pSh
253d0 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
253e0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
253f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
25400 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
25410 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
25420 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30   assert( ofst>=0
25430 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49   && ofst+n<=SQLI
25440 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
25450 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29    assert( n>=1 )
25460 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67  ;.  assert( flag
25470 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
25480 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
25490 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
254a0 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
254b0 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c  E_SHM_LOCK | SQL
254c0 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
254d0 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61  E).       || fla
254e0 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
254f0 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  UNLOCK | SQLITE_
25500 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20  SHM_SHARED).    
25510 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
25520 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
25530 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
25540 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73  LUSIVE) );.  ass
25550 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c  ert( n==1 || (fl
25560 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
25570 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29  _EXCLUSIVE)!=0 )
25580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
25590 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44  Node->h>=0 || pD
255a0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  bFd->pInode->bPr
255b0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a  ocessLock==1 );.
255c0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
255d0 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64  de->h<0 || pDbFd
255e0 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
255f0 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20  ssLock==0 );..  
25600 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74  mask = (1<<(ofst
25610 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
25620 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20  ;.  assert( n>1 
25630 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73  || mask==(1<<ofs
25640 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t) );.  sqlite3_
25650 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
25660 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
25670 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
25680 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b  TE_SHM_UNLOCK ){
25690 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b  .    u16 allMask
256a0 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66   = 0; /* Mask of
256b0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73   locks held by s
256c0 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20  iblings */..    
256d0 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69  /* See if any si
256e0 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73  blings hold this
256f0 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20   same lock */.  
25700 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
25710 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
25720 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
25730 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20      if( pX==p ) 
25740 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
25750 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63  assert( (pX->exc
25760 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c  lMask & (p->excl
25770 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61  Mask|p->sharedMa
25780 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  sk))==0 );.     
25790 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e   allMask |= pX->
257a0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
257b0 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b  }..    /* Unlock
257c0 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65   the system-leve
257d0 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69  l locks */.    i
257e0 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61  f( (mask & allMa
257f0 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
25800 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
25810 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
25820 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
25830 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
25840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25850 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25860 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
25870 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
25880 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
25890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
258a0 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
258b0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
258c0 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
258d0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
258e0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
258f0 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
25900 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
25910 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
25920 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
25930 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
25940 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
25950 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
25960 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
25970 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
25980 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
25990 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
259a0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
259b0 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
259c0 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
259d0 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
259e0 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
259f0 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
25a00 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
25a10 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
25a20 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
25a30 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
25a40 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
25a50 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
25a60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
25a70 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
25a80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
25a90 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
25aa0 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
25ab0 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
25ac0 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
25ad0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
25ae0 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
25af0 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
25b00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25b10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
25b20 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
25b30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
25b40 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
25b50 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44  Lock(pDbFd, F_RD
25b60 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
25b70 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
25b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25b90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
25ba0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
25bb0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
25bc0 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63  local shared loc
25bd0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
25be0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25bf0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
25c00 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
25c10 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
25c20 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73  * Make sure no s
25c30 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
25c40 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68  ns hold locks th
25c50 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68  at will block th
25c60 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20  is.    ** lock. 
25c70 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75   If any do, retu
25c80 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72  rn SQLITE_BUSY r
25c90 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a  ight away..    *
25ca0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
25cb0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
25cc0 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
25cd0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
25ce0 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
25cf0 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61  )!=0 || (pX->sha
25d00 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  redMask & mask)!
25d10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
25d20 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
25d30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
25d50 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65      /* Get the e
25d60 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61  xclusive locks a
25d70 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76  t the system lev
25d80 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63  el.  Then if suc
25d90 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61  cessful.    ** a
25da0 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63  lso mark the loc
25db0 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73  al connection as
25dc0 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20   being locked.. 
25dd0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
25de0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25df0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
25e00 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46  mSystemLock(pDbF
25e10 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74  d, F_WRLCK, ofst
25e20 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20  +UNIX_SHM_BASE, 
25e30 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
25e40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25e50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
25e60 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  p->sharedMask & 
25e70 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20  mask)==0 );.    
25e80 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
25e90 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d  |= mask;.      }
25ea0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
25eb0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
25ec0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
25ed0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
25ee0 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64  HM-LOCK shmid-%d
25ef0 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33  , pid-%d got %03
25f00 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20  x,%03x\n",.     
25f10 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47        p->id, osG
25f20 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73 68 61  etpid(0), p->sha
25f30 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c  redMask, p->excl
25f40 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e  Mask));.  return
25f50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
25f60 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79  plement a memory
25f70 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f   barrier or memo
25f80 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72  ry fence on shar
25f90 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a  ed memory.  .**.
25fa0 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64  ** All loads and
25fb0 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65   stores begun be
25fc0 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72  fore the barrier
25fd0 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62   must complete b
25fe0 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61  efore.** any loa
25ff0 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e  d or store begun
26000 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69   after the barri
26010 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  er..*/.static vo
26020 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65  id unixShmBarrie
26030 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r(.  sqlite3_fil
26040 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20  e *fd           
26050 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
26060 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
26070 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
26080 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  */.){.  UNUSED_P
26090 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20  ARAMETER(fd);.  
260a0 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72  sqlite3MemoryBar
260b0 72 69 65 72 28 29 3b 20 20 20 20 20 20 20 20 20  rier();         
260c0 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69  /* compiler-defi
260d0 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69  ned memory barri
260e0 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  er */.  unixEnte
260f0 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  rMutex();       
26100 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20          /* Also 
26110 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e  mutex, for redun
26120 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c  dancy */.  unixL
26130 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a  eaveMutex();.}..
26140 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f  /*.** Close a co
26150 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72  nnection to shar
26160 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65  ed-memory.  Dele
26170 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  te the underlyin
26180 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66  g .** storage if
26190 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74   deleteFlag is t
261a0 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  rue..**.** If th
261b0 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64  ere is no shared
261c0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
261d0 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e  ed with the conn
261e0 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73  ection then this
261f0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61  .** routine is a
26200 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
26210 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
26220 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73  nixShmUnmap(.  s
26230 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
26240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26250 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
26260 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
26270 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c  /.  int deleteFl
26280 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
26290 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68      /* Delete sh
262a0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74  ared-memory if t
262b0 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  rue */.){.  unix
262c0 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Shm *p;         
262d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
262e0 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
262f0 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20   be closed */.  
26300 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
26310 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  mNode;          
26320 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
26330 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  g shared-memory 
26340 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  file */.  unixSh
26350 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20  m **pp;         
26360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
26370 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69   looping over si
26380 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
26390 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  s */.  unixFile 
263a0 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20  *pDbFd;         
263b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
263c0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
263d0 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62  e file */..  pDb
263e0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
263f0 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d  fd;.  p = pDbFd-
26400 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d  >pShm;.  if( p==
26410 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
26420 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  E_OK;.  pShmNode
26430 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
26440 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
26450 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
26460 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a  de->pShmNode );.
26470 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26480 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
26490 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20  d->pInode );..  
264a0 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
264b0 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
264c0 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
264d0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20  ns associated.  
264e0 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65  ** with pShmNode
264f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
26500 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
26510 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f  de->mutex);.  fo
26520 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e  r(pp=&pShmNode->
26530 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70  pFirst; (*pp)!=p
26540 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70  ; pp = &(*pp)->p
26550 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20  Next){}.  *pp = 
26560 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20  p->pNext;..  /* 
26570 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74  Free the connect
26580 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74  ion p */.  sqlit
26590 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44  e3_free(p);.  pD
265a0 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20  bFd->pShm = 0;. 
265b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
265c0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
265d0 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
265e0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68  pShmNode->nRef h
265f0 61 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68  as reached 0, th
26600 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64  en close the und
26610 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61  erlying.  ** sha
26620 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
26630 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e   too */.  unixEn
26640 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
26650 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
26660 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d  nRef>0 );.  pShm
26670 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  Node->nRef--;.  
26680 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
26690 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef==0 ){.    if(
266a0 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70   deleteFlag && p
266b0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
266c0 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
266d0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
266e0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
266f0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
26700 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Fd);.  }.  unixL
26710 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
26720 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
26730 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}...#else.# de
26740 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20  fine unixShmMap 
26750 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
26760 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a  nixShmLock    0.
26770 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
26780 42 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69  Barrier 0.# defi
26790 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20  ne unixShmUnmap 
267a0 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69    0.#endif /* #i
267b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
267c0 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51  T_WAL */..#if SQ
267d0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
267e0 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74  ZE>0./*.** If it
267f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65   is currently me
26800 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d  mory mapped, unm
26810 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a  ap file pFd..*/.
26820 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
26830 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  Unmapfile(unixFi
26840 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65  le *pFd){.  asse
26850 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
26860 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ut==0 );.  if( p
26870 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29  Fd->pMapRegion )
26880 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70  {.    osMunmap(p
26890 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20  Fd->pMapRegion, 
268a0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
268b0 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70  ual);.    pFd->p
268c0 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20  MapRegion = 0;. 
268d0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
268e0 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
268f0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
26900 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
26910 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74  Attempt to set t
26920 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d  he size of the m
26930 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61  emory mapping ma
26940 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65  intained by file
26950 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20   .** descriptor 
26960 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65  pFd to nNew byte
26970 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20  s. Any existing 
26980 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61  mapping is disca
26990 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  rded..**.** If s
269a0 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20  uccessful, this 
269b0 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68  function sets th
269c0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
269d0 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ables:.**.**    
269e0 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70     unixFile.pMap
269f0 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20  Region.**       
26a00 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
26a10 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  e.**       unixF
26a20 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75  ile.mmapSizeActu
26a30 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75  al.**.** If unsu
26a40 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72  ccessful, an err
26a50 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f  or message is lo
26a60 67 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33  gged via sqlite3
26a70 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68  _log() and.** th
26a80 65 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65  e three variable
26a90 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f  s above are zero
26aa0 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
26ab0 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a   SQLite should.*
26ac0 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73  * continue acces
26ad0 73 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  sing the databas
26ae0 65 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61  e using the xRea
26af0 64 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29  d() and xWrite()
26b00 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  .** methods..*/.
26b10 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
26b20 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69  Remapfile(.  uni
26b30 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20  xFile *pFd,     
26b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b50 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
26b60 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20  object */.  i64 
26b70 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20  nNew            
26b80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26b90 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20  equired mapping 
26ba0 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  size */.){.  con
26bb0 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  st char *zErr = 
26bc0 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20  "mmap";.  int h 
26bd0 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20  = pFd->h;       
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26bf0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
26c00 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c  r open on db fil
26c10 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67  e */.  u8 *pOrig
26c20 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d   = (u8 *)pFd->pM
26c30 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50  apRegion;   /* P
26c40 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e  ointer to curren
26c50 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a  t file mapping *
26c60 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20  /.  i64 nOrig = 
26c70 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
26c80 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65  ual;     /* Size
26c90 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e   of pOrig region
26ca0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
26cb0 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20  8 *pNew = 0;    
26cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26cd0 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20      /* Location 
26ce0 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a  of new mapping *
26cf0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  /.  int flags = 
26d00 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20  PROT_READ;      
26d10 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
26d20 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61  s to pass to mma
26d30 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  p() */..  assert
26d40 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
26d50 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
26d60 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53   nNew>pFd->mmapS
26d70 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
26d80 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70   nNew<=pFd->mmap
26d90 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73  SizeMax );.  ass
26da0 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20  ert( nNew>0 );. 
26db0 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d   assert( pFd->mm
26dc0 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46  apSizeActual>=pF
26dd0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20  d->mmapSize );. 
26de0 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49   assert( MAP_FAI
26df0 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65  LED!=0 );..#ifde
26e00 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45  f SQLITE_MMAP_RE
26e10 41 44 57 52 49 54 45 0a 20 20 69 66 28 20 28 70  ADWRITE.  if( (p
26e20 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
26e30 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29  UNIXFILE_RDONLY)
26e40 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50  ==0 ) flags |= P
26e50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69  ROT_WRITE;.#endi
26e60 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29  f..  if( pOrig )
26e70 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  {.#if HAVE_MREMA
26e80 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  P.    i64 nReuse
26e90 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
26ea0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73  ;.#else.    cons
26eb0 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20  t int szSyspage 
26ec0 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
26ed0 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  );.    i64 nReus
26ee0 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69  e = (pFd->mmapSi
26ef0 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65  ze & ~(szSyspage
26f00 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
26f10 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72   u8 *pReq = &pOr
26f20 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20  ig[nReuse];..   
26f30 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61   /* Unmap any pa
26f40 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74  ges of the exist
26f50 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74  ing mapping that
26f60 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65   cannot be reuse
26f70 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52  d. */.    if( nR
26f80 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20  euse!=nOrig ){. 
26f90 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52       osMunmap(pR
26fa0 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65  eq, nOrig-nReuse
26fb0 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41  );.    }..#if HA
26fc0 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e  VE_MREMAP.    pN
26fd0 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f  ew = osMremap(pO
26fe0 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65  rig, nReuse, nNe
26ff0 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56  w, MREMAP_MAYMOV
27000 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22  E);.    zErr = "
27010 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20  mremap";.#else. 
27020 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
27030 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75  (pReq, nNew-nReu
27040 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  se, flags, MAP_S
27050 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65  HARED, h, nReuse
27060 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21  );.    if( pNew!
27070 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
27080 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70       if( pNew!=p
27090 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  Req ){.        o
270a0 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e  sMunmap(pNew, nN
270b0 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20  ew - nReuse);.  
270c0 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
270d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
270e0 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69       pNew = pOri
270f0 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
27100 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
27110 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65  The attempt to e
27120 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69  xtend the existi
27130 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  ng mapping faile
27140 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20  d. Free it. */. 
27150 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50     if( pNew==MAP
27160 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d  _FAILED || pNew=
27170 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  =0 ){.      osMu
27180 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  nmap(pOrig, nReu
27190 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
271a0 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20    /* If pNew is 
271b0 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20  still NULL, try 
271c0 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74  to create an ent
271d0 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e  irely new mappin
271e0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77  g. */.  if( pNew
271f0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ==0 ){.    pNew 
27200 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77  = osMmap(0, nNew
27210 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
27220 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a  RED, h, 0);.  }.
27230 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50  .  if( pNew==MAP
27240 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70  _FAILED ){.    p
27250 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65  New = 0;.    nNe
27260 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c  w = 0;.    unixL
27270 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f  ogError(SQLITE_O
27280 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50  K, zErr, pFd->zP
27290 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ath);..    /* If
272a0 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76   the mmap() abov
272b0 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65  e failed, assume
272c0 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
272d0 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c  uent mmap() call
272e0 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72  s.    ** will pr
272f0 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e  obably fail too.
27300 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73   Fall back to us
27310 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
27320 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20   exclusively.   
27330 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
27340 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d  .  */.    pFd->m
27350 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a  mapSizeMax = 0;.
27360 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52    }.  pFd->pMapR
27370 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29  egion = (void *)
27380 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61  pNew;.  pFd->mma
27390 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  pSize = pFd->mma
273a0 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e  pSizeActual = nN
273b0 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  ew;.}../*.** Mem
273c0 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70  ory map or remap
273d0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
273e0 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70   by file-descrip
273f0 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20  tor pFd (if the 
27400 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61  file.** is alrea
27410 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65  dy mapped, the e
27420 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
27430 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
27440 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20  he new). Or, if 
27450 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
27460 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
27470 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
27480 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
27490 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61  still .** outsta
274a0 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72  nding xFetch() r
274b0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c  eferences to it,
274c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
274d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
274e0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42   If parameter nB
274f0 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  yte is non-negat
27500 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ive, then it is 
27510 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
27520 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61  ze of .** the ma
27530 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e  pping to create.
27540 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
27550 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
27560 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
27570 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73   .** requested s
27580 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
27590 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
275a0 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
275b0 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
275c0 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
275d0 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
275e0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
275f0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
27600 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51  red .** using SQ
27610 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
27620 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72  LIMIT, whichever
27630 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a   is smaller..**.
27640 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
27650 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
27660 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65  rror occurs (eve
27670 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67  n if the mapping
27680 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65   is not.** recre
27690 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  ated as a result
276a0 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
276b0 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61  references) or a
276c0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
276d0 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
276e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
276f0 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
27700 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
27710 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Map){.  assert( 
27720 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
27730 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
27740 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30    assert( nMap>0
27750 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69   || (pFd->mmapSi
27760 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d  ze==0 && pFd->pM
27770 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a  apRegion==0) );.
27780 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63    if( pFd->nFetc
27790 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20  hOut>0 ) return 
277a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
277b0 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20  ( nMap<0 ){.    
277c0 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
277d0 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  buf;          /*
277e0 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
277f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
27800 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70     if( osFstat(p
27810 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29  Fd->h, &statbuf)
27820 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
27830 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
27840 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  TAT;.    }.    n
27850 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74  Map = statbuf.st
27860 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  _size;.  }.  if(
27870 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
27880 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
27890 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
278a0 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73  zeMax;.  }..  as
278b0 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20  sert( nMap>0 || 
278c0 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d  (pFd->mmapSize==
278d0 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65  0 && pFd->pMapRe
278e0 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  gion==0) );.  if
278f0 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
27900 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69  pSize ){.    uni
27910 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20  xRemapfile(pFd, 
27920 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  nMap);.  }..  re
27930 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
27940 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
27950 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
27960 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  >0 */../*.** If 
27970 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e  possible, return
27980 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
27990 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20  mapping of file 
279a0 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  fd starting at o
279b0 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54  ffset.** iOff. T
279c0 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  he mapping must 
279d0 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20  be valid for at 
279e0 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73  least nAmt bytes
279f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20  ..**.** If such 
27a00 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65  a pointer can be
27a10 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65   obtained, store
27a20 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72   it in *pp and r
27a30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27a40 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63  .** Or, if one c
27a50 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72  annot but no err
27a60 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
27a70 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  pp to 0 and retu
27a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
27a90 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20   Finally, if an 
27aa0 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72  error does occur
27ab0 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  , return an SQLi
27ac0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54  te error code. T
27ad0 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  he final.** valu
27ae0 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65  e of *pp is unde
27af0 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
27b00 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  se..**.** If thi
27b10 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
27b20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
27b30 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  , the caller mus
27b40 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a  t eventually .**
27b50 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66   release the ref
27b60 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e  erence by callin
27b70 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e  g unixUnfetch().
27b80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
27b90 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33  nixFetch(sqlite3
27ba0 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
27bb0 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76  Off, int nAmt, v
27bc0 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53  oid **pp){.#if S
27bd0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
27be0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
27bf0 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
27c00 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
27c10 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
27c20 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e  base file */.#en
27c30 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a  dif.  *pp = 0;..
27c40 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
27c50 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
27c60 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
27c70 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  x>0 ){.    if( p
27c80 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d  Fd->pMapRegion==
27c90 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  0 ){.      int r
27ca0 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28  c = unixMapfile(
27cb0 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  pFd, -1);.      
27cc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27cd0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
27ce0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64     }.    if( pFd
27cf0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f  ->mmapSize >= iO
27d00 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20  ff+nAmt ){.     
27d10 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70   *pp = &((u8 *)p
27d20 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b  Fd->pMapRegion)[
27d30 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64  iOff];.      pFd
27d40 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20  ->nFetchOut++;. 
27d50 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
27d60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  OK;.}../*.** If 
27d80 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
27d90 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  nt is non-NULL, 
27da0 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  then this functi
27db0 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a  on releases a .*
27dc0 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61  * reference obta
27dd0 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ined by an earli
27de0 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  er call to unixF
27df0 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f  etch(). The seco
27e00 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70  nd.** argument p
27e10 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
27e20 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74  nction must be t
27e30 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63  he same as the c
27e40 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
27e50 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61  argument that wa
27e60 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  s passed to the 
27e70 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f  unixFetch() invo
27e80 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f  cation. .**.** O
27e90 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20  r, if the third 
27ea0 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c  argument is NULL
27eb0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
27ec0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
27ed0 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f  lled .** to info
27ee0 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72  rm the VFS layer
27ef0 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67   that, according
27f00 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65   to POSIX, any e
27f10 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
27f20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69  .** may now be i
27f30 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c  nvalid and shoul
27f40 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a  d be unmapped..*
27f50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
27f60 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33  xUnfetch(sqlite3
27f70 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69  _file *fd, i64 i
27f80 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23  Off, void *p){.#
27f90 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
27fa0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78  AP_SIZE>0.  unix
27fb0 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69  File *pFd = (uni
27fc0 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a  xFile *)fd;   /*
27fd0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
27fe0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27ff0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
28000 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a  TER(iOff);..  /*
28010 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20   If p==0 (unmap 
28020 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29  the entire file)
28030 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
28040 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69   be no outstandi
28050 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20  ng .  ** xFetch 
28060 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20  references. Or, 
28070 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67  if p!=0 (meaning
28080 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68   it is an xFetch
28090 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a   reference),.  *
280a0 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  * then there mus
280b0 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e  t be at least on
280c0 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20  e outstanding.  
280d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d  */.  assert( (p=
280e0 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63  =0)==(pFd->nFetc
280f0 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f  hOut==0) );..  /
28100 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75  * If p!=0, it mu
28110 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66  st match the iOf
28120 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73  f value. */.  as
28130 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d  sert( p==0 || p=
28140 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d  =&((u8 *)pFd->pM
28150 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20  apRegion)[iOff] 
28160 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  );..  if( p ){. 
28170 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75     pFd->nFetchOu
28180 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t--;.  }else{.  
28190 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
281a0 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  pFd);.  }..  ass
281b0 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68  ert( pFd->nFetch
281c0 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a  Out>=0 );.#else.
281d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
281e0 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44  ER(fd);.  UNUSED
281f0 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
28200 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
28210 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a  R(iOff);.#endif.
28220 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28230 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  OK;.}../*.** Her
28240 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65  e ends the imple
28250 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c  mentation of all
28260 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
28270 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  thods..**.******
28280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28290 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c   End sqlite3_fil
282a0 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e Methods ******
282b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
282c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
282d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
282e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
282f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28310 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a  ********/../*.**
28320 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
28330 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
28340 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  ons of sqlite3_i
28350 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
28360 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d  s that.** implem
28370 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65  ent various file
28380 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
28390 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f  ies.  It also co
283a0 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
283b0 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72  ns.** of "finder
283c0 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20  " functions.  A 
283d0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
283e0 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74  is used to locat
283f0 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  e the appropriat
28400 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f  e.** sqlite3_io_
28410 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66  methods object f
28420 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  or a particular 
28430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
28440 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20  The pAppData.** 
28450 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c  field of the sql
28460 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a  ite3_vfs VFS obj
28470 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c  ects are initial
28480 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74  ized to be point
28490 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f  ers to.** the co
284a0 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e  rrect finder-fun
284b0 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56  ction for that V
284c0 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66  FS..**.** Most f
284d0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  inder functions 
284e0 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
284f0 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69   to a fixed sqli
28500 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
28510 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f  * object.  The o
28520 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20  nly interesting 
28530 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
28540 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  is autolockIoFin
28550 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f  der, which.** lo
28560 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73  oks at the files
28570 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74  ystem type and t
28580 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68  ries to guess th
28590 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a  e best locking.*
285a0 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20  * strategy from 
285b0 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  that..**.** For 
285c0 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
285d0 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61  F, two objects a
285e0 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a  re created:.**.*
285f0 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61  *    (1) The rea
28600 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  l finder-functio
28610 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29  n named "FImpt()
28620 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  "..**.**    (2) 
28630 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74  A constant point
28640 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  er to this funct
28650 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22  ion named just "
28660 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70  F"..**.**.** A p
28670 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20  ointer to the F 
28680 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20  pointer is used 
28690 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20  as the pAppData 
286a0 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a  value for VFS.**
286b0 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61   objects.  We ha
286c0 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e  ve to do this in
286d0 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
286e0 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a   pAppData point.
286f0 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74  ** directly at t
28700 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  he finder-functi
28710 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c  on since C90 rul
28720 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69  es prevent a voi
28730 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61  d*.** from be ca
28740 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69  st into a functi
28750 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a  on pointer..**.*
28760 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e  *.** Each instan
28770 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f  ce of this macro
28780 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f   generates two o
28790 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  bjects:.**.**   
287a0 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71  *  A constant sq
287b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
287c0 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54   object call MET
287d0 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63  HOD that has loc
287e0 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74  king.**      met
287f0 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b  hods CLOSE, LOCK
28800 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c  , UNLOCK, CKRESL
28810 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  OCK..**.**   *  
28820 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69  An I/O method fi
28830 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61  nder function ca
28840 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74  lled FINDER that
28850 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74   returns a point
28860 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  er.**      to th
28870 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20  e METHOD object 
28880 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
28890 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69  bullet..*/.#defi
288a0 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e  ne IOMETHODS(FIN
288b0 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49  DER,METHOD,VERSI
288c0 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e  ON,CLOSE,LOCK,UN
288d0 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d  LOCK,CKLOCK,SHMM
288e0 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63  AP)     \.static
288f0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
28900 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44  o_methods METHOD
28910 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   = {            
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53         \.   VERS
28940 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ION,            
28950 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
28960 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45        \.   CLOSE
28990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
289a0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
289b0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
289c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289d0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65       \.   unixRe
289e0 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ad,             
289f0 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a        /* xRead *
28a00 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69      \.   unixWri
28a30 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28a40 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a       /* xWrite *
28a50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e     \.   unixTrun
28a80 63 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  cate,           
28a90 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65      /* xTruncate
28aa0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c    \.   unixSync,
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20     /* xSync */  
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b10 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69   \.   unixFileSi
28b20 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
28b30 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a    /* xFileSize *
28b40 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b60 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20  \.   LOCK,      
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20   /* xLock */    
28b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28bb0 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20  .   UNLOCK,     
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20  /* xUnlock */   
28be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28c00 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20     CKLOCK,      
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28c20 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
28c30 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
28c40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28c50 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f    unixFileContro
28c60 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  l,            /*
28c70 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f   xFileControl */
28c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28ca0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c   unixSectorSize,
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28cc0 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20  xSectorSize */  
28cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ce0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28cf0 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
28d00 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78  teristics,  /* x
28d10 44 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69  DeviceCapabiliti
28d20 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  es */           
28d30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53            \.   S
28d40 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20  HMMAP,          
28d50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
28d60 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20  hmMap */        
28d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d80 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28d90 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20  ixShmLock,      
28da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
28db0 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  mLock */        
28dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28dd0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28de0 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20  xShmBarrier,    
28df0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
28e00 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20  Barrier */      
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
28e30 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20  ShmUnmap,       
28e40 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55          /* xShmU
28e50 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  nmap */         
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e70 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
28e80 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
28e90 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68         /* xFetch
28ea0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ec0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e       \.   unixUn
28ed0 66 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20  fetch,          
28ee0 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63        /* xUnfetc
28ef0 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  h */            
28f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f10 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20      \.};        
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f60 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
28f70 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
28f80 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d  hods *FINDER##Im
28f90 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  pl(const char *z
28fa0 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20  , unixFile *p){ 
28fb0 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52    \.  UNUSED_PAR
28fc0 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45  AMETER(z); UNUSE
28fd0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20  D_PARAMETER(p); 
28fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29000 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54   \.  return &MET
29010 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20  HOD;            
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29050 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  \.}             
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
290a0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
290b0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
290c0 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52   *(*const FINDER
290d0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
290e0 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a  ixFile *p)    \.
290f0 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d      = FINDER##Im
29100 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20  pl;../*.** Here 
29110 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73  are all of the s
29120 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29130 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  s objects for ea
29140 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  ch of the.** loc
29150 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
29160 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74    Functions that
29170 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73   return pointers
29180 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64   to these method
29190 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72  s.** are also cr
291a0 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48  eated..*/.IOMETH
291b0 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69  ODS(.  posixIoFi
291c0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
291d0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
291e0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f  ion name */.  po
291f0 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  sixIoMethods,   
29200 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29210 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29220 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
29230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29240 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29250 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d  ed memory and mm
29260 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a  ap are enabled *
29270 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29290 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
292a0 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
292c0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
292d0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20  .  unixUnlock,  
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
292f0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29300 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
29310 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
29320 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29330 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29340 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20  unixShmMap      
29350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29360 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29370 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f  .IOMETHODS(.  no
29380 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20  lockIoFinder,   
29390 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
293a0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
293b0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  */.  nolockIoMet
293c0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f  hods,          /
293d0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
293e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
293f0 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29420 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29430 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
29440 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29450 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29460 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
29470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29480 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29490 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
294a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
294b0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
294c0 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
294d0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78  ervedLock,  /* x
294e0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
294f0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29520 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
29530 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
29540 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
29550 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29560 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29570 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
29580 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
29590 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
295a0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
295b0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
295d0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
295e0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
295f0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
29600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29610 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29620 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
29630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29640 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
29650 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
29660 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29670 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29680 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
29690 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68  rvedLock, /* xCh
296a0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
296b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296d0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
296e0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
296f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
29700 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
29710 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
29720 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
29730 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
29740 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
29750 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
29760 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
29770 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
29780 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
29790 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
297a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297b0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
297c0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
297d0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
297e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
297f0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
29800 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
29810 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
29820 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
29830 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
29840 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
29850 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
29860 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
29870 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
29880 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
29890 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
298c0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
298d0 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
298e0 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
298f0 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
29900 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
29910 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
29920 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
29930 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
29940 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
29950 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
29960 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29980 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
29990 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
299a0 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20  /.  semXClose,  
299b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
299c0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
299d0 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20  /.  semXLock,   
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
299f0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
29a00 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20  .  semXUnlock,  
29a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29a20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
29a30 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73  /.  semXCheckRes
29a40 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
29a50 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
29a60 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29a70 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
29a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
29a90 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
29aa0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
29ab0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
29ac0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
29ad0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
29ae0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
29af0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
29b00 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
29b10 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
29b20 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
29b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29b50 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
29b60 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29b80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
29b90 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
29ba0 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
29bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
29bc0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
29bd0 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
29be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
29bf0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
29c00 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
29c10 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
29c20 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
29c30 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
29c40 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
29c50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
29c60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
29c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c80 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
29c90 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
29ca0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
29cb0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
29cc0 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
29cd0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
29ce0 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
29cf0 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
29d00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
29d10 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
29d20 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
29d30 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
29d40 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
29d50 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
29d60 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
29d70 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
29d80 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
29d90 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
29da0 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
29db0 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
29dc0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
29dd0 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
29de0 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
29df0 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
29e00 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
29e10 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
29e20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
29e30 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
29e40 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
29e50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
29e60 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
29e70 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
29e80 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
29e90 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29ea0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
29eb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
29ec0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
29ed0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
29ee0 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
29ef0 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
29f00 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
29f10 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
29f20 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
29f30 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
29f40 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
29f50 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29f60 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
29f70 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
29f80 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
29f90 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
29fa0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
29fb0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
29fc0 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
29fd0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29fe0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29ff0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2a000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a010 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2a020 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2a030 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
2a040 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2a050 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2a060 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
2a070 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a080 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2a090 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
2a0a0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2a0b0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2a0c0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
2a0d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2a0e0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2a0f0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2a100 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a120 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2a130 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2a140 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
2a150 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
2a160 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
2a170 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
2a180 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
2a190 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2a1a0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2a1b0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2a1c0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
2a1d0 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
2a1e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2a1f0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2a200 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
2a210 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2a220 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2a230 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2a240 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2a270 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2a280 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
2a290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a2a0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2a2b0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
2a2c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a2d0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2a2e0 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
2a2f0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2a300 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2a310 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
2a320 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2a330 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
2a340 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a350 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2a380 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2a390 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2a3a0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2a3b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a3c0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
2a3d0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2a3e0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2a3f0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
2a400 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
2a410 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
2a420 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
2a430 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
2a440 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
2a450 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a460 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
2a470 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
2a480 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
2a490 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
2a4a0 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
2a4b0 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a4c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
2a4d0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2a4e0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2a4f0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2a500 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2a510 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2a520 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2a530 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
2a540 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
2a550 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2a560 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
2a570 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2a580 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
2a590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2a5a0 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
2a5b0 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
2a5c0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
2a5d0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
2a5e0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
2a5f0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
2a600 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
2a610 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
2a620 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
2a630 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
2a640 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2a650 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
2a660 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2a670 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
2a680 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2a690 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
2a6a0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
2a6b0 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
2a6c0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
2a6d0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
2a6e0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
2a6f0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2a700 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
2a710 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2a720 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2a730 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2a740 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2a750 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2a760 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2a770 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2a780 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2a790 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2a7a0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2a7b0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2a7c0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
2a7d0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
2a7e0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
2a7f0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
2a800 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
2a810 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
2a820 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a830 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
2a840 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
2a850 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2a860 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2a870 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2a880 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
2a890 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
2a8a0 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2a8b0 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
2a8c0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
2a8d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2a8e0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
2a8f0 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
2a900 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
2a910 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
2a920 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
2a930 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
2a940 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
2a950 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
2a960 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2a970 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
2a980 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
2a990 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2a9a0 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2a9b0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2a9c0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2a9d0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2a9e0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2a9f0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2aa00 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2aa10 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2aa20 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2aa30 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2aa40 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2aa50 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
2aa60 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2aa70 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
2aa80 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2aa90 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2aaa0 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2aab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2aac0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
2aad0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2aae0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2aaf0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2ab00 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
2ab10 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2ab20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2ab30 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
2ab40 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2ab50 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
2ab60 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2ab70 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2ab80 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
2ab90 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54  _VXWORKS./*.** T
2aba0 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
2abb0 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b  ction for VxWork
2abc0 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  s checks to see 
2abd0 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  if posix advisor
2abe0 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  y.** locking wor
2abf0 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ks.  If it does,
2ac00 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68   then that is wh
2ac10 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  at is used.  If 
2ac20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77  it does not.** w
2ac30 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61  ork, then fallba
2ac40 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61  ck to named sema
2ac50 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  phore locking..*
2ac60 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2ac70 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2ac80 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  s *vxworksIoFind
2ac90 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2aca0 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2acb0 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2acc0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2acd0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2ace0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2acf0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
2ad00 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2ad10 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2ad20 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2ad30 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2ad40 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2ad50 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2ad60 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2ad70 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2ad80 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2ad90 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2ada0 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2adb0 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2adc0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
2add0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
2ade0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
2adf0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
2ae00 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
2ae10 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2ae20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
2ae30 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
2ae40 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
2ae50 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2ae60 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2ae70 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2ae80 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2ae90 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2aea0 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2aeb0 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2aec0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2aed0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2aee0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
2aef0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2af00 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2af10 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
2af20 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2af30 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2af40 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2af50 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49  (*const vxworksI
2af60 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2af70 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2af80 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  = vxworksIoFinde
2af90 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2afa0 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
2afb0 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
2afc0 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
2afd0 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d  inter to an IO m
2afe0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
2aff0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
2b000 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
2b010 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
2b020 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
2b030 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2b040 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
2b050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b090 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2b0a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2b0b0 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2b0c0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2b0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b0e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
2b0f0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
2b100 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2b110 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
2b120 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
2b130 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
2b140 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2b150 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2b160 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2b170 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
2b180 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
2b190 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
2b1a0 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
2b1b0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2b1c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2b1d0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
2b1e0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
2b1f0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
2b200 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2b210 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
2b220 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2b230 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
2b240 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2b250 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2b260 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2b270 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2b280 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
2b290 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2b2a0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
2b2b0 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
2b2c0 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
2b2d0 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
2b2e0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
2b2f0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2b300 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
2b310 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
2b320 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
2b330 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
2b340 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b350 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
2b360 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
2b370 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20  ;..  /* Usually 
2b380 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e 61  the path zFilena
2b390 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  me should not be
2b3a0 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74 68   a relative path
2b3b0 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65  name. The.  ** e
2b3c0 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65 6e  xception is when
2b3d0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72 6f   opening the pro
2b3e0 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65 20  xy "conch" file 
2b3f0 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a 20  in builds that. 
2b400 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65 20   ** include the 
2b410 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f  special Apple lo
2b420 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20  cking styles..  
2b430 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
2b440 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2b450 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b460 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65 72  NG_STYLE.  asser
2b470 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
2b480 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
2b490 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56 66  ='/' .    || pVf
2b4a0 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76 6f  s->pAppData==(vo
2b4b0 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
2b4c0 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20  inder );.#else. 
2b4d0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2b4e0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
2b4f0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65  me[0]=='/' );.#e
2b500 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f  ndif..  /* No lo
2b510 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20  cking occurs in 
2b520 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
2b530 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  */.  assert( zFi
2b540 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74  lename!=0 || (ct
2b550 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
2b560 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b  LE_NOLOCK)!=0 );
2b570 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50  ..  OSTRACE(("OP
2b580 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22  EN    %-3d %s\n"
2b590 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29  , h, zFilename))
2b5a0 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b  ;.  pNew->h = h;
2b5b0 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20  .  pNew->pVfs = 
2b5c0 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50  pVfs;.  pNew->zP
2b5d0 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
2b5e0 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61  .  pNew->ctrlFla
2b5f0 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61  gs = (u8)ctrlFla
2b600 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  gs;.#if SQLITE_M
2b610 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
2b620 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d   pNew->mmapSizeM
2b630 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  ax = sqlite3Glob
2b640 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b  alConfig.szMmap;
2b650 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71  .#endif.  if( sq
2b660 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
2b670 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20  n(((ctrlFlags & 
2b680 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20  UNIXFILE_URI) ? 
2b690 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a  zFilename : 0),.
2b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6b0 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77             "psow
2b6c0 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53  ", SQLITE_POWERS
2b6d0 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29  AFE_OVERWRITE) )
2b6e0 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
2b6f0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
2b700 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  E_PSOW;.  }.  if
2b710 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a  ( strcmp(pVfs->z
2b720 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22  Name,"unix-excl"
2b730 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  )==0 ){.    pNew
2b740 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2b750 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20  NIXFILE_EXCL;.  
2b760 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  }..#if OS_VXWORK
2b770 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20  S.  pNew->pId = 
2b780 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
2b790 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  d(zFilename);.  
2b7a0 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30  if( pNew->pId==0
2b7b0 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67   ){.    ctrlFlag
2b7c0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  s |= UNIXFILE_NO
2b7d0 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  LOCK;.    rc = S
2b7e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2b7f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
2b800 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20  if( ctrlFlags & 
2b810 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20  UNIXFILE_NOLOCK 
2b820 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  ){.    pLockingS
2b830 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  tyle = &nolockIo
2b840 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
2b850 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2b860 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72  yle = (**(finder
2b870 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70  _type*)pVfs->pAp
2b880 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65  pData)(zFilename
2b890 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c  , pNew);.#if SQL
2b8a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2b8b0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
2b8c0 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  Cache zFilename 
2b8d0 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63  in the locking c
2b8e0 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20  ontext (AFP and 
2b8f0 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65  dotlock override
2b900 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f  ) for.    ** pro
2b910 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f  xyLock activatio
2b920 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72  n is possible (r
2b930 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62  emote proxy is b
2b940 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29  ased on db name)
2b950 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d  .    ** zFilenam
2b960 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  e remains valid 
2b970 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c  until file is cl
2b980 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74  osed, to support
2b990 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f   */.    pNew->lo
2b9a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28  ckingContext = (
2b9b0 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b  void*)zFilename;
2b9c0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69  .#endif.  }..  i
2b9d0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2b9e0 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68   == &posixIoMeth
2b9f0 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ods.#if defined(
2ba00 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2ba10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2ba20 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c  ING_STYLE.    ||
2ba30 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2ba40 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a  = &nfsIoMethods.
2ba50 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20  #endif.  ){.    
2ba60 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2ba70 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49  ;.    rc = findI
2ba80 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26  nodeInfo(pNew, &
2ba90 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20  pNew->pInode);. 
2baa0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2bab0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
2bac0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2bad0 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f  urred in findIno
2bae0 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20  deInfo(), close 
2baf0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2bb00 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d  tor.      ** imm
2bb10 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65  ediately, before
2bb20 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d   releasing the m
2bb30 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49  utex. findInodeI
2bb40 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20  nfo() may fail. 
2bb50 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73       ** in two s
2bb60 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20  cenarios:.      
2bb70 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61  **.      **   (a
2bb80 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61  ) A call to fsta
2bb90 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  t() failed..    
2bba0 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c    **   (b) A mal
2bbb0 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20  loc failed..    
2bbc0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63    **.      ** Sc
2bbd0 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f  enario (b) may o
2bbe0 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65  nly occur if the
2bbf0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
2bc00 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20  ing no other.   
2bc10 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72     ** file descr
2bc20 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  iptors open on t
2bc30 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66  he same file. If
2bc40 20 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65   there were othe
2bc50 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  r file.      ** 
2bc60 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74  descriptors on t
2bc70 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e  his file, then n
2bc80 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62  o malloc would b
2bc90 65 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20  e required by.  
2bca0 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65      ** findInode
2bcb0 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20  Info(). If this 
2bcc0 69 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20  is the case, it 
2bcd0 69 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f  is quite safe to
2bce0 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20   close.      ** 
2bcf0 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74  handle h - as it
2bd00 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2bd10 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63  hat no posix loc
2bd20 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61  ks will be relea
2bd30 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20  sed.      ** by 
2bd40 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20  doing so..      
2bd50 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73  **.      ** If s
2bd60 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73  cenario (a) caus
2bd70 65 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65  ed the error the
2bd80 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74  n things are not
2bd90 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20   so safe. The.  
2bda0 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20      ** implicit 
2bdb0 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20  assumption here 
2bdc0 69 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74  is that if fstat
2bdd0 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73  () fails, things
2bde0 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a   are in.      **
2bdf0 20 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20   such bad shape 
2be00 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20  that dropping a 
2be10 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73  lock or two does
2be20 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e  n't matter much.
2be30 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2be40 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2be50 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2be60 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
2be70 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
2be80 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
2be90 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2bea0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2beb0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2bec0 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
2bed0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2bee0 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
2bef0 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
2bf00 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
2bf10 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
2bf20 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
2bf30 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
2bf40 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
2bf50 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
2bf60 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2bf70 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
2bf80 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2bf90 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
2bfa0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
2bfb0 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
2bfc0 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
2bfd0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
2bfe0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2bff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c000 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65  /* NB: zFilename
2c010 20 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61   exists and rema
2c020 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20  ins valid until 
2c030 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
2c040 65 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f  ed.      ** acco
2c050 72 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65  rding to require
2c060 6d 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f  ment F11141.  So
2c070 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20   we do not need 
2c080 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20  to make a.      
2c090 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66  ** copy of the f
2c0a0 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ilename. */.    
2c0b0 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d    pCtx->dbPath =
2c0c0 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20   zFilename;.    
2c0d0 20 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64    pCtx->reserved
2c0e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e   = 0;.      sran
2c0f0 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20  domdev();.      
2c100 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c110 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e  ;.      rc = fin
2c120 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2c130 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2c140 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2c150 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c160 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c170 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  (pNew->lockingCo
2c180 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  ntext);.        
2c190 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
2c1a0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
2c1b0 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  .        h = -1;
2c1c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
2c1d0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2c1e0 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20          .    }. 
2c1f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73   }.#endif..  els
2c200 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74  e if( pLockingSt
2c210 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49  yle == &dotlockI
2c220 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
2c230 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  /* Dotfile locki
2c240 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2c250 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2c260 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2c270 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   in.    ** the d
2c280 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e  otlockLockingCon
2c290 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20  text .    */.   
2c2a0 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
2c2b0 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e  ;.    int nFilen
2c2c0 61 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ame;.    assert(
2c2d0 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b   zFilename!=0 );
2c2e0 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d  .    nFilename =
2c2f0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69   (int)strlen(zFi
2c300 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20  lename) + 6;.   
2c310 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68   zLockFile = (ch
2c320 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
2c330 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29  loc64(nFilename)
2c340 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46  ;.    if( zLockF
2c350 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
2c360 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2c370 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  M_BKPT;.    }els
2c380 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2c390 5f 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e  _snprintf(nFilen
2c3a0 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20  ame, zLockFile, 
2c3b0 22 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  "%s" DOTLOCK_SUF
2c3c0 46 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b  FIX, zFilename);
2c3d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d  .    }.    pNew-
2c3e0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2c3f0 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d  = zLockFile;.  }
2c400 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2c410 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2c420 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65  kingStyle == &se
2c430 6d 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  mIoMethods ){.  
2c440 20 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70    /* Named semap
2c450 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  hore locking use
2c460 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
2c470 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
2c480 65 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65  e.    ** include
2c490 64 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b  d in the semLock
2c4a0 69 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a  ingContext.    *
2c4b0 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  /.    unixEnterM
2c4c0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2c4d0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2c4e0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2c4f0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  de);.    if( (rc
2c500 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
2c510 28 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70  (pNew->pInode->p
2c520 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20  Sem==NULL) ){.  
2c530 20 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61      char *zSemNa
2c540 6d 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  me = pNew->pInod
2c550 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20  e->aSemName;.   
2c560 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
2c570 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c580 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a  (MAX_PATHNAME, z
2c590 53 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65  SemName, "/%s.se
2c5a0 6d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  m",.            
2c5b0 20 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d             pNew-
2c5c0 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
2c5d0 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72  Name);.      for
2c5e0 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b  ( n=1; zSemName[
2c5f0 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20  n]; n++ ).      
2c600 20 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e    if( zSemName[n
2c610 5d 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d  ]=='/' ) zSemNam
2c620 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20  e[n] = '_';.    
2c630 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2c640 70 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28  pSem = sem_open(
2c650 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41  zSemName, O_CREA
2c660 54 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20  T, 0666, 1);.   
2c670 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e     if( pNew->pIn
2c680 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d  ode->pSem == SEM
2c690 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
2c6a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2c6b0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2c6c0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
2c6d0 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
2c6e0 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
2c6f0 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2c700 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
2c710 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61  dif.  .  storeLa
2c720 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29  stErrno(pNew, 0)
2c730 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
2c740 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2c750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
2c760 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
2c770 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
2c780 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20  INE__);.    h = 
2c790 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  -1;.    osUnlink
2c7a0 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
2c7b0 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
2c7c0 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
2c7d0 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ETE;.  }.#endif.
2c7e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c7f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2c800 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2c810 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2c820 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
2c830 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
2c840 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
2c850 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
2c860 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69  er(+1);.    veri
2c870 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a  fyDbFile(pNew);.
2c880 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c890 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2c8a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
2c8b0 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63  irectory in whic
2c8c0 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61  h to put tempora
2c8d0 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20  ry files..** If 
2c8e0 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70  no suitable temp
2c8f0 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63  orary file direc
2c900 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e  tory can be foun
2c910 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  d, return NULL..
2c920 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
2c930 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69  char *unixTempFi
2c940 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73  leDir(void){.  s
2c950 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2c960 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
2c970 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
2c980 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
2c990 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
2c9a0 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
2c9b0 20 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e     ".".  };.  un
2c9c0 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20  signed int i;.  
2c9d0 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
2c9e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c9f0 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  Dir = sqlite3_te
2ca00 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20  mp_directory;.. 
2ca10 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
2ca20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
2ca30 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
2ca40 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a  DIR");.  if( !az
2ca50 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
2ca60 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
2ca70 50 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d  PDIR");.  for(i=
2ca80 30 3b 20 69 3c 3d 73 69 7a 65 6f 66 28 61 7a 44  0; i<=sizeof(azD
2ca90 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
2caa0 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44  rs[0]); zDir=azD
2cab0 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69  irs[i++]){.    i
2cac0 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e  f( zDir==0 ) con
2cad0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f  tinue;.    if( o
2cae0 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66  sStat(zDir, &buf
2caf0 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2cb00 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
2cb10 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
2cb20 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2cb30 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30  osAccess(zDir, 0
2cb40 33 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  3) ) continue;. 
2cb50 20 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a     return zDir;.
2cb60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2cb70 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2cb80 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2cb90 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
2cba0 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
2cbb0 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
2cbc0 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
2cbd0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
2cbe0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
2cbf0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
2cc00 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
2cc10 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2cc20 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
2cc30 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
2cc40 20 2a 7a 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74   *zBuf){.  const
2cc50 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69   char *zDir;.  i
2cc60 6e 74 20 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a  nt iLimit = 0;..
2cc70 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f    /* It's odd to
2cc80 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d   simulate an io-
2cc90 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20  error here, but 
2cca0 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a  really this is j
2ccb0 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74  ust.  ** using t
2ccc0 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72  he io-error infr
2ccd0 61 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65  astructure to te
2cce0 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68  st that SQLite h
2ccf0 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a  andles this.  **
2cd00 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e   function failin
2cd10 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a 42 75 66 5b  g. .  */.  zBuf[
2cd20 30 5d 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61  0] = 0;.  Simula
2cd30 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
2cd40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
2cd50 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78  ;..  zDir = unix
2cd60 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20  TempFileDir();. 
2cd70 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72   if( zDir==0 ) r
2cd80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2cd90 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 3b 0a  RR_GETTEMPPATH;.
2cda0 20 20 64 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b    do{.    u64 r;
2cdb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  .    sqlite3_ran
2cdc0 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 72  domness(sizeof(r
2cdd0 29 2c 20 26 72 29 3b 0a 20 20 20 20 61 73 73 65  ), &r);.    asse
2cde0 72 74 28 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20  rt( nBuf>2 );.  
2cdf0 20 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d    zBuf[nBuf-2] =
2ce00 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
2ce10 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
2ce20 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
2ce30 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
2ce40 58 22 25 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20  X"%llx%c",.     
2ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce60 7a 44 69 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20  zDir, r, 0);.   
2ce70 20 69 66 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32   if( zBuf[nBuf-2
2ce80 5d 21 3d 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b  ]!=0 || (iLimit+
2ce90 2b 29 3e 31 30 20 29 20 72 65 74 75 72 6e 20 53  +)>10 ) return S
2cea0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2ceb0 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28  while( osAccess(
2cec0 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20  zBuf,0)==0 );.  
2ced0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2cee0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
2cef0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2cf00 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
2cf10 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
2cf20 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e   Routine to tran
2cf30 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65  sform a unixFile
2cf40 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f   into a proxy-lo
2cf50 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a  cking unixFile..
2cf60 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
2cf70 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c  n in the proxy-l
2cf80 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75  ock division, bu
2cf90 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70  t used by unixOp
2cfa0 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54  en().** if SQLIT
2cfb0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2cfc0 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65  OCKING is define
2cfd0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2cfe0 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
2cff0 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  nixFile(unixFile
2d000 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b  *, const char*);
2d010 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
2d020 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2d030 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2d040 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70 65  tor that was ope
2d050 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ned on the datab
2d060 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f  ase .** file (no
2d070 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d  t a journal or m
2d080 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
2d090 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20 62  le) identified b
2d0a0 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50  y pathname.** zP
2d0b0 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ath with SQLITE_
2d0c0 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d  OPEN_XXX flags m
2d0d0 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61  atching those pa
2d0e0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2d0f0 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74  nd.** argument t
2d100 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  o this function.
2d110 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69  .**.** Such a fi
2d120 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61  le descriptor ma
2d130 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61 74  y exist if a dat
2d140 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2d150 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62   was closed.** b
2d160 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
2d170 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
2d180 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63  r could not be c
2d190 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73 6f  losed because so
2d1a0 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65  me.** other file
2d1b0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e   descriptor open
2d1c0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c   on the same fil
2d1d0 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66  e is holding a f
2d1e0 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66  ile-lock..** Ref
2d1f0 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69  er to comments i
2d200 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28  n the unixClose(
2d210 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74  ) function and t
2d220 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65  he lengthy comme
2d230 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67  nt.** describing
2d240 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79   "Posix Advisory
2d250 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65   Locking" at the
2d260 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20 66   start of this f
2d270 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74  ile for .** furt
2d280 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73  her details. Als
2d290 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e  o, ticket #4018.
2d2a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74  .**.** If a suit
2d2b0 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  able file descri
2d2c0 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74  ptor is found, t
2d2d0 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e  hen it is return
2d2e0 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63  ed. If no.** suc
2d2f0 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  h file descripto
2d300 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31  r is located, -1
2d310 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
2d320 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73  .static UnixUnus
2d330 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62  edFd *findReusab
2d340 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20  leFd(const char 
2d350 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67  *zPath, int flag
2d360 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64  s){.  UnixUnused
2d370 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b  Fd *pUnused = 0;
2d380 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65  ..  /* Do not se
2d390 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73  arch for an unus
2d3a0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2d3b0 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e  or on vxworks. N
2d3c0 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20  ot because.  ** 
2d3d0 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f  vxworks would no
2d3e0 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74  t benefit from t
2d3f0 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69  he change (it mi
2d400 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73  ght, we're not s
2d410 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62  ure),.  ** but b
2d420 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f  ecause no way to
2d430 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72 72   test it is curr
2d440 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e  ently available.
2d450 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a 20   It is better . 
2d460 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20   ** not to risk 
2d470 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73  breaking vxworks
2d480 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65   support for the
2d490 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e   sake of such an
2d4a0 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66   obscure .  ** f
2d4b0 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20  eature.  */.#if 
2d4c0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74  !OS_VXWORKS.  st
2d4d0 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2d4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4f0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66     /* Results of
2d500 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a   stat() call */.
2d510 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63  .  /* A stat() c
2d520 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72  all may fail for
2d530 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73   various reasons
2d540 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
2d550 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c  s, it is.  ** al
2d560 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
2d570 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c  t an open() call
2d580 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2d590 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c  h will also fail
2d5a0 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20  ..  ** For this 
2d5b0 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72  reason, if an er
2d5c0 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
2d5d0 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65  e stat() call he
2d5e0 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  re, it is.  ** i
2d5f0 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73  gnored and -1 is
2d600 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
2d610 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74  aller will try t
2d620 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
2d630 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
2d640 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  r on the same pa
2d650 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65  th, fail, and re
2d660 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f  turn an error to
2d670 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20   SQLite..  **.  
2d680 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62  ** Even if a sub
2d690 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63  sequent open() c
2d6a0 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64  all does succeed
2d6b0 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63  , the consequenc
2d6c0 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73  es of.  ** not s
2d6d0 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72  earching for a r
2d6e0 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  eusable file des
2d6f0 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
2d700 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
2d710 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2d720 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2d730 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
2d740 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78  Inode;..    unix
2d750 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d760 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
2d770 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  List;.    while(
2d780 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f   pInode && (pIno
2d790 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d  de->fileId.dev!=
2d7a0 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20  sStat.st_dev.   
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7c0 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c    || pInode->fil
2d7d0 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73  eId.ino!=sStat.s
2d7e0 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2d7f0 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2d800 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2d810 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2d820 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2d830 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2d840 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2d850 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2d860 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2d870 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2d880 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2d890 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2d8a0 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2d8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
2d8c0 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74  = pUnused->pNext
2d8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2d8e0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2d8f0 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2d900 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
2d910 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
2d920 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
2d930 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2d940 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75  n is called by u
2d950 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74  nixOpen() to det
2d960 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20  ermine the unix 
2d970 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74  permissions.** t
2d980 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c  o create new fil
2d990 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65  es with. If no e
2d9a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
2d9b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
2d9c0 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61  eturned.** and a
2d9d0 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20   value suitable 
2d9e0 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74  for passing as t
2d9f0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2da00 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a  t to open(2) is.
2da10 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  ** written to *p
2da20 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65  Mode. If an IO e
2da30 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
2da40 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2da50 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
2da60 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
2da70 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74  of *pMode is not
2da80 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a   modified..**.**
2da90 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
2daa0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  this routine set
2dab0 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77  s *pMode to 0, w
2dac0 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65  hich will become
2dad0 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f  .** an indicatio
2dae0 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e  n to robust_open
2daf0 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  () to create the
2db00 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53   file using.** S
2db10 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2db20 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61  LE_PERMISSIONS a
2db30 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75  djusted by the u
2db40 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20  mask..** But if 
2db50 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2db60 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f  pened is a WAL o
2db70 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61  r regular journa
2db80 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a  l file, then .**
2db90 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71   this function q
2dba0 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d  ueries the file-
2dbb0 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70  system for the p
2dbc0 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68  ermissions on th
2dbd0 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  e .** correspond
2dbe0 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2dbf0 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64  e and sets *pMod
2dc00 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e  e to this value.
2dc10 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f   Whenever .** po
2dc20 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20  ssible, WAL and 
2dc30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72  journal files ar
2dc40 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  e created using 
2dc50 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
2dc60 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20  ions .** as the 
2dc70 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62  associated datab
2dc80 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
2dc90 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  If the SQLITE_EN
2dca0 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f  ABLE_8_3_NAMES o
2dcb0 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
2dcc0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72  , then the.** or
2dcd0 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
2dce0 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20  is unavailable. 
2dcf0 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69   But 8_3_NAMES i
2dd00 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a  s only used for.
2dd10 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65  ** FAT filesyste
2dd20 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f  ms and permissio
2dd30 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72  ns do not matter
2dd40 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20   there, so just 
2dd50 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  use.** the defau
2dd60 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  lt permissions..
2dd70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2dd80 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
2dd90 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
2dda0 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20  zPath,          
2ddb0 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66      /* Path of f
2ddc0 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62  ile (possibly) b
2ddd0 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a  eing created */.
2dde0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de00 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
2de10 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e  d as 4th argumen
2de20 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  t to xOpen() */.
2de30 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c    mode_t *pMode,
2de40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de50 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73    /* OUT: Permis
2de60 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69  sions to open fi
2de70 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64  le with */.  uid
2de80 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2dea0 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20  OUT: uid to set 
2deb0 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  on the file */. 
2dec0 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20   gid_t *pGid    
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20   /* OUT: gid to 
2def0 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  set on the file 
2df00 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2df10 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2df20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2df30 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f  n Code */.  *pMo
2df40 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20  de = 0;.  *pUid 
2df50 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30  = 0;.  *pGid = 0
2df60 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
2df70 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  (SQLITE_OPEN_WAL
2df80 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
2df90 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20  N_JOURNAL) ){.  
2dfa0 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50    char zDb[MAX_P
2dfb0 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20  ATHNAME+1];     
2dfc0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2dfd0 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74   path */.    int
2dfe0 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20   nDb;           
2dff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e000 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79  mber of valid by
2e010 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20  tes in zDb */.  
2e020 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2e030 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2e040 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61  /* Output of sta
2e050 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20  t() on database 
2e060 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
2e070 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20  zPath is a path 
2e080 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72  to a WAL or jour
2e090 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f  nal file. The fo
2e0a0 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65  llowing block de
2e0b0 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  rives.    ** the
2e0c0 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73   path to the ass
2e0d0 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65  ociated database
2e0e0 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68   file from zPath
2e0f0 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e  . This block han
2e100 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  dles.    ** the 
2e110 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67  following naming
2e120 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20   conventions:.  
2e130 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c    **.    **   "<
2e140 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72  path to db>-jour
2e150 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  nal".    **   "<
2e160 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22  path to db>-wal"
2e170 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2e180 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e   to db>-journalN
2e190 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  N".    **   "<pa
2e1a0 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22  th to db>-walNN"
2e1b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77  .    **.    ** w
2e1c0 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63  here NN is a dec
2e1d0 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65  imal number. The
2e1e0 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d   NN naming schem
2e1f0 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75  es are .    ** u
2e200 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f  sed by the test_
2e210 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75  multiplex.c modu
2e220 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e  le..    */.    n
2e230 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Db = sqlite3Strl
2e240 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b  en30(zPath) - 1;
2e250 20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61   .    while( zPa
2e260 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a  th[nDb]!='-' ){.
2e270 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
2e280 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a  NABLE_8_3_NAMES.
2e290 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 20        /* In the 
2e2a0 6e 6f 72 6d 61 6c 20 63 61 73 65 20 28 38 2b 33  normal case (8+3
2e2b0 20 66 69 6c 65 6e 61 6d 65 73 20 64 69 73 61 62   filenames disab
2e2c0 6c 65 64 29 20 74 68 65 20 6a 6f 75 72 6e 61 6c  led) the journal
2e2d0 20 66 69 6c 65 6e 61 6d 65 0a 20 20 20 20 20 20   filename.      
2e2e0 2a 2a 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ** is guaranteed
2e2f0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20 27 2d   to contain a '-
2e300 27 20 63 68 61 72 61 63 74 65 72 2e 20 2a 2f 0a  ' character. */.
2e310 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 44        assert( nD
2e320 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73  b>0 );.      ass
2e330 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 61 6c  ert( sqlite3Isal
2e340 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20  num(zPath[nDb]) 
2e350 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f  );.#else.      /
2e360 2a 20 49 66 20 38 2b 33 20 6e 61 6d 65 73 20 61  * If 8+3 names a
2e370 72 65 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  re possible, the
2e380 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2e390 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 63 6f 6e  le might not con
2e3a0 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  tain.      ** a 
2e3b0 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20 20  '-' character.  
2e3c0 53 6f 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61  So check for tha
2e3d0 74 20 63 61 73 65 20 61 6e 64 20 72 65 74 75 72  t case and retur
2e3e0 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20  n early. */.    
2e3f0 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
2e400 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20  zPath[nDb]=='.' 
2e410 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2e420 4f 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  OK;.#endif.     
2e430 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20   nDb--;.    }.  
2e440 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
2e450 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
2e460 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
2e470 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  .    if( 0==osSt
2e480 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20  at(zDb, &sStat) 
2e490 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20  ){.      *pMode 
2e4a0 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20  = sStat.st_mode 
2e4b0 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70  & 0777;.      *p
2e4c0 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75  Uid = sStat.st_u
2e4d0 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20  id;.      *pGid 
2e4e0 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
2e4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2e510 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a  RR_FSTAT;.    }.
2e520 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2e530 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2e540 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
2e550 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36  .    *pMode = 06
2e560 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
2e570 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
2e580 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74  en the file zPat
2e590 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f  h..** .** Previo
2e5a0 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65  usly, the SQLite
2e5b0 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74   OS layer used t
2e5c0 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hree functions i
2e5d0 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a  n place of this.
2e5e0 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ** one:.**.**   
2e5f0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
2e600 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20  eadWrite();.**  
2e610 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2e620 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20  ReadOnly();.**  
2e630 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
2e640 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a  Exclusive();.**.
2e650 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63  ** These calls c
2e660 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
2e670 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
2e680 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73  nations of flags
2e690 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64  :.**.**     Read
2e6a0 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28  Write() ->     (
2e6b0 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
2e6c0 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f  TE).**     ReadO
2e6d0 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52  nly()  ->     (R
2e6e0 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20  EADONLY) .**    
2e6f0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2e700 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c   -> (READWRITE |
2e710 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53   CREATE | EXCLUS
2e720 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  IVE).**.** The o
2e730 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ld OpenExclusive
2e740 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f  () accepted a bo
2e750 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d  olean argument -
2e760 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a   "delFlag". If.*
2e770 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65  * true, the file
2e780 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   was configured 
2e790 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  to be automatica
2e7a0 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
2e7b0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e   the.** file han
2e7c0 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61  dle closed. To a
2e7d0 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20  chieve the same 
2e7e0 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69  effect using thi
2e7f0 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66  s new .** interf
2e800 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c  ace, add the DEL
2e810 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20  ETEONCLOSE flag 
2e820 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
2e830 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a  ed above for .**
2e840 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
2e850 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e860 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69  unixOpen(.  sqli
2e870 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2e880 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2e890 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68  VFS for which th
2e8a0 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20  is is the xOpen 
2e8b0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
2e8c0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
2e8d0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
2e8e0 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
2e8f0 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
2e900 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2e910 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
2e920 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2e930 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  or to be filled 
2e940 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  in */.  int flag
2e950 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2e960 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c       /* Input fl
2e970 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  ags to control t
2e980 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  he opening */.  
2e990 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
2e9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e9b0 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74  Output flags ret
2e9c0 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
2e9d0 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  core */.){.  uni
2e9e0 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
2e9f0 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
2ea00 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20  int fd = -1;    
2ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ea20 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
2ea30 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
2ea40 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  en() */.  int op
2ea50 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  enFlags = 0;    
2ea60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
2ea70 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
2ea80 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  n() */.  int eTy
2ea90 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
2eaa0 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
2eab0 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
2eac0 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b  */.  int noLock;
2ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eae0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2eaf0 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  mit locking prim
2eb00 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itives */.  int 
2eb10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2eb20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2eb30 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
2eb40 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  de */.  int ctrl
2eb50 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
2eb60 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49         /* UNIXFI
2eb70 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20  LE_* flags */.. 
2eb80 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
2eb90 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2eba0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
2ebb0 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
2ebc0 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
2ebd0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
2ebe0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
2ebf0 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
2ec00 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
2ec10 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
2ec20 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
2ec30 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
2ec40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
2ec50 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
2ec60 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
2ec70 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
2ec80 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
2ec90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2eca0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2ecb0 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
2ecc0 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
2ecd0 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
2ece0 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
2ecf0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2ed00 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
2ed10 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2ed20 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2ed30 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
2ed40 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
2ed50 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
2ed60 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
2ed70 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
2ed80 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
2ed90 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
2eda0 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
2edb0 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
2edc0 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
2edd0 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
2ede0 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
2edf0 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
2ee00 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
2ee10 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
2ee20 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20 3d  .  int syncDir =
2ee30 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a   (isCreate && (.
2ee40 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53          eType==S
2ee50 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
2ee60 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20  R_JOURNAL .     
2ee70 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2ee80 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2ee90 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2eea0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
2eeb0 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49  AL.  ));..  /* I
2eec0 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68  f argument zPath
2eed0 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   is a NULL point
2eee0 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  er, this functio
2eef0 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  n is required to
2ef00 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d   open.  ** a tem
2ef10 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65  porary file. Use
2ef20 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
2ef30 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e  store the file n
2ef40 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63  ame in..  */.  c
2ef50 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58  har zTmpname[MAX
2ef60 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20  _PATHNAME+2];.  
2ef70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
2ef80 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a  e = zPath;..  /*
2ef90 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f   Check the follo
2efa0 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20  wing statements 
2efb0 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a  are true: .  **.
2efc0 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74    **   (a) Exact
2efd0 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45  ly one of the RE
2efe0 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44  ADWRITE and READ
2eff0 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20  ONLY flags must 
2f000 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a  be set, and .  *
2f010 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54  *   (b) if CREAT
2f020 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52  E is set, then R
2f030 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c  EADWRITE must al
2f040 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20  so be set, and. 
2f050 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43   **   (c) if EXC
2f060 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74  LUSIVE is set, t
2f070 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20  hen CREATE must 
2f080 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a  also be set..  *
2f090 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54  *   (d) if DELET
2f0a0 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c  EONCLOSE is set,
2f0b0 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
2f0c0 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
2f0d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73   */.  assert((is
2f0e0 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69  Readonly==0 || i
2f0f0 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26  sReadWrite==0) &
2f100 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c  & (isReadWrite |
2f110 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a  | isReadonly));.
2f120 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74    assert(isCreat
2f130 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  e==0 || isReadWr
2f140 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ite);.  assert(i
2f150 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c  sExclusive==0 ||
2f160 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73   isCreate);.  as
2f170 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30  sert(isDelete==0
2f180 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a   || isCreate);..
2f190 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42    /* The main DB
2f1a0 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  , main journal, 
2f1b0 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73  WAL file and mas
2f1c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
2f1d0 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f  never .  ** auto
2f1e0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
2f1f0 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20  d. Nor are they 
2f200 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66  ever temporary f
2f210 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65  iles.  */.  asse
2f220 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2f230 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2f240 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f250 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  AIN_DB );.  asse
2f260 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26  rt( (!isDelete &
2f270 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70  & zName) || eTyp
2f280 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e!=SQLITE_OPEN_M
2f290 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2f2a0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2f2b0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2f2c0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f2d0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f2e0 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  AL );.  assert( 
2f2f0 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
2f300 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
2f310 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29  QLITE_OPEN_WAL )
2f320 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74  ;..  /* Assert t
2f330 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61  hat the upper la
2f340 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20  yer has set one 
2f350 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70  of the "file-typ
2f360 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61  e" flags. */.  a
2f370 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51  ssert( eType==SQ
2f380 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
2f390 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d  B      || eType=
2f3a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  =SQLITE_OPEN_TEM
2f3b0 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  P_DB .       || 
2f3c0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f3d0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
2f3e0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f3f0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
2f400 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2f410 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f420 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c  _SUBJOURNAL   ||
2f430 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f440 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f450 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54  AL .       || eT
2f460 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f470 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c  _TRANSIENT_DB ||
2f480 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f490 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20  PEN_WAL.  );..  
2f4a0 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20  /* Detect a pid 
2f4b0 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74  change and reset
2f4c0 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72   the PRNG.  Ther
2f4d0 65 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  e is a race cond
2f4e0 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20  ition.  ** here 
2f4f0 73 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72  such that two or
2f500 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c   more threads al
2f510 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e  l trying to open
2f520 20 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20   databases at.  
2f530 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74  ** the same inst
2f540 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65  ant might all re
2f550 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42  set the PRNG.  B
2f560 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65  ut multiple rese
2f570 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d  ts.  ** are harm
2f580 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  less..  */.  if(
2f590 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d   randomnessPid!=
2f5a0 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20  osGetpid(0) ){. 
2f5b0 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64     randomnessPid
2f5c0 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a   = osGetpid(0);.
2f5d0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
2f5e0 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d  omness(0,0);.  }
2f5f0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ..  memset(p, 0,
2f600 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
2f610 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65  ));..  if( eType
2f620 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2f630 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69  IN_DB ){.    Uni
2f640 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
2f650 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20  ed;.    pUnused 
2f660 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64  = findReusableFd
2f670 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a  (zName, flags);.
2f680 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
2f690 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55  ){.      fd = pU
2f6a0 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d  nused->fd;.    }
2f6b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75  else{.      pUnu
2f6c0 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sed = sqlite3_ma
2f6d0 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70  lloc64(sizeof(*p
2f6e0 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20  Unused));.      
2f6f0 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a  if( !pUnused ){.
2f700 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2f710 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
2f720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f730 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d      p->pUnused =
2f740 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f   pUnused;..    /
2f750 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
2f760 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
2f770 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
2f780 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
2f790 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68      ** URIs with
2f7a0 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
2f7b0 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
2f7c0 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
2f7d0 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  nto.    ** sqlit
2f7e0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
2f7f0 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
2f800 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  t( (flags & SQLI
2f810 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20  TE_OPEN_URI) || 
2f820 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
2f830 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
2f840 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
2f850 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
2f860 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
2f870 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
2f880 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
2f890 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
2f8a0 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
2f8b0 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20  & !syncDir);.   
2f8c0 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d   rc = unixGetTem
2f8d0 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61  pname(pVfs->mxPa
2f8e0 74 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65  thname, zTmpname
2f8f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
2f900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f910 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2f920 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a   }.    zName = z
2f930 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a  Tmpname;..    /*
2f940 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f   Generated tempo
2f950 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61  rary filenames a
2f960 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65  re always double
2f970 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
2f980 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20  .    ** for use 
2f990 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  by sqlite3_uri_p
2f9a0 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20  arameter(). */. 
2f9b0 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65     assert( zName
2f9c0 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31  [strlen(zName)+1
2f9d0 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ]==0 );.  }..  /
2f9e0 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  * Determine the 
2f9f0 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61  value of the fla
2fa00 67 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73  gs parameter pas
2fa10 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e  sed to POSIX fun
2fa20 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28  ction.  ** open(
2fa30 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65  ). These must be
2fa40 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e   calculated even
2fa50 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f   if open() is no
2fa60 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a  t called, as.  *
2fa70 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74  * they may be st
2fa80 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ored as part of 
2fa90 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
2faa0 61 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20  and used by the 
2fab0 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c  .  ** 'conch fil
2fac0 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74  e' locking funct
2fad0 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20  ions later on.  
2fae0 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f  */.  if( isReado
2faf0 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73  nly )  openFlags
2fb00 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2fb10 69 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20  if( isReadWrite 
2fb20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f  ) openFlags |= O
2fb30 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43  _RDWR;.  if( isC
2fb40 72 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46  reate )    openF
2fb50 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b  lags |= O_CREAT;
2fb60 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69  .  if( isExclusi
2fb70 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  ve ) openFlags |
2fb80 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  = (O_EXCL|O_NOFO
2fb90 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61  LLOW);.  openFla
2fba0 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49  gs |= (O_LARGEFI
2fbb0 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20  LE|O_BINARY);.. 
2fbc0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2fbd0 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65   mode_t openMode
2fbe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2fbf0 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f  * Permissions to
2fc00 20 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74   create file wit
2fc10 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75  h */.    uid_t u
2fc20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2fc30 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64         /* Userid
2fc40 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
2fc50 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20  .    gid_t gid; 
2fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc70 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f     /* Groupid fo
2fc80 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  r the file */.  
2fc90 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74    rc = findCreat
2fca0 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c  eFileMode(zName,
2fcb0 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64   flags, &openMod
2fcc0 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a  e, &uid, &gid);.
2fcd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2fce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
2fcf0 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73  ssert( !p->pUnus
2fd00 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ed );.      asse
2fd10 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
2fd20 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54  E_OPEN_WAL || eT
2fd30 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2fd40 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
2fd50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
2fd60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d  ;.    }.    fd =
2fd70 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61   robust_open(zNa
2fd80 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f  me, openFlags, o
2fd90 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53  penMode);.    OS
2fda0 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20  TRACE(("OPENX   
2fdb0 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20  %-3d %s 0%o\n", 
2fdc0 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  fd, zName, openF
2fdd0 6c 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65  lags));.    asse
2fde0 72 74 28 20 21 69 73 45 78 63 6c 75 73 69 76 65  rt( !isExclusive
2fdf0 20 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26   || (openFlags &
2fe00 20 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a   O_CREAT)!=0 );.
2fe10 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26 20      if( fd<0 && 
2fe20 65 72 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26  errno!=EISDIR &&
2fe30 20 69 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a   isReadWrite ){.
2fe40 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
2fe50 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
2fe60 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
2fe70 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
2fe80 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
2fe90 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54  flags &= ~(SQLIT
2fea0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2feb0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
2fec0 41 54 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e  ATE);.      open
2fed0 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
2fee0 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
2fef0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
2ff00 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b  E_OPEN_READONLY;
2ff10 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  .      openFlags
2ff20 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20   |= O_RDONLY;.  
2ff30 20 20 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d      isReadonly =
2ff40 20 31 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72   1;.      fd = r
2ff50 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2ff60 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2ff70 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMode);.    }.  
2ff80 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2ff90 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
2ffa0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
2ffb0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
2ffc0 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
2ffd0 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
2ffe0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  shed;.    }..   
2fff0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
30000 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
30010 73 20 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72  s root and if cr
30020 65 61 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c  eating a new rol
30030 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
30040 72 6e 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65  rnal or WAL file
30050 2c 20 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73  , set the owners
30060 68 69 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  hip of the journ
30070 61 6c 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a  al or WAL to be.
30080 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20      ** the same 
30090 61 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  as the original 
300a0 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f  database..    */
300b0 0a 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26  .    if( flags &
300c0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
300d0 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
300e0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
300f0 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77       robustFchow
30100 6e 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b  n(fd, uid, gid);
30110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
30120 65 72 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20  ert( fd>=0 );.  
30130 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b  if( pOutFlags ){
30140 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20  .    *pOutFlags 
30150 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20  = flags;.  }..  
30160 69 66 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29  if( p->pUnused )
30170 7b 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64  {.    p->pUnused
30180 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70  ->fd = fd;.    p
30190 2d 3e 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73  ->pUnused->flags
301a0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
301b0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
301c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
301d0 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d      zPath = zNam
301e0 65 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  e;.#elif defined
301f0 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41  (SQLITE_UNLINK_A
30200 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20  FTER_CLOSE).    
30210 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f  zPath = sqlite3_
30220 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
30230 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  ame);.    if( zP
30240 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ath==0 ){.      
30250 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
30260 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
30270 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
30280 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
30290 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6f     }.#else.    o
302a0 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a  sUnlink(zName);.
302b0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53  #endif.  }.#if S
302c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
302d0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73  KING_STYLE.  els
302e0 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c  e{.    p->openFl
302f0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
30300 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23  .  }.#endif.  .#
30310 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
30320 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
30330 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
30340 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
30350 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
30360 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f  == -1 ){.    sto
30370 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65  reLastErrno(p, e
30380 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73  rrno);.    robus
30390 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
303a0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65  _LINE__);.    re
303b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
303c0 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  R_ACCESS;.  }.  
303d0 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
303e0 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
303f0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
30400 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
30410 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
30420 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
30430 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
30440 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
30450 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c  strncmp("exfat",
30460 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
30470 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
30480 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
30490 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
304a0 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
304b0 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
304c0 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  if..  /* Set up 
304d0 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c  appropriate ctrl
304e0 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69  Flags */.  if( i
304f0 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20  sDelete )       
30500 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
30510 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
30520 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52  ELETE;.  if( isR
30530 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20  eadonly )       
30540 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
30550 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
30560 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  NLY;.  noLock = 
30570 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
30580 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20 20 69 66  EN_MAIN_DB;.  if
30590 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20  ( noLock )      
305a0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
305b0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
305c0 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20  E_NOLOCK;.  if( 
305d0 73 79 6e 63 44 69 72 20 29 20 20 20 20 20 20 20  syncDir )       
305e0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
305f0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
30600 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66  DIRSYNC;.  if( f
30610 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
30620 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61  EN_URI ) ctrlFla
30630 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55  gs |= UNIXFILE_U
30640 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  RI;..#if SQLITE_
30650 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
30660 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f  TYLE.#if SQLITE_
30670 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
30680 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f  KING.  isAutoPro
30690 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  xy = 1;.#endif. 
306a0 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79   if( isAutoProxy
306b0 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c   && (zPath!=NULL
306c0 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26  ) && (!noLock) &
306d0 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b  & pVfs->xOpen ){
306e0 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
306f0 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
30700 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
30710 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
30720 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
30730 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
30740 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
30750 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
30760 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
30770 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20  roxy, 0 means . 
30780 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20     ** never use 
30790 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
307a0 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
307b0 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
307c0 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
307d0 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
307e0 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
307f0 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
30800 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
30810 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
30820 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
30830 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
30840 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
30850 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
30860 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
30870 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
30880 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
30890 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
308a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
308b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
308c0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
308d0 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
308e0 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
308f0 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
30900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30910 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  .          /* Us
30920 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63  e unixClose to c
30930 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f  lean up the reso
30940 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66  urces added in f
30950 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20  illInUnixFile . 
30960 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
30970 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74  clear all the st
30980 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65  ructure's refere
30990 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61  nces.  Specifica
309a0 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  lly, .          
309b0 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  ** pFile->pMetho
309c0 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  ds will be NULL 
309d0 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  so sqlite3OsClos
309e0 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f  e will be a no-o
309f0 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  p .          */.
30a00 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c            unixCl
30a10 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
30a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
30a30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30a40 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
30a50 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
30a60 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
30a70 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
30a80 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
30a90 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
30aa0 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f 70 65 6e  trlFlags);..open
30ab0 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
30ac0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30ad0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
30ae0 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
30af0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
30b00 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
30b10 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
30b20 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
30b30 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
30b40 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
30b50 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
30b60 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
30b70 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
30b80 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
30b90 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
30ba0 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
30bb0 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
30bc0 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
30bd0 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
30be0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
30bf0 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
30c00 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
30c10 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
30c20 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
30c30 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
30c40 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
30c50 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
30c60 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
30c70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
30c80 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
30c90 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
30ca0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
30cb0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
30cc0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
30cd0 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28  .  if( osUnlink(
30ce0 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a  zPath)==(-1) ){.
30cf0 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45      if( errno==E
30d00 4e 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57  NOENT.#if OS_VXW
30d10 4f 52 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20  ORKS.        || 
30d20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30  osAccess(zPath,0
30d30 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20  )!=0.#endif.    
30d40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
30d50 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
30d60 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c  E_NOENT;.    }el
30d70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  se{.      rc = u
30d80 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
30d90 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
30da0 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68   "unlink", zPath
30db0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
30dc0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e  urn rc;.  }.#ifn
30dd0 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42  def SQLITE_DISAB
30de0 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28  LE_DIRSYNC.  if(
30df0 20 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d   (dirSync & 1)!=
30e00 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b  0 ){.    int fd;
30e10 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e  .    rc = osOpen
30e20 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c  Directory(zPath,
30e30 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72   &fd);.    if( r
30e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30e50 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c 5f 66        if( full_f
30e60 73 79 6e 63 28 66 64 2c 30 2c 30 29 20 29 7b 0a  sync(fd,0,0) ){.
30e70 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
30e80 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
30e90 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
30ea0 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68  , "fsync", zPath
30eb0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
30ec0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c   robust_close(0,
30ed0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
30ee0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30ef0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
30f00 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a  ITE_CANTOPEN );.
30f10 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
30f20 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
30f30 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
30f40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  rc;.}../*.** Tes
30f50 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  t the existence 
30f60 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72  of or access per
30f70 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65  missions of file
30f80 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74   zPath. The.** t
30f90 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65  est performed de
30fa0 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
30fb0 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a  ue of flags:.**.
30fc0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
30fd0 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74  CESS_EXISTS: Ret
30fe0 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c  urn 1 if the fil
30ff0 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20  e exists.**     
31000 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
31010 41 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20  ADWRITE: Return 
31020 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
31030 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62   read and writab
31040 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54  le..**     SQLIT
31050 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c  E_ACCESS_READONL
31060 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  Y: Return 1 if t
31070 68 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61  he file is reada
31080 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ble..**.** Other
31090 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a  wise return 0..*
310a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
310b0 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  xAccess(.  sqlit
310c0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
310d0 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f     /* The VFS co
310e0 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41  ntaining this xA
310f0 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a  ccess method */.
31100 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
31110 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74  ath,      /* Pat
31120 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  h of the file to
31130 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e   examine */.  in
31140 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
31150 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f        /* What do
31160 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72   we want to lear
31170 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74  n about the zPat
31180 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74  h file? */.  int
31190 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20   *pResOut       
311a0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
311b0 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72  sult boolean her
311c0 65 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  e */.){.  UNUSED
311d0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
311e0 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
311f0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
31200 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
31210 53 53 3b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  SS; );.  assert(
31220 20 70 52 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a   pResOut!=0 );..
31230 20 20 2f 2a 20 54 68 65 20 73 70 65 63 20 73 61    /* The spec sa
31240 79 73 20 74 68 65 72 65 20 61 72 65 20 74 68 72  ys there are thr
31250 65 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75  ee possible valu
31260 65 73 20 66 6f 72 20 66 6c 61 67 73 2e 20 20 42  es for flags.  B
31270 75 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f  ut only.  ** two
31280 20 6f 66 20 74 68 65 6d 20 61 72 65 20 61 63 74   of them are act
31290 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20  ually used */.  
312a0 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 53  assert( flags==S
312b0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
312c0 53 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51  STS || flags==SQ
312d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44  LITE_ACCESS_READ
312e0 57 52 49 54 45 20 29 3b 0a 0a 20 20 69 66 28 20  WRITE );..  if( 
312f0 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43  flags==SQLITE_AC
31300 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20  CESS_EXISTS ){. 
31310 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
31320 75 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74  uf;.    *pResOut
31330 20 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50   = (0==osStat(zP
31340 61 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75  ath, &buf) && bu
31350 66 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20  f.st_size>0);.  
31360 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 73  }else{.    *pRes
31370 4f 75 74 20 3d 20 6f 73 41 63 63 65 73 73 28 7a  Out = osAccess(z
31380 50 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29  Path, W_OK|R_OK)
31390 3d 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ==0;.  }.  retur
313a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
313b0 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
313c0 69 6e 74 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61  int mkFullPathna
313d0 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me(.  const char
313e0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
313f0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 70        /* Input p
31400 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ath */.  char *z
31410 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  Out,            
31420 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
31430 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  ut buffer */.  i
31440 6e 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20  nt nOut         
31450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31460 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
31470 20 6f 66 20 62 75 66 66 65 72 20 7a 4f 75 74 20   of buffer zOut 
31480 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 74  */.){.  int nPat
31490 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  h = sqlite3Strle
314a0 6e 33 30 28 7a 50 61 74 68 29 3b 0a 20 20 69 6e  n30(zPath);.  in
314b0 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 69 66  t iOff = 0;.  if
314c0 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 2f 27 20  ( zPath[0]!='/' 
314d0 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74  ){.    if( osGet
314e0 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32  cwd(zOut, nOut-2
314f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
31500 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
31510 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
31520 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22  N_BKPT, "getcwd"
31530 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a  , zPath);.    }.
31540 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74      iOff = sqlit
31550 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29  e3Strlen30(zOut)
31560 3b 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66 66 2b  ;.    zOut[iOff+
31570 2b 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a 20 20  +] = '/';.  }.  
31580 69 66 28 20 28 69 4f 66 66 2b 6e 50 61 74 68 2b  if( (iOff+nPath+
31590 31 29 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 2f  1)>nOut ){.    /
315a0 2a 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 73  * SQLite assumes
315b0 20 74 68 61 74 20 78 46 75 6c 6c 50 61 74 68 6e   that xFullPathn
315c0 61 6d 65 28 29 20 6e 75 6c 2d 74 65 72 6d 69 6e  ame() nul-termin
315d0 61 74 65 73 20 74 68 65 20 6f 75 74 70 75 74 20  ates the output 
315e0 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 65 76  buffer.    ** ev
315f0 65 6e 20 69 66 20 69 74 20 72 65 74 75 72 6e 73  en if it returns
31600 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20   an error.  */. 
31610 20 20 20 7a 4f 75 74 5b 69 4f 66 66 5d 20 3d 20     zOut[iOff] = 
31620 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 75 72 6e  '\0';.    return
31630 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
31640 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c  _BKPT;.  }.  sql
31650 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f  ite3_snprintf(nO
31660 75 74 2d 69 4f 66 66 2c 20 26 7a 4f 75 74 5b 69  ut-iOff, &zOut[i
31670 4f 66 66 5d 2c 20 22 25 73 22 2c 20 7a 50 61 74  Off], "%s", zPat
31680 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  h);.  return SQL
31690 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
316a0 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
316b0 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
316c0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
316d0 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
316e0 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
316f0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
31700 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
31710 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
31720 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
31730 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
31740 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
31750 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
31760 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
31770 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
31780 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
31790 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
317a0 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
317b0 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
317c0 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
317d0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
317e0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
317f0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
31800 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
31810 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
31820 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
31830 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
31840 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
31850 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
31860 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
31870 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
31880 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
31890 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
318a0 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
318b0 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
318c0 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318e0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
318f0 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66  r */.){.#if !def
31900 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49  ined(HAVE_READLI
31910 4e 4b 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  NK) || !defined(
31920 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 72 65  HAVE_LSTAT).  re
31930 74 75 72 6e 20 6d 6b 46 75 6c 6c 50 61 74 68 6e  turn mkFullPathn
31940 61 6d 65 28 7a 50 61 74 68 2c 20 7a 4f 75 74 2c  ame(zPath, zOut,
31950 20 6e 4f 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20   nOut);.#else.  
31960 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
31970 4f 4b 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b  OK;.  int nByte;
31980 0a 20 20 69 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31  .  int nLink = 1
31990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
319a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 79   /* Number of sy
319b0 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 66 6f 6c  mbolic links fol
319c0 6c 6f 77 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  lowed so far */.
319d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
319e0 6e 20 3d 20 7a 50 61 74 68 3b 20 20 20 20 20 20  n = zPath;      
319f0 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20 66 6f  /* Input path fo
31a00 72 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e  r each iteration
31a10 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68   of loop */.  ch
31a20 61 72 20 2a 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20  ar *zDel = 0;.. 
31a30 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d   assert( pVfs->m
31a40 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50  xPathname==MAX_P
31a50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55  ATHNAME );.  UNU
31a60 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56  SED_PARAMETER(pV
31a70 66 73 29 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20  fs);..  /* It's 
31a80 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20  odd to simulate 
31a90 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65  an io-error here
31aa0 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69  , but really thi
31ab0 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75  s is just.  ** u
31ac0 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f  sing the io-erro
31ad0 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65  r infrastructure
31ae0 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51   to test that SQ
31af0 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69  Lite handles thi
31b00 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
31b10 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75  failing. This fu
31b20 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69  nction could fai
31b30 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c  l if, for exampl
31b40 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72  e, the.  ** curr
31b50 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  ent working dire
31b60 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75  ctory has been u
31b70 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20  nlinked..  */.  
31b80 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
31b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
31ba0 52 52 4f 52 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a  RROR );..  do {.
31bb0 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73 74 61  .    /* Call sta
31bc0 74 28 29 20 6f 6e 20 70 61 74 68 20 7a 49 6e 2e  t() on path zIn.
31bd0 20 53 65 74 20 62 4c 69 6e 6b 20 74 6f 20 74 72   Set bLink to tr
31be0 75 65 20 69 66 20 74 68 65 20 70 61 74 68 20 69  ue if the path i
31bf0 73 20 61 20 73 79 6d 62 6f 6c 69 63 0a 20 20 20  s a symbolic.   
31c00 20 2a 2a 20 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c   ** link, or fal
31c10 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a  se otherwise.  *
31c20 2f 0a 20 20 20 20 69 6e 74 20 62 4c 69 6e 6b 20  /.    int bLink 
31c30 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20  = 0;.    struct 
31c40 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66  stat buf;.    if
31c50 28 20 6f 73 4c 73 74 61 74 28 7a 49 6e 2c 20 26  ( osLstat(zIn, &
31c60 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  buf)!=0 ){.     
31c70 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45   if( errno!=ENOE
31c80 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  NT ){.        rc
31c90 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
31ca0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
31cb0 42 4b 50 54 2c 20 22 6c 73 74 61 74 22 2c 20 7a  BKPT, "lstat", z
31cc0 49 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  In);.      }.   
31cd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 4c   }else{.      bL
31ce0 69 6e 6b 20 3d 20 53 5f 49 53 4c 4e 4b 28 62 75  ink = S_ISLNK(bu
31cf0 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20  f.st_mode);.    
31d00 7d 0a 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b  }..    if( bLink
31d10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44   ){.      if( zD
31d20 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  el==0 ){.       
31d30 20 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zDel = sqlite3_
31d40 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20 20  malloc(nOut);.  
31d50 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d        if( zDel==
31d60 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
31d70 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
31d80 20 20 7d 65 6c 73 65 20 69 66 28 20 2b 2b 6e 4c    }else if( ++nL
31d90 69 6e 6b 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ink>SQLITE_MAX_S
31da0 59 4d 4c 49 4e 4b 53 20 29 7b 0a 20 20 20 20 20  YMLINKS ){.     
31db0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
31dc0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20  ANTOPEN_BKPT;.  
31dd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
31de0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
31df0 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20  {.        nByte 
31e00 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a 49 6e  = osReadlink(zIn
31e10 2c 20 7a 44 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b  , zDel, nOut-1);
31e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79  .        if( nBy
31e30 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  te<0 ){.        
31e40 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
31e50 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
31e60 50 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c  PEN_BKPT, "readl
31e70 69 6e 6b 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20  ink", zIn);.    
31e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31e90 20 20 20 20 20 69 66 28 20 7a 44 65 6c 5b 30 5d       if( zDel[0]
31ea0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  !='/' ){.       
31eb0 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20       int n;.    
31ec0 20 20 20 20 20 20 20 20 66 6f 72 28 6e 20 3d 20          for(n = 
31ed0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
31ee0 7a 49 6e 29 3b 20 6e 3e 30 20 26 26 20 7a 49 6e  zIn); n>0 && zIn
31ef0 5b 6e 2d 31 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29  [n-1]!='/'; n--)
31f00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
31f10 28 20 6e 42 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74  ( nByte+n+1>nOut
31f20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31f30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
31f40 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
31f50 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
31f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
31f70 6d 6d 6f 76 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20  mmove(&zDel[n], 
31f80 7a 44 65 6c 2c 20 6e 42 79 74 65 2b 31 29 3b 0a  zDel, nByte+1);.
31f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
31fa0 6d 63 70 79 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20  mcpy(zDel, zIn, 
31fb0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
31fc0 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20    nByte += n;.  
31fd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31ff0 20 20 7a 44 65 6c 5b 6e 42 79 74 65 5d 20 3d 20    zDel[nByte] = 
32000 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a  '\0';.        }.
32010 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a        }..      z
32020 49 6e 20 3d 20 7a 44 65 6c 3b 0a 20 20 20 20 7d  In = zDel;.    }
32030 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ..    assert( rc
32040 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a  !=SQLITE_OK || z
32050 49 6e 21 3d 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b  In!=zOut || zIn[
32060 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 20 20 69  0]=='/' );.    i
32070 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32080 20 26 26 20 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b   && zIn!=zOut ){
32090 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6b 46 75  .      rc = mkFu
320a0 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 49 6e 2c 20  llPathname(zIn, 
320b0 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 20  zOut, nOut);.   
320c0 20 7d 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b   }.    if( bLink
320d0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
320e0 20 7a 49 6e 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d   zIn = zOut;.  }
320f0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
32100 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74  E_OK );..  sqlit
32110 65 33 5f 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20  e3_free(zDel);. 
32120 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
32130 69 66 20 20 20 2f 2a 20 48 41 56 45 5f 52 45 41  if   /* HAVE_REA
32140 44 4c 49 4e 4b 20 26 26 20 48 41 56 45 5f 4c 53  DLINK && HAVE_LS
32150 54 41 54 20 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64  TAT */.}...#ifnd
32160 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c  ef SQLITE_OMIT_L
32170 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a  OAD_EXTENSION./*
32180 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66  .** Interfaces f
32190 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61  or opening a sha
321a0 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e  red library, fin
321b0 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74  ding entry point
321c0 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20  s.** within the 
321d0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20  shared library, 
321e0 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20  and closing the 
321f0 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a  shared library..
32200 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66  */.#include <dlf
32210 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  cn.h>.static voi
32220 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71  d *unixDlOpen(sq
32230 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
32240 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ed, const char *
32250 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e  zFilename){.  UN
32260 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
32270 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
32280 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  n dlopen(zFilena
32290 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52  me, RTLD_NOW | R
322a0 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a  TLD_GLOBAL);.}..
322b0 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c  /*.** SQLite cal
322c0 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ls this function
322d0 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
322e0 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69  er a call to uni
322f0 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75  xDlSym() or.** u
32300 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c  nixDlOpen() fail
32310 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c  s (returns a nul
32320 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61  l pointer). If a
32330 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65   more detailed e
32340 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20  rror.** message 
32350 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74  is available, it
32360 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a   is written to z
32370 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72  BufOut. If no er
32380 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
32390 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75  s available, zBu
323a0 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d  fOut is left unm
323b0 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69  odified and SQLi
323c0 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c  te uses a defaul
323d0 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61  t.** error messa
323e0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
323f0 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73  id unixDlError(s
32400 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
32410 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63  sed, int nBuf, c
32420 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
32430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
32440 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  r;.  UNUSED_PARA
32450 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32460 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
32470 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65  ();.  zErr = dle
32480 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45  rror();.  if( zE
32490 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
324a0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c  3_snprintf(nBuf,
324b0 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20   zBufOut, "%s", 
324c0 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  zErr);.  }.  uni
324d0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
324e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75  .static void (*u
324f0 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  nixDlSym(sqlite3
32500 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
32510 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
32520 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  ar*zSym))(void){
32530 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20  .  /* .  ** GCC 
32540 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
32550 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20  rrors says that 
32560 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c  C90 does not all
32570 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65  ow a void* to be
32580 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20  .  ** cast into 
32590 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
325a0 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65  unction.  And ye
325b0 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c  t the library dl
325c0 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20  sym() routine.  
325d0 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69  ** returns a voi
325e0 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c  d* which is real
325f0 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ly a pointer to 
32600 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20  a function.  So 
32610 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75  how do we.  ** u
32620 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20  se dlsym() with 
32630 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73  -pedantic-errors
32640 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69  ?.  **.  ** Vari
32650 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20  able x below is 
32660 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20  defined to be a 
32670 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
32680 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a  ction taking.  *
32690 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69  * parameters voi
326a0 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61  d* and const cha
326b0 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67  r* and returning
326c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
326d0 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57  function..  ** W
326e0 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62  e initialize x b
326f0 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61  y assigning it a
32700 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
32710 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e  dlsym() function
32720 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73  ..  ** (That ass
32730 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73  ignment requires
32740 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20   a cast.)  Then 
32750 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63  we call the func
32760 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78  tion that.  ** x
32770 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20   points to.  .  
32780 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72  **.  ** This wor
32790 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69  k-around is unli
327a0 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72  kely to work cor
327b0 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79  rectly on any sy
327c0 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20  stem where.  ** 
327d0 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f  you really canno
327e0 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f  t cast a functio
327f0 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76  n pointer into v
32800 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c  oid*.  But then,
32810 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68   on the.  ** oth
32820 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29  er hand, dlsym()
32830 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f   will not work o
32840 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20  n such a system 
32850 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61  either, so we ha
32860 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c  ve.  ** not real
32870 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67  ly lost anything
32880 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ..  */.  void (*
32890 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  (*x)(void*,const
328a0 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a   char*))(void);.
328b0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
328c0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78  ER(NotUsed);.  x
328d0 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f   = (void(*(*)(vo
328e0 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
328f0 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20  )(void))dlsym;. 
32900 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20   return (*x)(p, 
32910 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20  zSym);.}.static 
32920 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65  void unixDlClose
32930 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32940 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61  tUsed, void *pHa
32950 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f  ndle){.  UNUSED_
32960 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
32970 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48  d);.  dlclose(pH
32980 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20  andle);.}.#else 
32990 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49  /* if SQLITE_OMI
329a0 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
329b0 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a   is defined: */.
329c0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
329d0 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e  Open  0.  #defin
329e0 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a  e unixDlError 0.
329f0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
32a00 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e  Sym   0.  #defin
32a10 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a  e unixDlClose 0.
32a20 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
32a30 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
32a40 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f  f random data to
32a50 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75   the supplied bu
32a60 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74  ffer zBuf..*/.st
32a70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e  atic int unixRan
32a80 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
32a90 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
32aa0 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
32ab0 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  uf){.  UNUSED_PA
32ac0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
32ad0 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65  ;.  assert((size
32ae0 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66  _t)nBuf>=(sizeof
32af0 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28  (time_t)+sizeof(
32b00 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65  int)));..  /* We
32b10 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
32b20 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
32b30 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
32b40 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
32b50 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
32b60 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
32b70 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
32b80 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
32b90 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
32ba0 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
32bb0 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
32bc0 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
32bd0 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
32be0 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
32bf0 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
32c00 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
32c10 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
32c20 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
32c30 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
32c40 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
32c50 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
32c60 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
32c70 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
32c80 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
32c90 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
32ca0 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
32cb0 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
32cc0 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
32cd0 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
32ce0 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
32cf0 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
32d00 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
32d10 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
32d20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
32d30 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
32d40 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20  mber sequence.  
32d50 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
32d60 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
32d70 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
32d80 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75  set(zBuf, 0, nBu
32d90 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73  f);.  randomness
32da0 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30  Pid = osGetpid(0
32db0 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  );  .#if !define
32dc0 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26  d(SQLITE_TEST) &
32dd0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
32de0 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53  E_OMIT_RANDOMNES
32df0 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66  S).  {.    int f
32e00 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d  d, got;.    fd =
32e10 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64   robust_open("/d
32e20 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52  ev/urandom", O_R
32e30 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69  DONLY, 0);.    i
32e40 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
32e50 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20   time_t t;.     
32e60 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20   time(&t);.     
32e70 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74   memcpy(zBuf, &t
32e80 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20  , sizeof(t));.  
32e90 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
32ea0 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61  [sizeof(t)], &ra
32eb0 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a  ndomnessPid, siz
32ec0 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
32ed0 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d));.      asser
32ee0 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a  t( sizeof(t)+siz
32ef0 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
32f00 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66  d)<=(size_t)nBuf
32f10 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d   );.      nBuf =
32f20 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a   sizeof(t) + siz
32f30 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69  eof(randomnessPi
32f40 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
32f50 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f       do{ got = o
32f60 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20  sRead(fd, zBuf, 
32f70 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67  nBuf); }while( g
32f80 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  ot<0 && errno==E
32f90 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f  INTR );.      ro
32fa0 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64  bust_close(0, fd
32fb0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
32fc0 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
32fd0 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a  return nBuf;.}..
32fe0 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72  ./*.** Sleep for
32ff0 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e   a little while.
33000 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f    Return the amo
33010 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70  unt of time slep
33020 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65  t..** The argume
33030 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  nt is the number
33040 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
33050 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65   we want to slee
33060 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  p..** The return
33070 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
33080 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63  mber of microsec
33090 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63  onds of sleep ac
330a0 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73  tually.** reques
330b0 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  ted from the und
330c0 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e  erlying operatin
330d0 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62  g system, a numb
330e0 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68  er which.** migh
330f0 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61  t be greater tha
33100 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68  n or equal to th
33110 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20  e argument, but 
33120 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e  not less.** than
33130 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   the argument..*
33140 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
33150 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  xSleep(sqlite3_v
33160 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
33170 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a   microseconds){.
33180 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
33190 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
331a0 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65   sp;..  sp.tv_se
331b0 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  c = microseconds
331c0 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70   / 1000000;.  sp
331d0 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72  .tv_nsec = (micr
331e0 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30  oseconds % 10000
331f0 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61  00) * 1000;.  na
33200 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c  nosleep(&sp, NUL
33210 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  L);.  UNUSED_PAR
33220 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
33230 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73  .  return micros
33240 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65  econds;.#elif de
33250 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45  fined(HAVE_USLEE
33260 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45  P) && HAVE_USLEE
33270 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f  P.  usleep(micro
33280 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
33290 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
332a0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
332b0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
332c0 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64  lse.  int second
332d0 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64  s = (microsecond
332e0 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30  s+999999)/100000
332f0 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e  0;.  sleep(secon
33300 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ds);.  UNUSED_PA
33310 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
33320 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e  ;.  return secon
33330 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64  ds*1000000;.#end
33340 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if.}../*.** The 
33350 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
33360 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
33370 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  non-zero value, 
33380 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
33390 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
333a0 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  of seconds since
333b0 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65   1970 and is use
333c0 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73  d to set the res
333d0 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  ult of.** sqlite
333e0 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29  3OsCurrentTime()
333f0 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e   during testing.
33400 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
33410 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
33420 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
33430 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79  = 0;  /* Fake sy
33440 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63  stem time in sec
33450 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e  onds since 1970.
33460 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
33470 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
33480 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
33490 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
334a0 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
334b0 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74  into *piNow.** t
334c0 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
334d0 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
334e0 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
334f0 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30  times 86_400_000
33500 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77  .  In.** other w
33510 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f  ords, write into
33520 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62   *piNow the numb
33530 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
33540 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c  ds since the Jul
33550 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20  ian.** epoch of 
33560 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63  noon in Greenwic
33570 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34  h on November 24
33580 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72  , 4714 B.C accor
33590 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70  ding to the.** p
335a0 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69  roleptic Gregori
335b0 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a  an calendar..**.
335c0 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72  ** On success, r
335d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
335e0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
335f0 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d  ERROR if the tim
33600 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63  e and date .** c
33610 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
33620 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
33630 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  ixCurrentTimeInt
33640 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  64(sqlite3_vfs *
33650 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33  NotUsed, sqlite3
33660 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a  _int64 *piNow){.
33670 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
33680 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69  qlite3_int64 uni
33690 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37  xEpoch = 2440587
336a0 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  5*(sqlite3_int64
336b0 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20  )8640000;.  int 
336c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
336d0 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  #if defined(NO_G
336e0 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
336f0 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
33700 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69   *piNow = ((sqli
33710 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30  te3_int64)t)*100
33720 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23  0 + unixEpoch;.#
33730 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
33740 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
33750 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
33760 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
33770 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
33780 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
33790 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
337a0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
337b0 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
337c0 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23  _nsec/1000000;.#
337d0 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
337e0 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76  meval sNow;.  (v
337f0 6f 69 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79  oid)gettimeofday
33800 28 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20  (&sNow, 0);  /* 
33810 43 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65  Cannot fail give
33820 6e 20 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74  n valid argument
33830 73 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  s */.  *piNow = 
33840 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
33850 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
33860 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
33870 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b  ow.tv_usec/1000;
33880 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
33890 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
338a0 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  ( sqlite3_curren
338b0 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70  t_time ){.    *p
338c0 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c  iNow = 1000*(sql
338d0 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74  ite3_int64)sqlit
338e0 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20  e3_current_time 
338f0 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d  + unixEpoch;.  }
33900 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44  .#endif.  UNUSED
33910 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
33920 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
33930 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
33940 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
33950 54 45 44 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  TED./*.** Find t
33960 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
33970 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
33980 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
33990 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
339a0 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
339b0 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
339c0 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
339d0 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
339e0 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
339f0 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
33a00 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
33a10 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  e found..*/.stat
33a20 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65  ic int unixCurre
33a30 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
33a40 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75  fs *NotUsed, dou
33a50 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73  ble *prNow){.  s
33a60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d  qlite3_int64 i =
33a70 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
33a80 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
33a90 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20  (NotUsed);.  rc 
33aa0 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d  = unixCurrentTim
33ab0 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20  eInt64(0, &i);. 
33ac0 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30   *prNow = i/8640
33ad0 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e  0000.0;.  return
33ae0 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64   rc;.}.#else.# d
33af0 65 66 69 6e 65 20 75 6e 69 78 43 75 72 72 65 6e  efine unixCurren
33b00 74 54 69 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a  tTime 0.#endif..
33b10 2f 2a 0a 2a 2a 20 54 68 65 20 78 47 65 74 4c 61  /*.** The xGetLa
33b20 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64  stError() method
33b30 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
33b40 72 65 74 75 72 6e 20 61 20 62 65 74 74 65 72 0a  return a better.
33b50 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72  ** low-level err
33b60 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20  or message when 
33b70 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d  operating-system
33b80 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75   problems come u
33b90 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69  p.** during SQLi
33ba0 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f  te operation.  O
33bb0 6e 6c 79 20 74 68 65 20 69 6e 74 65 67 65 72 20  nly the integer 
33bc0 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 63  return code is c
33bd0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  urrently.** used
33be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
33bf0 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
33c00 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
33c10 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
33c20 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73  ed2, char *NotUs
33c30 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed3){.  UNUSED_P
33c40 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33c50 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
33c60 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b  METER(NotUsed2);
33c70 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33c80 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20  TER(NotUsed3);. 
33c90 20 72 65 74 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d   return errno;.}
33ca0 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../*.**********
33cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
33cc0 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66  nd of sqlite3_vf
33cd0 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
33ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33cf0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
33d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d40 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
33d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d90 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
33da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33db0 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f  * Begin Proxy Lo
33dc0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
33dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33de0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f  ******.**.** Pro
33df0 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20  xy locking is a 
33e00 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65  "uber-locking-me
33e10 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65  thod" in this se
33e20 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68  nse:  It uses th
33e30 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69  e.** other locki
33e40 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65  ng methods on se
33e50 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c  condary lock fil
33e60 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69  es.  Proxy locki
33e70 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d  ng is a.** meta-
33e80 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f  layer over top o
33e90 66 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  f the primitive 
33ea0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
33eb0 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a  ted above.  For.
33ec0 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  ** this reason, 
33ed0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
33ee0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20  t implements of 
33ef0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
33f00 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74   deferred.** unt
33f10 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66  il late in the f
33f20 69 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72  ile (here) after
33f30 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65   all of the othe
33f40 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61  r I/O methods ha
33f50 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e  ve.** been defin
33f60 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65  ed - so that the
33f70 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69   primitive locki
33f80 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61  ng methods are a
33f90 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73  vailable.** as s
33fa0 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20  ervices to help 
33fb0 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65  with the impleme
33fc0 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79  ntation of proxy
33fd0 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a   locking..**.***
33fe0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61  *.**.** The defa
33ff0 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  ult locking sche
34000 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73  mes in SQLite us
34010 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
34020 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74  ks on the.** dat
34030 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f  abase file to co
34040 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63  ordinate safe, c
34050 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73  oncurrent access
34060 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61   by multiple rea
34070 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74  ders.** and writ
34080 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69  ers [http://sqli
34090 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33  te.org/lockingv3
340a0 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76  .html].  The fiv
340b0 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a  e file locking.*
340c0 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b  * states (UNLOCK
340d0 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41  ED, PENDING, SHA
340e0 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45  RED, RESERVED, E
340f0 58 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d  XCLUSIVE) are im
34100 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20  plemented.** as 
34110 50 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69  POSIX read & wri
34120 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69  te locks over fi
34130 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74  xed set of locat
34140 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29  ions (via fsctl)
34150 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20  ,.** on AFP and 
34160 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69  SMB only exclusi
34170 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  ve byte-range lo
34180 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  cks are availabl
34190 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77  e via fsctl.** w
341a0 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32  ith _IOWR('z', 2
341b0 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
341c0 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74  ngeLockPB2) to t
341d0 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20  rack the same 5 
341e0 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69  states..** To si
341f0 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b  mulate a F_RDLCK
34200 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   on the shared r
34210 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72  ange, on AFP a r
34220 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64  andomly selected
34230 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74  .** address in t
34240 68 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20  he shared range 
34250 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53  is taken for a S
34260 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
34270 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64  entire.** shared
34280 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20   range is taken 
34290 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45  for an EXCLUSIVE
342a0 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20   lock):.**.**   
342b0 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20     PENDING_BYTE 
342c0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
342d0 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56  0.**      RESERV
342e0 45 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78  ED_BYTE       0x
342f0 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20  40000001.**     
34300 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20   SHARED_RANGE   
34310 20 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20       0x40000002 
34320 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a  -> 0x40000200.**
34330 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77  .** This works w
34340 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  ell on the local
34350 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75   file system, bu
34360 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79  t shows a nearly
34370 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77   100x.** slowdow
34380 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72  n in read perfor
34390 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63  mance on AFP bec
343a0 61 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69  ause the AFP cli
343b0 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20  ent disables.** 
343c0 74 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77  the read cache w
343d0 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  hen byte-range l
343e0 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74  ocks are present
343f0 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20  .  Enabling the 
34400 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78  read.** cache ex
34410 70 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f  poses a cache co
34420 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20  herency problem 
34430 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20  that is present 
34440 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73  on all OS X.** s
34450 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b  upported network
34460 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20   file systems.  
34470 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68  NFS and AFP both
34480 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20   observe the.** 
34490 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65  close-to-open se
344a0 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75  mantics for ensu
344b0 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72  ring cache coher
344c0 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f  ency.** [http://
344d0 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e  nfs.sourceforge.
344e0 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68  net/#faq_a8], wh
344f0 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66  ich does not eff
34500 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72  ectively.** addr
34510 65 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d  ess the requirem
34520 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72  ents for concurr
34530 65 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63  ent database acc
34540 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a  ess by multiple.
34550 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77  ** readers and w
34560 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a  riters.** [http:
34570 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d  //www.nabble.com
34580 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63  /SQLite-on-NFS-c
34590 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74  ache-coherency-t
345a0 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e  d15655701.html].
345b0 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73  .**.** To addres
345c0 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63  s the performanc
345d0 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65  e and cache cohe
345e0 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72  rency issues, pr
345f0 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oxy file locking
34600 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20  .** changes the 
34610 77 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63  way database acc
34620 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65  ess is controlle
34630 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63  d by limiting ac
34640 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e  cess to a.** sin
34650 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69  gle host at a ti
34660 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69  me and moving fi
34670 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20  le locks off of 
34680 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34690 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20  e.** and onto a 
346a0 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68  proxy file on th
346b0 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  e local file sys
346c0 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  tem.  .**.**.** 
346d0 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b  Using proxy lock
346e0 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
346f0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41  ------.**.** C A
34700 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74  PIs.**.**  sqlit
34710 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
34720 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
34730 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
34740 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
34750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34760 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68       <proxy_path
34770 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a  > | ":auto:");.*
34780 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
34790 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
347a0 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
347b0 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _GET_LOCKPROXYFI
347c0 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
347d0 20 20 20 20 20 20 20 20 20 20 20 20 20 26 3c 70               &<p
347e0 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a  roxy_path>);.**.
347f0 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61  **.** SQL pragma
34800 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20  s.**.**  PRAGMA 
34810 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f  [database.]lock_
34820 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78  proxy_file=<prox
34830 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a  y_path> | :auto:
34840 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74  .**  PRAGMA [dat
34850 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78  abase.]lock_prox
34860 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65  y_file.**.** Spe
34870 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22  cifying ":auto:"
34880 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74   means that if t
34890 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20  here is a conch 
348a0 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63  file with a matc
348b0 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20  hing.** host ID 
348c0 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79  in it, the proxy
348d0 20 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e   path in the con
348e0 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
348f0 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a  used, otherwise.
34900 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20  ** a proxy path 
34910 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65  based on the use
34920 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20  r's temp dir.** 
34930 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53  (via confstr(_CS
34940 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
34950 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c  P_DIR,...)) will
34960 20 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65   be used and the
34970 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79  .** actual proxy
34980 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65   file name is ge
34990 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65  nerated from the
349a0 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f   name and path o
349b0 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
349c0 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61  e file.  For exa
349d0 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  mple:.**.**     
349e0 20 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70    For database p
349f0 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66  ath "/Users/me/f
34a00 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20  oo.db" .**      
34a10 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77   The lock path w
34a20 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e  ill be "<tmpdir>
34a30 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55  /sqliteplocks/_U
34a40 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61  sers_me_foo.db:a
34a50 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63  uto:").**.** Onc
34a60 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69  e a lock proxy i
34a70 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  s configured for
34a80 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
34a90 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e  ection, it can n
34aa0 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64  ot.** be removed
34ab0 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79  , however it may
34ac0 20 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20   be switched to 
34ad0 61 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78  a different prox
34ae0 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68  y path via.** th
34af0 65 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73  e above APIs (as
34b00 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68  suming the conch
34b10 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69   file is not bei
34b20 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68  ng held by anoth
34b30 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  er.** connection
34b40 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a   or process). .*
34b50 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78  *.**.** How prox
34b60 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a  y locking works.
34b70 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ** -------------
34b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
34b90 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   Proxy file lock
34ba0 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61  ing relies prima
34bb0 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20  rily on two new 
34bc0 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73  supporting files
34bd0 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f  : .**.**   *  co
34be0 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69  nch file to limi
34bf0 74 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  t access to the 
34c00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
34c10 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a   a single host.*
34c20 2a 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65  *      at a time
34c30 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78  .**.**   *  prox
34c40 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73  y file to act as
34c50 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65   a proxy for the
34c60 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
34c70 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20  normally.**     
34c80 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61   taken on the da
34c90 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65  tabase.**.** The
34ca0 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f   conch file - to
34cb0 20 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c   use a proxy fil
34cc0 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66  e, sqlite must f
34cd0 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63  irst "hold the c
34ce0 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69  onch".** by taki
34cf0 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79  ng an sqlite-sty
34d00 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f  le shared lock o
34d10 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  n the conch file
34d20 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a  , reading the.**
34d30 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f   contents and co
34d40 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74  mparing the host
34d50 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49  's unique host I
34d60 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e  D (see below) an
34d70 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20  d lock.** proxy 
34d80 70 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65  path against the
34d90 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
34da0 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68  n the conch.  Th
34db0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a  e conch file is.
34dc0 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ** stored in the
34dd0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
34de0 61 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  as the database 
34df0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
34e00 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74  e name.** is pat
34e10 74 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65  terned after the
34e20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   database file n
34e30 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61  ame as ".<databa
34e40 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a  sename>-conch"..
34e50 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20  ** If the conch 
34e60 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
34e70 69 73 74 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74  ist, or its cont
34e80 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63  ents do not matc
34e90 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44  h the.** host ID
34ea0 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61   and/or proxy pa
34eb0 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  th, then the loc
34ec0 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74  k is escalated t
34ed0 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a  o an exclusive.*
34ee0 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63  * lock and the c
34ef0 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e  onch file conten
34f00 74 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69  ts is updated wi
34f10 74 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61  th the host ID a
34f20 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68  nd proxy.** path
34f30 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73   and the lock is
34f40 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61   downgraded to a
34f50 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61   shared lock aga
34f60 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63  in.  If the conc
34f70 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20  h.** is held by 
34f80 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
34f90 28 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c  (with a shared l
34fa0 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73  ock), the exclus
34fb0 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c  ive lock.** will
34fc0 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45   fail and SQLITE
34fd0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
34fe0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  d..**.** The pro
34ff0 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67  xy file - a sing
35000 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65  le-byte file use
35010 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f  d for all adviso
35020 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a  ry file locks.**
35030 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20   normally taken 
35040 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35050 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c  file.   This all
35060 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61  ows for safe sha
35070 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64  ring.** of the d
35080 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
35090 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
350a0 73 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e  s and writers on
350b0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73   the same.** hos
350c0 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73  t (the conch ens
350d0 75 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61  ures that they a
350e0 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  ll use the same 
350f0 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29  local lock file)
35100 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69  ..**.** Requesti
35110 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78  ng the lock prox
35120 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64  y does not immed
35130 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20  iately take the 
35140 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20  conch, it is.** 
35150 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20  only taken when 
35160 74 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73  the first reques
35170 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61  t to lock databa
35180 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e  se file is made.
35190 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68    .** This match
351a0 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73  es the semantics
351b0 20 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f   of the traditio
351c0 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61  nal locking beha
351d0 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f  vior, where.** o
351e0 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74  pening a connect
351f0 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73  ion to a databas
35200 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
35210 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69  take a lock on i
35220 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64  t..** The shared
35230 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65   lock and an ope
35240 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
35250 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64  r are maintained
35260 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63   until .** the c
35270 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
35280 20 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f   database is clo
35290 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sed. .**.** The 
352a0 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74  proxy file and t
352b0 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65  he lock file are
352c0 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73   never deleted s
352d0 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64  o they only need
352e0 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65  .** to be create
352f0 64 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  d the first time
35300 20 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a   they are used..
35310 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74  **.** Configurat
35320 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d  ion options.** -
35330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35340 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49  ----.**.**  SQLI
35350 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
35360 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20  LOCKING.**.**   
35370 20 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c      Database fil
35380 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e  es accessed on n
35390 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  on-local file sy
353a0 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20  stems are.**    
353b0 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79     automatically
353c0 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
353d0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c  proxy locking, l
353e0 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a  ock files are.**
353f0 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74         named aut
35400 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67  omatically using
35410 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20   the same logic 
35420 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47  as.**       PRAG
35430 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  MA lock_proxy_fi
35440 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20  le=":auto:".**  
35450 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52    .**  SQLITE_PR
35460 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20  OXY_DEBUG.**.** 
35470 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68        Enables th
35480 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72  e logging of err
35490 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69  or messages duri
354a0 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a  ng host id file.
354b0 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76  **       retriev
354c0 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a  al and creation.
354d0 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59  **.**  LOCKPROXY
354e0 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  DIR.**.**       
354f0 4f 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65  Overrides the de
35500 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20  fault directory 
35510 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72  used for lock pr
35520 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a  oxy files that.*
35530 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65  *       are name
35540 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  d automatically 
35550 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22  via the ":auto:"
35560 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20   setting.**.**  
35570 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
35580 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
35590 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ONS.**.**       
355a0 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75  Permissions to u
355b0 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  se when creating
355c0 20 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72   a directory for
355d0 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20   storing the.** 
355e0 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79        lock proxy
355f0 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65   files, only use
35600 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59  d when LOCKPROXY
35610 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a  DIR is not set..
35620 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a  **    .**    .**
35630 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62   As mentioned ab
35640 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c  ove, when compil
35650 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50  ed with SQLITE_P
35660 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
35670 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20  ING,.** setting 
35680 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  the environment 
35690 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f  variable SQLITE_
356a0 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
356b0 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a  ING to 1 will.**
356c0 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63   force proxy loc
356d0 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20  king to be used 
356e0 66 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61  for every databa
356f0 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20  se file opened, 
35700 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f  and 0.** will fo
35710 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72  rce automatic pr
35720 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62  oxy locking to b
35730 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61  e disabled for a
35740 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  ll database.** f
35750 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74 6c 79  iles (explicitly
35760 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c   calling the SQL
35770 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f  ITE_FCNTL_SET_LO
35780 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67  CKPROXYFILE prag
35790 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f  ma or.** sqlite_
357a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49  file_control API
357b0 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64   is not affected
357c0 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   by SQLITE_FORCE
357d0 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e  _PROXY_LOCKING).
357e0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79  .*/../*.** Proxy
357f0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
35800 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
35810 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66  cOSX .*/.#if def
35820 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
35830 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
35840 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a  _LOCKING_STYLE..
35850 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c  /*.** The proxyL
35860 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61  ockingContext ha
35870 73 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66  s the path and f
35880 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66  ile structures f
35890 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a  or the remote .*
358a0 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78  * and local prox
358b0 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f  y files in it.*/
358c0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
358d0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
358e0 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  ext proxyLocking
358f0 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20  Context;.struct 
35900 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
35910 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ext {.  unixFile
35920 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20   *conchFile;    
35930 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
35940 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  ch file */.  cha
35950 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  r *conchFilePath
35960 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  ;         /* Nam
35970 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66  e of the conch f
35980 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
35990 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20  e *lockProxy;   
359a0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72        /* Open pr
359b0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
359c0 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f  .  char *lockPro
359d0 78 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  xyPath;         
359e0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70  /* Name of the p
359f0 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a  roxy lock file *
35a00 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68  /.  char *dbPath
35a10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
35a20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
35a30 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69  open file */.  i
35a40 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20  nt conchHeld;   
35a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
35a60 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73   if the conch is
35a70 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63   held, -1 if loc
35a80 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  kless */.  int n
35a90 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20 20 20  Fails;          
35aa0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
35ab0 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e  r of conch takin
35ac0 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20  g failures */.  
35ad0 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67  void *oldLocking
35ae0 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20  Context;     /* 
35af0 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67  Original locking
35b00 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f  context to resto
35b10 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20  re on close */. 
35b20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
35b30 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d  ods const *pOldM
35b40 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72  ethod;     /* Or
35b50 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f  iginal I/O metho
35b60 64 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a  ds for close */.
35b70 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70  };../* .** The p
35b80 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70  roxy lock file p
35b90 61 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61  ath for the data
35ba0 62 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69  base at dbPath i
35bb0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c  s written into l
35bc0 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20  Path, .** which 
35bd0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61  must point to va
35be0 6c 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65  lid, writable me
35bf0 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67  mory large enoug
35c00 68 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c  h for a maxLen l
35c10 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61  ength.** file pa
35c20 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  th. .*/.static i
35c30 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50  nt proxyGetLockP
35c40 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
35c50 64 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50  dbPath, char *lP
35c60 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c  ath, size_t maxL
35c70 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a  en){.  int len;.
35c80 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69    int dbLen;.  i
35c90 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f  nt i;..#ifdef LO
35ca0 43 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e  CKPROXYDIR.  len
35cb0 20 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68   = strlcpy(lPath
35cc0 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20  , LOCKPROXYDIR, 
35cd0 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23  maxLen);.#else.#
35ce0 20 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49   ifdef _CS_DARWI
35cf0 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a  N_USER_TEMP_DIR.
35d00 20 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e    {.    if( !con
35d10 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
35d20 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c  USER_TEMP_DIR, l
35d30 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b  Path, maxLen) ){
35d40 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
35d50 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61  "GETLOCKPATH  fa
35d60 69 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64  iled %s errno=%d
35d70 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
35d80 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68             lPath
35d90 2c 20 65 72 72 6e 6f 2c 20 6f 73 47 65 74 70 69  , errno, osGetpi
35da0 64 28 30 29 29 29 3b 0a 20 20 20 20 20 20 72 65  d(0)));.      re
35db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
35dc0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  R_LOCK;.    }.  
35dd0 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
35de0 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c  lPath, "sqlitepl
35df0 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20  ocks", maxLen); 
35e00 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20     .  }.# else. 
35e10 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
35e20 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d  Path, "/tmp/", m
35e30 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a  axLen);.# endif.
35e40 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50  #endif..  if( lP
35e50 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20  ath[len-1]!='/' 
35e60 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ){.    len = str
35e70 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c  lcat(lPath, "/",
35e80 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20   maxLen);.  }.  
35e90 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20  .  /* transform 
35ea0 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61  the db path to a
35eb0 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61   unique cache na
35ec0 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20  me */.  dbLen = 
35ed0 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
35ee0 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b  th);.  for( i=0;
35ef0 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c   i<dbLen && (i+l
35f00 65 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65  en+7)<(int)maxLe
35f10 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  n; i++){.    cha
35f20 72 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b  r c = dbPath[i];
35f30 0a 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e  .    lPath[i+len
35f40 5d 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27  ] = (c=='/')?'_'
35f50 3a 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b  :c;.  }.  lPath[
35f60 69 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73  i+len]='\0';.  s
35f70 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a  trlcat(lPath, ":
35f80 61 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b  auto:", maxLen);
35f90 0a 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54  .  OSTRACE(("GET
35fa0 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20  LOCKPATH  proxy 
35fb0 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64  lock path=%s pid
35fc0 3d 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 6f  =%d\n", lPath, o
35fd0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
35fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
35ff0 3b 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65  ;.}../* . ** Cre
36000 61 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69  ates the lock fi
36010 6c 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69  le and any missi
36020 6e 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69  ng directories i
36030 6e 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73  n lockPath. */.s
36040 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
36050 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f  reateLockPath(co
36060 6e 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61  nst char *lockPa
36070 74 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65  th){.  int i, le
36080 6e 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41  n;.  char buf[MA
36090 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74  XPATHLEN];.  int
360a0 20 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20   start = 0;.  . 
360b0 20 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68   assert(lockPath
360c0 21 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72  !=NULL);.  /* tr
360d0 79 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20  y to create all 
360e0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
360f0 20 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a   directories */.
36100 20 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72    len = (int)str
36110 6c 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20  len(lockPath);. 
36120 20 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61   buf[0] = lockPa
36130 74 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d  th[0];.  for( i=
36140 31 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b  1; i<len; i++ ){
36150 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74  .    if( lockPat
36160 68 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28  h[i] == '/' && (
36170 69 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29  i - start > 0) )
36180 7b 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20  {.      /* only 
36190 6d 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69  mkdir if leaf di
361a0 72 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20  r != "." or "/" 
361b0 6f 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20  or ".." */.     
361c0 20 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c   if( i-start>2 |
361d0 7c 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26  | (i-start==1 &&
361e0 20 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27   buf[start] != '
361f0 2e 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d  .' && buf[start]
36200 20 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20   != '/') .      
36210 20 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d     || (i-start==
36220 32 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  2 && buf[start] 
36230 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74  != '.' && buf[st
36240 61 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29  art+1] != '.') )
36250 7b 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d  {.        buf[i]
36260 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69  ='\0';.        i
36270 66 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20  f( osMkdir(buf, 
36280 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
36290 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
362a0 4f 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ONS) ){.        
362b0 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
362c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
362d0 72 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20  rr!=EEXIST ) {. 
362e0 20 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41             OSTRA
362f0 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
36300 41 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61  ATH  FAILED crea
36310 74 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20  ting %s, ".     
36320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36330 22 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b  "'%s' proxy lock
36340 20 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c   path=%s pid=%d\
36350 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
36360 20 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74           buf, st
36370 72 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63  rerror(err), loc
36380 6b 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28  kPath, osGetpid(
36390 30 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  0)));.          
363a0 20 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20    return err;.  
363b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
363c0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
363d0 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20    start=i+1;.   
363e0 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20   }.    buf[i] = 
363f0 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d  lockPath[i];.  }
36400 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45  .  OSTRACE(("CRE
36410 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f  ATELOCKPATH  pro
36420 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20  xy lock path=%s 
36430 70 69 64 3d 25 64 5c 6e 22 2c 6c 6f 63 6b 50 61  pid=%d\n",lockPa
36440 74 68 2c 6f 73 47 65 74 70 69 64 28 30 29 29 29  th,osGetpid(0)))
36450 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
36460 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
36470 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73  new VFS file des
36480 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20  criptor (stored 
36490 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
364a0 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
364b0 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f  e3_malloc) and o
364c0 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d  pen the file nam
364d0 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65  ed "path" in the
364e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
364f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
36500 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
36510 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63  e not only for c
36520 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20  losing the file 
36530 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75  descriptor.** bu
36540 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69  t also for freei
36550 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73  ng the memory as
36560 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
36570 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
36580 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
36590 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78   proxyCreateUnix
365a0 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20  File(.    const 
365b0 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
365c0 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74     /* path for t
365d0 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20  he new unixFile 
365e0 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  */.    unixFile 
365f0 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20  **ppFile,       
36600 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61  /* unixFile crea
36610 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64  ted and returned
36620 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20 69   by ref */.    i
36630 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20 20  nt islockfile   
36640 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e 6f          /* if no
36650 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20 64  n zero missing d
36660 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65 61  irs will be crea
36670 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e 74  ted */.) {.  int
36680 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69 78   fd = -1;.  unix
36690 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  File *pNew;.  in
366a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
366b0 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
366c0 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43  s = O_RDWR | O_C
366d0 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33 5f  REAT;.  sqlite3_
366e0 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20 20  vfs dummyVfs;.  
366f0 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b 0a  int terrno = 0;.
36700 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
36710 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b 0a  pUnused = NULL;.
36720 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20 74  .  /* 1. first t
36730 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74  ry to open/creat
36740 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20  e the file.  ** 
36750 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73  2. if that fails
36760 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20  , and this is a 
36770 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d 63  lock file (not-c
36780 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61 74  onch), try creat
36790 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61 72  ing.  ** the par
367a0 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73 20  ent directories 
367b0 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67 61  and then try aga
367c0 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20 74  in..  ** 3. if t
367d0 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20 74  hat fails, try t
367e0 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
367f0 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20 6f  read-only.  ** o
36800 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e 20  therwise return 
36810 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66 69  BUSY (if lock fi
36820 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e 20  le) or CANTOPEN 
36830 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66 69  for the conch fi
36840 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73 65  le.  */.  pUnuse
36850 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65  d = findReusable
36860 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  Fd(path, openFla
36870 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75 73  gs);.  if( pUnus
36880 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 70  ed ){.    fd = p
36890 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d 65  Unused->fd;.  }e
368a0 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65 64  lse{.    pUnused
368b0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
368c0 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e 75  c64(sizeof(*pUnu
368d0 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20 21  sed));.    if( !
368e0 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
368f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
36900 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
36910 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20  .  }.  if( fd<0 
36920 29 7b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75  ){.    fd = robu
36930 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70  st_open(path, op
36940 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  enFlags, 0);.   
36950 20 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   terrno = errno;
36960 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 26 26  .    if( fd<0 &&
36970 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26   errno==ENOENT &
36980 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a  & islockfile ){.
36990 20 20 20 20 20 20 69 66 28 20 70 72 6f 78 79 43        if( proxyC
369a0 72 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 70 61  reateLockPath(pa
369b0 74 68 29 20 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b  th) == SQLITE_OK
369c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 64 20 3d   ){.        fd =
369d0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
369e0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
369f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
36a00 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
36a10 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20  {.    openFlags 
36a20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
36a30 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  fd = robust_open
36a40 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73  (path, openFlags
36a50 2c 20 30 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f  , 0);.    terrno
36a60 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20   = errno;.  }.  
36a70 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
36a80 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65 20 29  if( islockfile )
36a90 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
36aa0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
36ab0 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28 74 65  }.    switch (te
36ac0 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20 63 61  rrno) {.      ca
36ad0 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20 20 20  se EACCES:.     
36ae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36af0 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63 61 73  _PERM;.      cas
36b00 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20 20 20  e EIO: .        
36b10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
36b20 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65  ERR_LOCK; /* eve
36b30 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 74  n though it is t
36b40 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20 20 20  he conch */.    
36b50 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
36b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36b70 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
36b80 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 70      }.  }.  .  p
36b90 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  New = (unixFile 
36ba0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
36bb0 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  64(sizeof(*pNew)
36bc0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
36bd0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
36be0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
36bf0 54 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  T;.    goto end_
36c00 63 72 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20  create_proxy;.  
36c10 7d 0a 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c  }.  memset(pNew,
36c20 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
36c30 69 6c 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  ile));.  pNew->o
36c40 70 65 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46  penFlags = openF
36c50 6c 61 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26  lags;.  memset(&
36c60 64 75 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a  dummyVfs, 0, siz
36c70 65 6f 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a  eof(dummyVfs));.
36c80 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44    dummyVfs.pAppD
36c90 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75  ata = (void*)&au
36ca0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a  tolockIoFinder;.
36cb0 20 20 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65    dummyVfs.zName
36cc0 20 3d 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55   = "dummy";.  pU
36cd0 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
36ce0 20 20 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73    pUnused->flags
36cf0 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
36d00 70 4e 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20  pNew->pUnused = 
36d10 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63  pUnused;.  .  rc
36d20 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
36d30 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c  e(&dummyVfs, fd,
36d40 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
36d50 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a  pNew, path, 0);.
36d60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36d70 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69  _OK ){.    *ppFi
36d80 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72  le = pNew;.    r
36d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36da0 0a 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f  .  }.end_create_
36db0 70 72 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62  proxy:    .  rob
36dc0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
36dd0 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
36de0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
36df0 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
36e00 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
36e10 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
36e20 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
36e30 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
36e40 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
36e50 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
36e60 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
36e70 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
36e80 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
36e90 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
36ea0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
36eb0 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
36ec0 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
36ed0 67 74 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48  gth */..#ifdef H
36ee0 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a  AVE_GETHOSTUUID.
36ef0 2f 2a 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65  /* Not always de
36f00 66 69 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61  fined in the hea
36f10 64 65 72 73 20 61 73 20 69 74 20 6f 75 67 68 74  ders as it ought
36f20 20 74 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e   to be */.extern
36f30 20 69 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64   int gethostuuid
36f40 28 75 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73  (uuid_t id, cons
36f50 74 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65  t struct timespe
36f60 63 20 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69 66  c *wait);.#endif
36f70 0a 0a 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73  ../* get the hos
36f80 74 20 49 44 20 76 69 61 20 67 65 74 68 6f 73 74  t ID via gethost
36f90 75 75 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20  uuid(), pHostID 
36fa0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52  must point to PR
36fb0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a  OXY_HOSTIDLEN .*
36fc0 2a 20 62 79 74 65 73 20 6f 66 20 77 72 69 74 61  * bytes of writa
36fd0 62 6c 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ble memory..*/.s
36fe0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
36ff0 65 74 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65  etHostID(unsigne
37000 64 20 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c  d char *pHostID,
37010 20 69 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20   int *pError){. 
37020 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f   assert(PROXY_HO
37030 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f  STIDLEN == sizeo
37040 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65  f(uuid_t));.  me
37050 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c  mset(pHostID, 0,
37060 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e   PROXY_HOSTIDLEN
37070 29 3b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47  );.#ifdef HAVE_G
37080 45 54 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20  ETHOSTUUID.  {. 
37090 20 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70     struct timesp
370a0 65 63 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c  ec timeout = {1,
370b0 20 30 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69   0}; /* 1 sec ti
370c0 6d 65 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28  meout */.    if(
370d0 20 67 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f   gethostuuid(pHo
370e0 73 74 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20  stID, &timeout) 
370f0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  ){.      int err
37100 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
37110 69 66 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20  if( pError ){.  
37120 20 20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20        *pError = 
37130 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
37140 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
37150 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
37160 7d 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  }.#else.  UNUSED
37170 5f 50 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f  _PARAMETER(pErro
37180 72 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  r);.#endif.#ifde
37190 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
371a0 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
371b0 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
371c0 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
371d0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
371e0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
371f0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
37200 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
37210 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
37220 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
37230 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
37240 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
37250 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
37260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
37270 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
37280 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
37290 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
372a0 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
372b0 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
372c0 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
372d0 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
372e0 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
372f0 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
37300 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
37310 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
37320 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
37330 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
37340 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
37350 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
37360 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
37370 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
37380 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
37390 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
373a0 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
373b0 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
373c0 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
373d0 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
373e0 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
373f0 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
37400 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
37410 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
37420 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
37430 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
37440 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
37450 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
37460 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
37470 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
37480 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
37490 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
374a0 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
374b0 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
374c0 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
374d0 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
374e0 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
374f0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
37500 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
37510 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
37520 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
37530 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
37540 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
37550 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
37560 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
37570 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
37580 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
37590 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
375a0 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
375b0 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
375c0 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
375d0 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
375e0 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
375f0 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
37600 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
37610 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
37620 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
37630 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
37640 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20    int rc = -1;. 
37650 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
37660 52 28 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20  R(myHostID);..  
37670 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  /* create a new 
37680 70 61 74 68 20 62 79 20 72 65 70 6c 61 63 65 20  path by replace 
37690 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63  the trailing '-c
376a0 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62 72 65  onch' with '-bre
376b0 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e  ak' */.  pathLen
376c0 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61 74 68   = strlcpy(tPath
376d0 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48  , cPath, MAXPATH
376e0 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68  LEN);.  if( path
376f0 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c  Len>MAXPATHLEN |
37700 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a  | pathLen<6 || .
37710 20 20 20 20 20 28 73 74 72 6c 63 70 79 28 26 74       (strlcpy(&t
37720 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c  Path[pathLen-5],
37730 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20   "break", 6) != 
37740 35 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  5) ){.    sqlite
37750 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
37760 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67  f(errmsg),errmsg
37770 2c 22 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65  ,"path error (le
37780 6e 20 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68  n %d)",(int)path
37790 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  Len);.    goto e
377a0 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20  nd_breaklock;.  
377b0 7d 0a 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20  }.  /* read the 
377c0 63 6f 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f  conch content */
377d0 0a 20 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50  .  readLen = osP
377e0 72 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  read(conchFile->
377f0 68 2c 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41  h, buf, PROXY_MA
37800 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
37810 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f   if( readLen<PRO
37820 58 59 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a  XY_PATHINDEX ){.
37830 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37840 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
37850 73 67 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64  sg),errmsg,"read
37860 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22   error (len %d)"
37870 2c 28 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a  ,(int)readLen);.
37880 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65      goto end_bre
37890 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a  aklock;.  }.  /*
378a0 20 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f   write it out to
378b0 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62   the temporary b
378c0 72 65 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66  reak file */.  f
378d0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
378e0 74 50 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f  tPath, (O_RDWR|O
378f0 5f 43 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20  _CREAT|O_EXCL), 
37900 30 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29  0);.  if( fd<0 )
37910 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
37920 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
37930 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
37940 63 72 65 61 74 65 20 66 61 69 6c 65 64 20 28 25  create failed (%
37950 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  d)", errno);.   
37960 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
37970 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ock;.  }.  if( o
37980 73 50 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c  sPwrite(fd, buf,
37990 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20   readLen, 0) != 
379a0 28 73 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e  (ssize_t)readLen
379b0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
379c0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
379d0 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c  errmsg), errmsg,
379e0 20 22 77 72 69 74 65 20 66 61 69 6c 65 64 20 28   "write failed (
379f0 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  %d)", errno);.  
37a00 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
37a10 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  lock;.  }.  if( 
37a20 72 65 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50  rename(tPath, cP
37a30 61 74 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69  ath) ){.    sqli
37a40 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
37a50 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72  eof(errmsg), err
37a60 6d 73 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69  msg, "rename fai
37a70 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f  led (%d)", errno
37a80 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
37a90 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  breaklock;.  }. 
37aa0 20 72 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e   rc = 0;.  fprin
37ab0 74 66 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b  tf(stderr, "brok
37ac0 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20  e stale lock on 
37ad0 25 73 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20  %s\n", cPath);. 
37ae0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
37af0 69 6c 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  ile, conchFile->
37b00 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
37b10 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66  conchFile->h = f
37b20 64 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  d;.  conchFile->
37b30 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
37b40 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65  WR | O_CREAT;..e
37b50 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20  nd_breaklock:.  
37b60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66  if( rc ){.    if
37b70 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ( fd>=0 ){.     
37b80 20 6f 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29   osUnlink(tPath)
37b90 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  ;.      robust_c
37ba0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20  lose(pFile, fd, 
37bb0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
37bc0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
37bd0 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  err, "failed to 
37be0 62 72 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b  break stale lock
37bf0 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63   on %s, %s\n", c
37c00 50 61 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20  Path, errmsg);. 
37c10 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
37c20 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72  }../* Take the r
37c30 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e  equested lock on
37c40 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
37c50 61 6e 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c  and break a stal
37c60 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a  e lock if the .*
37c70 2a 20 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65  * host id matche
37c80 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
37c90 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28   proxyConchLock(
37ca0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
37cb0 20 75 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44   uuid_t myHostID
37cc0 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b  , int lockType){
37cd0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
37ce0 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
37cf0 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37d00 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
37d10 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20  kingContext; .  
37d20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
37d30 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ile = pCtx->conc
37d40 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20  hFile;.  int rc 
37d50 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
37d60 6e 74 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20  nt nTries = 0;. 
37d70 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
37d80 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20   conchModTime;. 
37d90 20 0a 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63   .  memset(&conc
37da0 68 4d 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a  hModTime, 0, siz
37db0 65 6f 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  eof(conchModTime
37dc0 29 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  ));.  do {.    r
37dd0 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
37de0 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
37df0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
37e00 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
37e10 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b  );.    nTries ++
37e20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
37e30 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
37e40 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63     /* If the loc
37e50 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a  k failed (busy):
37e60 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74 72  .       * 1st tr
37e70 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74  y: get the mod t
37e80 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ime of the conch
37e90 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20  , wait 0.5s and 
37ea0 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20  try again. .    
37eb0 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61     * 2nd try: fa
37ec0 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69  il if the mod ti
37ed0 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f  me changed or ho
37ee0 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72 65  st id is differe
37ef0 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20  nt, wait .      
37f00 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30 20   *           10 
37f10 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61 69  sec and try agai
37f20 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20 74  n.       * 3rd t
37f30 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  ry: break the lo
37f40 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f  ck unless the mo
37f50 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67  d time has chang
37f60 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20  ed..       */.  
37f70 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
37f80 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  buf;.      if( o
37f90 73 46 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65  sFstat(conchFile
37fa0 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
37fb0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
37fc0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
37fd0 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  o);.        retu
37fe0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
37ff0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
38000 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e      .      if( n
38010 54 72 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20  Tries==1 ){.    
38020 20 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65      conchModTime
38030 20 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73   = buf.st_mtimes
38040 70 65 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c  pec;.        usl
38050 65 65 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20  eep(500000); /* 
38060 77 61 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64  wait 0.5 sec and
38070 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
38080 61 69 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f  ain*/.        co
38090 6e 74 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20  ntinue;  .      
380a0 7d 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  }..      assert(
380b0 20 6e 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20   nTries>1 );.   
380c0 20 20 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54     if( conchModT
380d0 69 6d 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75  ime.tv_sec != bu
380e0 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74  f.st_mtimespec.t
380f0 76 5f 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20  v_sec || .      
38100 20 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e     conchModTime.
38110 74 76 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73  tv_nsec != buf.s
38120 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e  t_mtimespec.tv_n
38130 73 65 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  sec ){.        r
38140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
38150 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
38160 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72 69   .      if( nTri
38170 65 73 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20  es==2 ){  .     
38180 20 20 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f     char tBuf[PRO
38190 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
381a0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  .        int len
381b0 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68   = osPread(conch
381c0 46 69 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50  File->h, tBuf, P
381d0 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
381e0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
381f0 28 20 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20  ( len<0 ){.     
38200 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
38210 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
38220 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
38230 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
38240 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  _LOCK;.        }
38250 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e  .        if( len
38260 3e 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58  >PROXY_PATHINDEX
38270 20 26 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68   && tBuf[0]==(ch
38280 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45  ar)PROXY_CONCHVE
38290 52 53 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20  RSION){.        
382a0 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
382b0 20 74 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65   the lock if the
382c0 20 68 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74   host id doesn't
382d0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
382e0 20 20 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d      if( 0!=memcm
382f0 70 28 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45  p(&tBuf[PROXY_HE
38300 41 44 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74  ADERLEN], myHost
38310 49 44 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44  ID, PROXY_HOSTID
38320 4c 45 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  LEN) ){.        
38330 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
38340 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
38350 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
38360 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
38370 64 6f 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20  don't break the 
38380 6c 6f 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65  lock on short re
38390 61 64 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20  ad or a version 
383a0 6d 69 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20  mismatch */.    
383b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
383c0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
383d0 20 20 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65    }.        usle
383e0 65 70 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a  ep(10000000); /*
383f0 20 77 61 69 74 20 31 30 20 73 65 63 20 61 6e 64   wait 10 sec and
38400 20 74 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67   try the lock ag
38410 61 69 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  ain */.        c
38420 6f 6e 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20  ontinue; .      
38430 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 61  }.      .      a
38440 73 73 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33  ssert( nTries==3
38450 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   );.      if( 0=
38460 3d 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68  =proxyBreakConch
38470 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f  Lock(pFile, myHo
38480 73 74 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20  stID) ){.       
38490 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
384a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63  .        if( loc
384b0 6b 54 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  kType==EXCLUSIVE
384c0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  _LOCK ){.       
384d0 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c     rc = conchFil
384e0 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
384f0 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
38500 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
38510 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
38520 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
38530 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !rc ){.         
38540 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
38550 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
38560 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
38570 6f 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79  onchFile, lockTy
38580 70 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pe);.        }. 
38590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
385a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
385b0 54 45 5f 42 5