/ Hex Artifact Content
Login

Artifact ce491421b3a54b63094a155eeac668a3bc8e5b86a5a58551d906e5b5affb443f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e 0a  de <sys/file.h>.
0de0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  # include <sys/p
0df0: 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  aram.h>.#endif /
0e00: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
0e10: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
0e20: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0e30: 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f  APPLE__) && ((__
0e40: 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e  MAC_OS_X_VERSION
0e50: 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e 20  _MIN_REQUIRED > 
0e60: 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20  1050) || \.     
0e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e80: 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f        (__IPHONE_
0e90: 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52  OS_VERSION_MIN_R
0ea0: 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29 29  EQUIRED > 2000))
0eb0: 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65 64  .#  if (!defined
0ec0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0ed0: 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54 5f  DED) || (TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29 29  OS_EMBEDDED==0))
0ef0: 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21 64   \.       && (!d
0f00: 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49 50  efined(TARGET_IP
0f10: 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29 20  HONE_SIMULATOR) 
0f20: 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f 4e  || (TARGET_IPHON
0f30: 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29 29  E_SIMULATOR==0))
0f40: 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41 56  .#    define HAV
0f50: 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31 0a  E_GETHOSTUUID 1.
0f60: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61 72  #  else.#    war
0f70: 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75 69  ning "gethostuui
0f80: 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2e  d() is disabled.
0f90: 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  ".#  endif.#endi
0fa0: 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  f...#if OS_VXWOR
0fb0: 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79  KS.# include <sy
0fc0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63  s/ioctl.h>.# inc
0fd0: 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65 2e  lude <semaphore.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c 69  h>.# include <li
0ff0: 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20 2f  mits.h>.#endif /
1000: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
1010: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
1020: 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
1030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1040: 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64 65  _STYLE.# include
1050: 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
1060: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48 41  endif..#ifdef HA
1070: 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75  VE_UTIME.# inclu
1080: 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e  de <utime.h>.#en
1090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
10a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
10b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
10c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
10d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
10e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
10f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1100: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1110: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1120: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1130: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1140: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1150: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1160: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1170: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1180: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1190: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
11a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
11b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
11c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
11d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
11e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
11f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1200: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1210: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1220: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1230: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1240: 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70 65  /*.** Default pe
1250: 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20 63  rmissions when c
1260: 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72 6f  reating auto pro
1270: 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65  xy dir.*/.#ifnde
1280: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1290: 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
12a0: 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20 53  SIONS.# define S
12b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
12c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
12d0: 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a  NS 0755.#endif..
12e0: 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75  /*.** Maximum su
12f0: 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65 6e  pported path-len
1300: 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  gth..*/.#define 
1310: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32  MAX_PATHNAME 512
1320: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
1330: 73 75 70 70 6f 72 74 65 64 20 73 79 6d 62 6f 6c  supported symbol
1340: 69 63 20 6c 69 6e 6b 73 0a 2a 2f 0a 23 64 65 66  ic links.*/.#def
1350: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ine SQLITE_MAX_S
1360: 59 4d 4c 49 4e 4b 53 20 31 30 30 0a 0a 2f 2a 20  YMLINKS 100../* 
1370: 41 6c 77 61 79 73 20 63 61 73 74 20 74 68 65 20  Always cast the 
1380: 67 65 74 70 69 64 28 29 20 72 65 74 75 72 6e 20  getpid() return 
1390: 74 79 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69  type for compati
13a0: 62 69 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b  bility with.** k
13b0: 65 72 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e  ernel modules in
13c0: 20 56 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65   VxWorks. */.#de
13d0: 66 69 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29  fine osGetpid(X)
13e0: 20 28 70 69 64 5f 74 29 67 65 74 70 69 64 28 29   (pid_t)getpid()
13f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74  ../*.** Only set
1400: 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69   the lastErrno i
1410: 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  f the error code
1420: 20 69 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72   is a real error
1430: 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e   and not .** a n
1440: 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72  ormal expected r
1450: 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51  eturn code of SQ
1460: 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c  LITE_BUSY or SQL
1470: 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e  ITE_OK.*/.#defin
1480: 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  e IS_LOCK_ERROR(
1490: 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54  x)  ((x != SQLIT
14a0: 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53  E_OK) && (x != S
14b0: 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a  QLITE_BUSY))../*
14c0: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
14d0: 63 65 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  ces */.typedef s
14e0: 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e  truct unixShm un
14f0: 69 78 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  ixShm;          
1500: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
1510: 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  on shared memory
1520: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1530: 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75  ct unixShmNode u
1540: 6e 69 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20  nixShmNode;     
1550: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1560: 72 79 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74  ry instance */.t
1570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1580: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78  ixInodeInfo unix
1590: 49 6e 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20  InodeInfo;   /* 
15a0: 41 6e 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70  An i-node */.typ
15b0: 65 64 65 66 20 73 74 72 75 63 74 20 55 6e 69 78  edef struct Unix
15c0: 55 6e 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75  UnusedFd UnixUnu
15d0: 73 65 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e  sedFd;     /* An
15e0: 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
15f0: 63 72 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a  criptor */../*.*
1600: 2a 20 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74  * Sometimes, aft
1610: 65 72 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65  er a file handle
1620: 20 69 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51   is closed by SQ
1630: 4c 69 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64  Lite, the file d
1640: 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e  escriptor.** can
1650: 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d  not be closed im
1660: 6d 65 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68  mediately. In th
1670: 65 73 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61  ese cases, insta
1680: 6e 63 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c  nces of the foll
1690: 6f 77 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75  owing.** structu
16a0: 72 65 20 61 72 65 20 75 73 65 64 20 74 6f 20 73  re are used to s
16b0: 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 64 65  tore the file de
16c0: 73 63 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77  scriptor while w
16d0: 61 69 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a  aiting for an.**
16e0: 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20   opportunity to 
16f0: 65 69 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20  either close or 
1700: 72 65 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72  reuse it..*/.str
1710: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
1720: 20 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20   {.  int fd;    
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1740: 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1750: 72 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  r to close */.  
1760: 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20  int flags;      
1770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
1780: 67 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73  gs this file des
1790: 63 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e  criptor was open
17a0: 65 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69  ed with */.  Uni
17b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74  xUnusedFd *pNext
17c0: 3b 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75  ;      /* Next u
17d0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
17e0: 69 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69  iptor on same fi
17f0: 6c 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  le */.};../*.** 
1800: 54 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  The unixFile str
1810: 75 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61  ucture is subcla
1820: 73 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69  ss of sqlite3_fi
1830: 6c 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74  le specific to t
1840: 68 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69  he unix.** VFS i
1850: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a  mplementations..
1860: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1870: 74 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46  t unixFile unixF
1880: 69 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78  ile;.struct unix
1890: 46 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  File {.  sqlite3
18a0: 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
18b0: 74 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20  t *pMethod;  /* 
18c0: 41 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74  Always the first
18d0: 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
18e0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 2f 2a 20 54 68 65 20 56 46 53 20 74 68 61 74 20  /* The VFS that 
1910: 63 72 65 61 74 65 64 20 74 68 69 73 20 75 6e 69  created this uni
1920: 78 46 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49  xFile */.  unixI
1930: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1940: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1950: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1960: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
1970: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
19c0: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
19d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19e0: 20 74 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65   type of lock he
19f0: 6c 64 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f  ld on this fd */
1a00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  .  unsigned shor
1a10: 74 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b  t int ctrlFlags;
1a20: 20 20 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69         /* Behavi
1a30: 6f 72 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58  oral bits.  UNIX
1a40: 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a  FILE_* flags */.
1a50: 20 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b    int lastErrno;
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69        /* The uni
1a80: 78 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73  x errno from las
1a90: 74 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20  t I/O error */. 
1aa0: 20 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f   void *lockingCo
1ab0: 6e 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  ntext;          
1ac0: 20 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20       /* Locking 
1ad0: 73 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73  style specific s
1ae0: 74 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  tate */.  UnixUn
1af0: 75 73 65 64 46 64 20 2a 70 50 72 65 61 6c 6c 6f  usedFd *pPreallo
1b00: 63 61 74 65 64 55 6e 75 73 65 64 3b 20 20 2f 2a  catedUnused;  /*
1b10: 20 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55   Pre-allocated U
1b20: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20  nixUnusedFd */. 
1b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b40: 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
1b50: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1b60: 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  the file */.  un
1b70: 69 78 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20  ixShm *pShm;    
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
1ba0: 72 79 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72  ry segment infor
1bb0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  mation */.  int 
1bc0: 73 7a 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20  szChunk;        
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79  /* Configured by
1bf0: 20 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a   FCNTL_CHUNK_SIZ
1c00: 45 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  E */.#if SQLITE_
1c10: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1c20: 20 20 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b    int nFetchOut;
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c50: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  of outstanding x
1c60: 46 65 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20  Fetch refs */.  
1c70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1c80: 61 70 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  apSize;         
1c90: 20 20 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69      /* Usable si
1ca0: 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74  ze of mapping at
1cb0: 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20   pMapRegion */. 
1cc0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
1cd0: 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20  mapSizeActual;  
1ce0: 20 20 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73       /* Actual s
1cf0: 69 7a 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61  ize of mapping a
1d00: 74 20 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a  t pMapRegion */.
1d10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1d20: 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20  mmapSizeMax;    
1d30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1d40: 72 65 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  red FCNTL_MMAP_S
1d50: 49 5a 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76  IZE value */.  v
1d60: 6f 69 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b  oid *pMapRegion;
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d80: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70     /* Memory map
1d90: 70 65 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65  ped region */.#e
1da0: 6e 64 69 66 0a 20 20 69 6e 74 20 73 65 63 74 6f  ndif.  int secto
1db0: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1dd0: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1df0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1e10: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1e20: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1e30: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  */.#if SQLITE_EN
1e40: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1e50: 4c 45 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  LE.  int openFla
1e60: 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
1e70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e80: 66 6c 61 67 73 20 73 70 65 63 69 66 69 65 64 20  flags specified 
1e90: 61 74 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e  at open() */.#en
1ea0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
1eb0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1ec0: 59 4c 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  YLE || defined(_
1ed0: 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69  _APPLE__).  unsi
1ee0: 67 6e 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20  gned fsFlags;   
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 2f 2a 20 63 61 63 68 65 64 20 64 65 74 61 69 6c  /* cached detail
1f10: 73 20 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20  s from statfs() 
1f20: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  */.#endif.#if OS
1f30: 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
1f40: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
1f50: 2a 70 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f  *pId;          /
1f60: 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44  * Unique file ID
1f70: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1f80: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f90: 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f   /* The next gro
1fa0: 75 70 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20  up of variables 
1fb0: 61 72 65 20 75 73 65 64 20 74 6f 20 74 72 61 63  are used to trac
1fc0: 6b 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  k whether or not
1fd0: 20 74 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61   the.  ** transa
1fe0: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e  ction counter in
1ff0: 20 62 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20   bytes 24-27 of 
2000: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 61  database files a
2010: 72 65 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20  re updated.  ** 
2020: 77 68 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72  whenever any par
2030: 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
2040: 65 20 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61  e changes.  An a
2050: 73 73 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77  ssertion fault w
2060: 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69  ill.  ** occur i
2070: 66 20 61 20 66 69 6c 65 20 69 73 20 75 70 64 61  f a file is upda
2080: 74 65 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f  ted without also
2090: 20 75 70 64 61 74 69 6e 67 20 74 68 65 20 74 72   updating the tr
20a0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63  ansaction.  ** c
20b0: 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65  ounter.  This te
20c0: 73 74 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76  st is made to av
20d0: 6f 69 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73  oid new problems
20e0: 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a   similar to the.
20f0: 20 20 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62    ** one describ
2100: 65 64 20 62 79 20 74 69 63 6b 65 74 20 23 33 35  ed by ticket #35
2110: 38 34 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69  84. .  */.  unsi
2120: 67 6e 65 64 20 63 68 61 72 20 74 72 61 6e 73 43  gned char transC
2130: 6e 74 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72  ntrChng;   /* Tr
2140: 75 65 20 69 66 20 74 68 65 20 74 72 61 6e 73 61  ue if the transa
2150: 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68  ction counter ch
2160: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67  anged */.  unsig
2170: 6e 65 64 20 63 68 61 72 20 64 62 55 70 64 61 74  ned char dbUpdat
2180: 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75  e;        /* Tru
2190: 65 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  e if any part of
21a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
21b0: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69  hanged */.  unsi
21c0: 67 6e 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d  gned char inNorm
21d0: 61 6c 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72  alWrite;   /* Tr
21e0: 75 65 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61  ue if in a norma
21f0: 6c 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  l write operatio
2200: 6e 20 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69  n */..#endif..#i
2210: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2220: 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f  .  /* In test mo
2230: 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  de, increase the
2240: 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74   size of this st
2250: 72 75 63 74 75 72 65 20 61 20 62 69 74 20 73 6f  ructure a bit so
2260: 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69   that .  ** it i
2270: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
2280: 65 20 73 74 72 75 63 74 20 43 72 61 73 68 46 69  e struct CrashFi
2290: 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65  le defined in te
22a0: 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68  st6.c..  */.  ch
22b0: 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b  ar aPadding[32];
22c0: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54  .#endif.};../* T
22d0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c  his variable hol
22e0: 64 73 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  ds the process i
22f0: 64 20 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65  d (pid) from whe
2300: 6e 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73  n the xRandomnes
2310: 73 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61  s().** method wa
2320: 73 20 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f  s called.  If xO
2330: 70 65 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  pen() is called 
2340: 66 72 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74  from a different
2350: 20 70 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20   process id,.** 
2360: 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
2370: 61 20 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63  a fork() has occ
2380: 75 72 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20  urred, the PRNG 
2390: 77 69 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a  will be reset..*
23a0: 2f 0a 73 74 61 74 69 63 20 70 69 64 5f 74 20 72  /.static pid_t r
23b0: 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30  andomnessPid = 0
23c0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64  ;../*.** Allowed
23d0: 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20   values for the 
23e0: 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61  unixFile.ctrlFla
23f0: 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23  gs bitmask:.*/.#
2400: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2410: 45 58 43 4c 20 20 20 20 20 20 20 20 30 78 30 31  EXCL        0x01
2420: 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
2430: 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f  ons from one pro
2440: 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65  cess only */.#de
2450: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44  fine UNIXFILE_RD
2460: 4f 4e 4c 59 20 20 20 20 20 20 30 78 30 32 20 20  ONLY      0x02  
2470: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2480: 20 69 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f   is read only */
2490: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
24a0: 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78  E_PERSIST_WAL 0x
24b0: 30 34 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73  04     /* Persis
24c0: 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f  tent WAL mode */
24d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
24e0: 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
24f0: 23 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  # define UNIXFIL
2500: 45 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30  E_DIRSYNC    0x0
2510: 38 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f  8     /* Directo
2520: 72 79 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a  ry sync needed *
2530: 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  /.#else.# define
2540: 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
2550: 43 20 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66  C    0x00.#endif
2560: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2570: 45 5f 50 53 4f 57 20 20 20 20 20 20 20 20 30 78  E_PSOW        0x
2580: 31 30 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  10     /* SQLITE
2590: 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
25a0: 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64  _OVERWRITE */.#d
25b0: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44  efine UNIXFILE_D
25c0: 45 4c 45 54 45 20 20 20 20 20 20 30 78 32 30 20  ELETE      0x20 
25d0: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
25e0: 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e   close */.#defin
25f0: 65 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20  e UNIXFILE_URI  
2600: 20 20 20 20 20 20 20 30 78 34 30 20 20 20 20 20         0x40     
2610: 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68  /* Filename migh
2620: 74 20 68 61 76 65 20 71 75 65 72 79 20 70 61 72  t have query par
2630: 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  ameters */.#defi
2640: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  ne UNIXFILE_NOLO
2650: 43 4b 20 20 20 20 20 20 30 78 38 30 20 20 20 20  CK      0x80    
2660: 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c   /* Do no file l
2670: 6f 63 6b 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  ocking */../*.**
2680: 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68   Include code th
2690: 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20  at is common to 
26a0: 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73  all os_*.c files
26b0: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73  .*/.#include "os
26c0: 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a  _common.h"../*.*
26d0: 2a 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73  * Define various
26e0: 20 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65   macros that are
26f0: 20 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f   missing from so
2700: 6d 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23  me systems..*/.#
2710: 69 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49  ifndef O_LARGEFI
2720: 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41  LE.# define O_LA
2730: 52 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66  RGEFILE 0.#endif
2740: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2750: 49 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64  ISABLE_LFS.# und
2760: 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23  ef O_LARGEFILE.#
2770: 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46   define O_LARGEF
2780: 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  ILE 0.#endif.#if
2790: 6e 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a  ndef O_NOFOLLOW.
27a0: 23 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c  # define O_NOFOL
27b0: 4c 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66  LOW 0.#endif.#if
27c0: 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20  ndef O_BINARY.# 
27d0: 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20  define O_BINARY 
27e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
27f0: 54 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63  The threadid mac
2800: 72 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74  ro resolves to t
2810: 68 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20  he thread-id or 
2820: 74 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a  to 0.  Used for.
2830: 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64  ** testing and d
2840: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
2850: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
2860: 45 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20  EADSAFE.#define 
2870: 74 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64  threadid pthread
2880: 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64  _self().#else.#d
2890: 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30  efine threadid 0
28a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48  .#endif../*.** H
28b0: 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66 61 75  AVE_MREMAP defau
28c0: 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c  lts to true on L
28d0: 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65 20 65  inux and false e
28e0: 76 65 72 79 77 68 65 72 65 20 65 6c 73 65 2e 0a  verywhere else..
28f0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2900: 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69  HAVE_MREMAP).# i
2910: 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75  f defined(__linu
2920: 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28  x__) && defined(
2930: 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23 20 20  _GNU_SOURCE).#  
2940: 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d  define HAVE_MREM
2950: 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20 20 64  AP 1.# else.#  d
2960: 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41  efine HAVE_MREMA
2970: 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  P 0.# endif.#end
2980: 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63  if../*.** Explic
2990: 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20 36 34  itly call the 64
29a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f 66 20  -bit version of 
29b0: 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f  lseek() on Andro
29c0: 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c  id. Otherwise, l
29d0: 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65  seek().** is the
29e0: 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c   32-bit version,
29f0: 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f   even if _FILE_O
2a00: 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73  FFSET_BITS=64 is
2a10: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
2a20: 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a  def __ANDROID__.
2a30: 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c  # define lseek l
2a40: 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 23  seek64.#endif..#
2a50: 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
2a60: 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70 65 63  /*.** Linux-spec
2a70: 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67 69 63  ific IOCTL magic
2a80: 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20 66 6f   numbers used fo
2a90: 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 46 32  r controlling F2
2aa0: 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 32  FS.*/.#define F2
2ab0: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 20 20  FS_IOCTL_MAGIC  
2ac0: 20 20 20 20 20 20 30 78 66 35 0a 23 64 65 66 69        0xf5.#defi
2ad0: 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52  ne F2FS_IOC_STAR
2ae0: 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 20  T_ATOMIC_WRITE  
2af0: 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43 54     _IO(F2FS_IOCT
2b00: 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64 65 66  L_MAGIC, 1).#def
2b10: 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43 4f 4d  ine F2FS_IOC_COM
2b20: 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  MIT_ATOMIC_WRITE
2b30: 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f 43      _IO(F2FS_IOC
2b40: 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23 64 65  TL_MAGIC, 2).#de
2b50: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
2b60: 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52 49  ART_VOLATILE_WRI
2b70: 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f  TE   _IO(F2FS_IO
2b80: 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a 23 64  CTL_MAGIC, 3).#d
2b90: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 41  efine F2FS_IOC_A
2ba0: 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
2bb0: 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  ITE   _IO(F2FS_I
2bc0: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29 0a 23  OCTL_MAGIC, 5).#
2bd0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
2be0: 47 45 54 5f 46 45 41 54 55 52 45 53 20 20 20 20  GET_FEATURES    
2bf0: 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32 46 53         _IOR(F2FS
2c00: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 31 32  _IOCTL_MAGIC, 12
2c10: 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65 20 46  , u32).#define F
2c20: 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d  2FS_FEATURE_ATOM
2c30: 49 43 5f 57 52 49 54 45 20 30 78 30 30 30 34 0a  IC_WRITE 0x0004.
2c40: 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75  #endif /* __linu
2c50: 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 44  x__ */.../*.** D
2c60: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
2c70: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
2c80: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
2c90: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
2ca0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
2cb0: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
2cc0: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
2cd0: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
2ce0: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
2cf0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
2d00: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
2d10: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
2d20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
2d30: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
2d40: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
2d50: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
2d60: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
2d70: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
2d80: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
2d90: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
2da0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
2db0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
2dc0: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
2dd0: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
2de0: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
2df0: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
2e00: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
2e10: 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  e);.}../* Forwar
2e20: 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
2e30: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
2e40: 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
2e50: 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  ar*, int*);.stat
2e60: 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
2e70: 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a 0a 2f  gesize(void);../
2e80: 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74 65 6d  *.** Many system
2e90: 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63 65 73   calls are acces
2ea0: 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f 69 6e  sed through poin
2eb0: 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f 6e 73  ter-to-functions
2ec0: 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68 65 79   so that.** they
2ed0: 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69 64 64   may be overridd
2ee0: 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20 74 6f  en at runtime to
2ef0: 20 66 61 63 69 6c 69 74 61 74 65 20 66 61 75 6c   facilitate faul
2f00: 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75 72 69  t injection duri
2f10: 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  ng.** testing an
2f20: 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20 20 54  d sandboxing.  T
2f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 72  he following arr
2f40: 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e 61 6d  ay holds the nam
2f50: 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72 73 0a  es and pointers.
2f60: 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72 72 69  ** to all overri
2f70: 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61  deable system ca
2f80: 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  lls..*/.static s
2f90: 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73 63 61  truct unix_sysca
2fa0: 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ll {.  const cha
2fb0: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
2fc0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2fd0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
2fe0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
2ff0: 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72 65 6e  call_ptr pCurren
3000: 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 76 61  t; /* Current va
3010: 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  lue of the syste
3020: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3030: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3040: 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44 65 66  pDefault; /* Def
3050: 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a 7d 20  ault value */.} 
3060: 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b 0a 20  aSyscall[] = {. 
3070: 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20 20 20   { "open",      
3080: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3090: 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f 70 65  all_ptr)posixOpe
30a0: 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e  n,  0  },.#defin
30b0: 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20 28 28  e osOpen      ((
30c0: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
30d0: 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53 79 73  r*,int,int))aSys
30e0: 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65 6e 74  call[0].pCurrent
30f0: 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22 2c 20  )..  { "close", 
3100: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
3110: 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c 6f 73  syscall_ptr)clos
3120: 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64  e,      0  },.#d
3130: 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20 20 20  efine osClose   
3140: 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 29 29    ((int(*)(int))
3150: 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43 75 72  aSyscall[1].pCur
3160: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63 63 65  rent)..  { "acce
3170: 73 73 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  ss",       (sqli
3180: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3190: 61 63 63 65 73 73 2c 20 20 20 20 20 30 20 20 7d  access,     0  }
31a0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63 63 65  ,.#define osAcce
31b0: 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63  ss    ((int(*)(c
31c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 29 29  onst char*,int))
31d0: 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43 75 72  aSyscall[2].pCur
31e0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 63  rent)..  { "getc
31f0: 77 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wd",       (sqli
3200: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3210: 67 65 74 63 77 64 2c 20 20 20 20 20 30 20 20 7d  getcwd,     0  }
3220: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 63  ,.#define osGetc
3230: 77 64 20 20 20 20 28 28 63 68 61 72 2a 28 2a 29  wd    ((char*(*)
3240: 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  (char*,size_t))a
3250: 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75 72 72  Syscall[3].pCurr
3260: 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61 74 22  ent)..  { "stat"
3270: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3280: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 73  e3_syscall_ptr)s
3290: 74 61 74 2c 20 20 20 20 20 20 20 30 20 20 7d 2c  tat,       0  },
32a0: 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61 74 20  .#define osStat 
32b0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
32c0: 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75 63 74  nst char*,struct
32d0: 20 73 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c   stat*))aSyscall
32e0: 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 2f  [4].pCurrent)../
32f0: 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50 20 63  *.** The DJGPP c
3300: 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f 6e 6d  ompiler environm
3310: 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74 6c 79  ent looks mostly
3320: 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75 74 20   like Unix, but 
3330: 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68 65 20  it.** lacks the 
3340: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
3350: 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66 69 6e  all.  So redefin
3360: 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62 65 20  e fcntl() to be 
3370: 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74 68 61  something.** tha
3380: 74 20 61 6c 77 61 79 73 20 73 75 63 63 65 65 64  t always succeed
3390: 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  s.  This means t
33a0: 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f 65 73  hat locking does
33b0: 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64 65 72   not occur under
33c0: 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75 74 20  .** DJGPP.  But 
33d0: 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68 61 74  it is DOS - what
33e0: 20 64 69 64 20 79 6f 75 20 65 78 70 65 63 74 3f   did you expect?
33f0: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44 4a 47  .*/.#ifdef __DJG
3400: 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61 74 22  PP__.  { "fstat"
3410: 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20 20 20  ,        0,     
3420: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 7d              0  }
3430: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73 74 61  ,.#define osFsta
3440: 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a 23 65  t(a,b,c)    0.#e
3450: 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22 66 73  lse     .  { "fs
3460: 74 61 74 22 2c 20 20 20 20 20 20 20 20 28 73 71  tat",        (sq
3470: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3480: 72 29 66 73 74 61 74 2c 20 20 20 20 20 20 30 20  r)fstat,      0 
3490: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
34a0: 74 61 74 20 20 20 20 20 28 28 69 6e 74 28 2a 29  tat     ((int(*)
34b0: 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74 61 74  (int,struct stat
34c0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d 2e 70  *))aSyscall[5].p
34d0: 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69 66 0a  Current).#endif.
34e0: 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74 65 22  .  { "ftruncate"
34f0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3500: 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75 6e 63  scall_ptr)ftrunc
3510: 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  ate,  0  },.#def
3520: 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74 65 20  ine osFtruncate 
3530: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66  ((int(*)(int,off
3540: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36 5d 2e  _t))aSyscall[6].
3550: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3560: 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20 20 28  fcntl",        (
3570: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3580: 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20 20 20  ptr)fcntl,      
3590: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
35a0: 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e 74 28  Fcntl     ((int(
35b0: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
35c0: 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43 75 72  aSyscall[7].pCur
35d0: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64  rent)..  { "read
35e0: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
35f0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3600: 72 65 61 64 2c 20 20 20 20 20 20 20 30 20 20 7d  read,       0  }
3610: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  ,.#define osRead
3620: 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28        ((ssize_t(
3630: 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a  *)(int,void*,siz
3640: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 38 5d  e_t))aSyscall[8]
3650: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3660: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
3670: 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  D) || SQLITE_ENA
3680: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
3690: 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20 20  E.  { "pread",  
36a0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
36b0: 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64  yscall_ptr)pread
36c0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c  ,      0  },.#el
36d0: 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22 2c 20  se.  { "pread", 
36e0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
36f0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
3700: 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65          0  },.#e
3710: 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50  ndif.#define osP
3720: 72 65 61 64 20 20 20 20 20 28 28 73 73 69 7a 65  read     ((ssize
3730: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
3740: 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53  size_t,off_t))aS
3750: 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72 72 65  yscall[9].pCurre
3760: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3770: 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
3780: 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20 20  { "pread64",    
3790: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
37a0: 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34 2c 20  ll_ptr)pread64, 
37b0: 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20     0  },.#else. 
37c0: 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20 20   { "pread64",   
37d0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
37e0: 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20  all_ptr)0,      
37f0: 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66      0  },.#endif
3800: 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65 61 64  .#define osPread
3810: 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28  64 ((ssize_t(*)(
3820: 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  int,void*,size_t
3830: 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73 63 61  ,off64_t))aSysca
3840: 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e 74 29  ll[10].pCurrent)
3850: 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c 20 20  ..  { "write",  
3860: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3870: 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69 74 65  yscall_ptr)write
3880: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3890: 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20 20 20  fine osWrite    
38a0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
38b0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69  t,const void*,si
38c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ze_t))aSyscall[1
38d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  1].pCurrent)..#i
38e0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
38f0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
3900: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
3910: 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74 65 22  YLE.  { "pwrite"
3920: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3930: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3940: 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  ite,     0  },.#
3950: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3960: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
3970: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3980: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3990: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
39a0: 73 50 77 72 69 74 65 20 20 20 20 28 28 73 73 69  sPwrite    ((ssi
39b0: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
39c0: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
39d0: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
39f0: 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72 65 6e  call[12].pCurren
3a00: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
3a10: 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 7b  USE_PREAD64).  {
3a20: 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20 20   "pwrite64",    
3a30: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3a40: 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34 2c 20  l_ptr)pwrite64, 
3a50: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
3a60: 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20 20  { "pwrite64",   
3a70: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3a80: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3a90: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
3ab0: 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29  64  ((ssize_t(*)
3ac0: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3ad0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
3ae0: 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )\.             
3af0: 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b         aSyscall[
3b00: 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  13].pCurrent).. 
3b10: 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20 20   { "fchmod",    
3b20: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3b30: 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c 20  all_ptr)fchmod, 
3b40: 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23           0  },.#
3b50: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
3b60: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
3b70: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
3b80: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
3b90: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3ba0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3bb0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3bc0: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3bd0: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3be0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3bf0: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3c00: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3c10: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3c20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c30: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3c40: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3c50: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3c60: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3c70: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3c80: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3c90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ca0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3cb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3cc0: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3cd0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3ce0: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3cf0: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3d00: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3d10: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3d20: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3d30: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3d40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3d50: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3d60: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3d70: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3d80: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3d90: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3da0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3db0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3dc0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3dd0: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3de0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3df0: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3e00: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3e10: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3e20: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3e30: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3e40: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3e50: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3e60: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3e70: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3e80: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3e90: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ea0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3eb0: 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66  urrent)..#if def
3ec0: 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57 4e  ined(HAVE_FCHOWN
3ed0: 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22 2c 20  ).  { "fchown", 
3ee0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3ef0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6f 77  yscall_ptr)fchow
3f00: 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  n,          0 },
3f10: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63 68 6f  .#else.  { "fcho
3f20: 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  wn",       (sqli
3f30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3f40: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3f50: 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65   0 },.#endif.#de
3f60: 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20 20 20  fine osFchown   
3f70: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69   ((int(*)(int,ui
3f80: 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79 73 63  d_t,gid_t))aSysc
3f90: 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74  all[20].pCurrent
3fa0: 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  )..  { "geteuid"
3fb0: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
3fc0: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
3fd0: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
3fe0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74 65  ,.#define osGete
3ff0: 75 69 64 20 20 20 28 28 75 69 64 5f 74 28 2a 29  uid   ((uid_t(*)
4000: 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c 5b  (void))aSyscall[
4010: 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  21].pCurrent)..#
4020: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
4030: 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
4040: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4050: 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70  SIZE>0.  { "mmap
4060: 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69  ",         (sqli
4070: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
4080: 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  mmap,           
4090: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
40a0: 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20 20 20  "mmap",         
40b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
40c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
40d0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
40e0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d 61 70  f.#define osMmap
40f0: 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64   ((void*(*)(void
4100: 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74  *,size_t,int,int
4110: 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ,int,off_t))aSys
4120: 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e  call[22].pCurren
4130: 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  t)..#if !defined
4140: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c  (SQLITE_OMIT_WAL
4150: 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ) || SQLITE_MAX_
4160: 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20  MMAP_SIZE>0.  { 
4170: 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20  "munmap",       
4180: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4190: 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20  _ptr)munmap,    
41a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
41b0: 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20  .  { "munmap",  
41c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
41d0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
41e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
41f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4200: 73 4d 75 6e 6d 61 70 20 28 28 69 6e 74 28 2a 29  sMunmap ((int(*)
4210: 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61  (void*,size_t))a
4220: 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75 72  Syscall[23].pCur
4230: 72 65 6e 74 29 0a 0a 23 69 66 20 48 41 56 45 5f  rent)..#if HAVE_
4240: 4d 52 45 4d 41 50 20 26 26 20 28 21 64 65 66 69  MREMAP && (!defi
4250: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
4260: 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
4270: 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 29 0a  AX_MMAP_SIZE>0).
4280: 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20    { "mremap",   
4290: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
42a0: 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c  call_ptr)mremap,
42b0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
42c0: 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70  else.  { "mremap
42d0: 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ",       (sqlite
42e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
4300: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4310: 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f  ne osMremap ((vo
4320: 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a  id*(*)(void*,siz
4330: 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e  e_t,size_t,int,.
4340: 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 34 5d  ..))aSyscall[24]
4350: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4360: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4370: 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c  OMIT_WAL) || SQL
4380: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
4390: 45 3e 30 0a 20 20 7b 20 22 67 65 74 70 61 67 65  E>0.  { "getpage
43a0: 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65 33  size",  (sqlite3
43b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 69  _syscall_ptr)uni
43c0: 78 47 65 74 70 61 67 65 73 69 7a 65 2c 20 30 20  xGetpagesize, 0 
43d0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67 65  },.#else.  { "ge
43e0: 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71  tpagesize",  (sq
43f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4400: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
4410: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
4420: 64 65 66 69 6e 65 20 6f 73 47 65 74 70 61 67 65  define osGetpage
4430: 73 69 7a 65 20 28 28 69 6e 74 28 2a 29 28 76 6f  size ((int(*)(vo
4440: 69 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d  id))aSyscall[25]
4450: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
4460: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41  defined(HAVE_REA
4470: 44 4c 49 4e 4b 29 0a 20 20 7b 20 22 72 65 61 64  DLINK).  { "read
4480: 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69  link",     (sqli
4490: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
44a0: 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20  readlink,       
44b0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
44c0: 22 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20  "readlink",     
44d0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
44e0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
44f0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
4500: 66 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61 64  f.#define osRead
4510: 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28 2a  link ((ssize_t(*
4520: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 68  )(const char*,ch
4530: 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  ar*,size_t))aSys
4540: 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65 6e  call[26].pCurren
4550: 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  t)..#if defined(
4560: 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 7b 20  HAVE_LSTAT).  { 
4570: 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "lstat",        
4580: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
4590: 6c 5f 70 74 72 29 6c 73 74 61 74 2c 20 20 20 20  l_ptr)lstat,    
45a0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
45b0: 0a 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20 20  .  { "lstat",   
45c0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
45d0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
45e0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
45f0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
4600: 73 4c 73 74 61 74 20 20 20 20 20 20 28 28 69 6e  sLstat      ((in
4610: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
4620: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
4630: 53 79 73 63 61 6c 6c 5b 32 37 5d 2e 70 43 75 72  Syscall[27].pCur
4640: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
4650: 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26  ed(__linux__) &&
4660: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4670: 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f  ENABLE_BATCH_ATO
4680: 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 7b 20 22  MIC_WRITE).  { "
4690: 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20 20  ioctl",         
46a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
46b0: 5f 70 74 72 29 69 6f 63 74 6c 2c 20 20 20 20 20  _ptr)ioctl,     
46c0: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
46d0: 20 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20 20    { "ioctl",    
46e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
46f0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
4700: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
4710: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
4720: 49 6f 63 74 6c 20 28 28 69 6e 74 28 2a 29 28 69  Ioctl ((int(*)(i
4730: 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73  nt,int,...))aSys
4740: 63 61 6c 6c 5b 32 38 5d 2e 70 43 75 72 72 65 6e  call[28].pCurren
4750: 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66  t)..}; /* End of
4760: 20 74 68 65 20 6f 76 65 72 72 69 64 65 61 62 6c   the overrideabl
4770: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a  e system calls *
4780: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d  /.../*.** On som
4790: 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c 73  e systems, calls
47a0: 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69 6c   to fchown() wil
47b0: 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73 73  l trigger a mess
47c0: 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69 74  age in a securit
47d0: 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65 79  y.** log if they
47e0: 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72   come from non-r
47f0: 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20 20  oot processes.  
4800: 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e 67  So avoid calling
4810: 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a 20   fchown() if.** 
4820: 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e 69  we are not runni
4830: 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73  ng as root..*/.s
4840: 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74  tatic int robust
4850: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
4860: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
4870: 67 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  gid){.#if define
4880: 64 28 48 41 56 45 5f 46 43 48 4f 57 4e 29 0a 20  d(HAVE_FCHOWN). 
4890: 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75 69   return osGeteui
48a0: 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68 6f  d() ? 0 : osFcho
48b0: 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a  wn(fd,uid,gid);.
48c0: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
48d0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
48e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53  * This is the xS
48f0: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d  etSystemCall() m
4900: 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33  ethod of sqlite3
4910: 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20  _vfs for all of 
4920: 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46  the.** "unix" VF
4930: 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Ses.  Return SQL
4940: 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63  ITE_OK opon succ
4950: 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e  essfully updatin
4960: 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20  g the.** system 
4970: 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72  call pointer, or
4980: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
4990: 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   if there is no 
49a0: 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20  configurable.** 
49b0: 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65  system call name
49c0: 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  d zName..*/.stat
49d0: 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79  ic int unixSetSy
49e0: 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69  stemCall(.  sqli
49f0: 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65  te3_vfs *pNotUse
4a00: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
4a10: 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e   VFS pointer.  N
4a20: 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e  ot used */.  con
4a30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
4a40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
4a50: 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c  me of system cal
4a60: 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f  l to override */
4a70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
4a80: 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20  ll_ptr pNewFunc 
4a90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
4aa0: 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76  ew system call v
4ab0: 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  alue */.){.  uns
4ac0: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69  igned int i;.  i
4ad0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  nt rc = SQLITE_N
4ae0: 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53  OTFOUND;..  UNUS
4af0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f  ED_PARAMETER(pNo
4b00: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e  tUsed);.  if( zN
4b10: 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ame==0 ){.    /*
4b20: 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20   If no zName is 
4b30: 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61  given, restore a
4b40: 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ll system calls 
4b50: 74 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74  to their default
4b60: 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73  .    ** settings
4b70: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
4b80: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
4b90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4ba0: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4bb0: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4bc0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4bd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4be0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4bf0: 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20  fault ){.       
4c00: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
4c10: 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c  rrent = aSyscall
4c20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20  [i].pDefault;.  
4c30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
4c40: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  lse{.    /* If z
4c50: 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  Name is specifie
4c60: 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e  d, operate on on
4c70: 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65  ly the one syste
4c80: 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70  m call.    ** sp
4c90: 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a  ecified..    */.
4ca0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
4cb0: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4cc0: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
4cd0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
4ce0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
4cf0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
4d00: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
4d10: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
4d20: 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20  [i].pDefault==0 
4d30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79  ){.          aSy
4d40: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4d50: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4d60: 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20  pCurrent;.      
4d70: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
4d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
4d90: 20 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63      if( pNewFunc
4da0: 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d  ==0 ) pNewFunc =
4db0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
4dc0: 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61  fault;.        a
4dd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
4de0: 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a  ent = pNewFunc;.
4df0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4e00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4e10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4e20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4e30: 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73  e value of a sys
4e40: 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72  tem call.  Retur
4e50: 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20  n NULL if zName 
4e60: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f  is not a.** reco
4e70: 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61  gnized system ca
4e80: 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69  ll name.  NULL i
4e90: 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20  s also returned 
4ea0: 69 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  if the system ca
4eb0: 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ll.** is current
4ec0: 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f  ly undefined..*/
4ed0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
4ee0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78  syscall_ptr unix
4ef0: 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20  GetSystemCall(. 
4f00: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e   sqlite3_vfs *pN
4f10: 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20  otUsed,.  const 
4f20: 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20  char *zName.){. 
4f30: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
4f40: 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ..  UNUSED_PARAM
4f50: 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a  ETER(pNotUsed);.
4f60: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
4f70: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
4f80: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
4f90: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
4fa0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4fb0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4fc0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53  )==0 ) return aS
4fd0: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4fe0: 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  nt;.  }.  return
4ff0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5000: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
5010: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
5020: 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d   call after zNam
5030: 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55  e.  If zName==NU
5040: 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72  LL.** then retur
5050: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
5060: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
5070: 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c  all.  Return NUL
5080: 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73  L if zName.** is
5090: 20 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d   the last system
50a0: 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d   call or if zNam
50b0: 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  e is not the nam
50c0: 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20  e of a valid.** 
50d0: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a  system call..*/.
50e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
50f0: 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65  r *unixNextSyste
5100: 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66  mCall(sqlite3_vf
5110: 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  s *p, const char
5120: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
5130: 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45  i = -1;..  UNUSE
5140: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
5150: 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
5160: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
5170: 72 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c  raySize(aSyscall
5180: 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  )-1; i++){.     
5190: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
51a0: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
51b0: 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b  Name)==0 ) break
51c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f  ;.    }.  }.  fo
51d0: 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69  r(i++; i<ArraySi
51e0: 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b  ze(aSyscall); i+
51f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73  +){.    if( aSys
5200: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
5210: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  !=0 ) return aSy
5220: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  scall[i].zName;.
5230: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5240: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20  }../*.** Do not 
5250: 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20  accept any file 
5260: 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20  descriptor less 
5270: 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c  than this value,
5280: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   in order to avo
5290: 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61  id.** opening da
52a0: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e  tabase file usin
52b0: 67 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  g file descripto
52c0: 72 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d  rs that are comm
52d0: 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a  only used for .*
52e0: 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  * standard input
52f0: 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72  , output, and er
5300: 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ror..*/.#ifndef 
5310: 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46  SQLITE_MINIMUM_F
5320: 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23  ILE_DESCRIPTOR.#
5330: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d   define SQLITE_M
5340: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
5350: 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a  RIPTOR 3.#endif.
5360: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70  ./*.** Invoke op
5370: 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c  en().  Do so mul
5380: 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74  tiple times, unt
5390: 69 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63  il it either suc
53a0: 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c  ceeds or.** fail
53b0: 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f  s for some reaso
53c0: 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e  n other than EIN
53d0: 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  TR..**.** If the
53e0: 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d   file creation m
53f0: 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65  ode "m" is 0 the
5400: 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  n set it to the 
5410: 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53  default for.** S
5420: 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61  QLite.  The defa
5430: 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45  ult is SQLITE_DE
5440: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
5450: 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79  SSIONS (normally
5460: 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64  .** 0644) as mod
5470: 69 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73  ified by the sys
5480: 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d  tem umask.  If m
5490: 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a   is not 0, then.
54a0: 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
54b0: 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62   creation mode b
54c0: 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f  e exactly m igno
54d0: 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a  ring the umask..
54e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61  **.** The m para
54f0: 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f  meter will be no
5500: 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e  n-zero only when
5510: 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20   creating -wal, 
5520: 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64  -journal,.** and
5530: 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65   -shm files.  We
5540: 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65   want those file
5550: 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74  s to have *exact
5560: 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  ly* the same.** 
5570: 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74  permissions as t
5580: 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
5590: 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65  tabase, unadulte
55a0: 72 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  rated by the uma
55b0: 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77  sk..** In that w
55c0: 61 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73  ay, if a databas
55d0: 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77  e file is -rw-rw
55e0: 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d  -rw or -rw-rw-r-
55f0: 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73  , and a.** trans
5600: 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61  action crashes a
5610: 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64  nd leaves behind
5620: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74   hot journals, t
5630: 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65  hen any.** proce
5640: 73 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20  ss that is able 
5650: 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
5660: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c  database will al
5670: 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a  so be able to.**
5680: 20 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74   recover the hot
5690: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74   journals..*/.st
56a0: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
56b0: 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  open(const char 
56c0: 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f  *z, int f, mode_
56d0: 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a  t m){.  int fd;.
56e0: 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20    mode_t m2 = m 
56f0: 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46  ? m : SQLITE_DEF
5700: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
5710: 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31  SIONS;.  while(1
5720: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ){.#if defined(O
5730: 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64  _CLOEXEC).    fd
5740: 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f   = osOpen(z,f|O_
5750: 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c  CLOEXEC,m2);.#el
5760: 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70  se.    fd = osOp
5770: 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64  en(z,f,m2);.#end
5780: 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20  if.    if( fd<0 
5790: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  ){.      if( err
57a0: 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74  no==EINTR ) cont
57b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61  inue;.      brea
57c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
57d0: 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49   fd>=SQLITE_MINI
57e0: 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50  MUM_FILE_DESCRIP
57f0: 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  TOR ) break;.   
5800: 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20   osClose(fd);.  
5810: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
5820: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20  LITE_WARNING, . 
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
5840: 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  attempt to open 
5850: 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64  \"%s\" as file d
5860: 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a  escriptor %d", z
5870: 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20  , fd);.    fd = 
5880: 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70  -1;.    if( osOp
5890: 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20  en("/dev/null", 
58a0: 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b  f, m)<0 ) break;
58b0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30  .  }.  if( fd>=0
58c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30   ){.    if( m!=0
58d0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74   ){.      struct
58e0: 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20   stat statbuf;. 
58f0: 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74       if( osFstat
5900: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d  (fd, &statbuf)==
5910: 30 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61  0 .       && sta
5920: 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a  tbuf.st_size==0.
5930: 20 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62         && (statb
5940: 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  uf.st_mode&0777)
5950: 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  !=m .      ){.  
5960: 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66        osFchmod(f
5970: 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  d, m);.      }. 
5980: 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64     }.#if defined
5990: 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20  (FD_CLOEXEC) && 
59a0: 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45  (!defined(O_CLOE
59b0: 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45  XEC) || O_CLOEXE
59c0: 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74  C==0).    osFcnt
59d0: 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f  l(fd, F_SETFD, o
59e0: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
59f0: 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45  FD, 0) | FD_CLOE
5a00: 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  XEC);.#endif.  }
5a10: 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a  .  return fd;.}.
5a20: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
5a30: 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69  nctions to obtai
5a40: 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68  n and relinquish
5a50: 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65   the global mute
5a60: 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c  x. The.** global
5a70: 20 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74   mutex is used t
5a80: 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e  o protect the un
5a90: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a  ixInodeInfo and.
5aa0: 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ** vxworksFileId
5ab0: 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79   objects used by
5ac0: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20   this file, all 
5ad0: 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20  of which may be 
5ae0: 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75  .** shared by mu
5af0: 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a  ltiple threads..
5b00: 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75  **.** Function u
5b10: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
5b20: 73 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74  s used to assert
5b30: 28 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62  () that the glob
5b40: 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20  al mutex .** is 
5b50: 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72  held when requir
5b60: 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ed. This functio
5b70: 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61  n is only used a
5b80: 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74  s part of assert
5b90: 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  () .** statement
5ba0: 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20  s. e.g..**.**   
5bb0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
5bc0: 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20  .**     assert( 
5bd0: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
5be0: 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65  );.**   unixEnte
5bf0: 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74  rLeave().*/.stat
5c00: 69 63 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  ic sqlite3_mutex
5c10: 20 2a 75 6e 69 78 42 69 67 4c 6f 63 6b 20 3d 20   *unixBigLock = 
5c20: 30 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  0;.static void u
5c30: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 76 6f  nixEnterMutex(vo
5c40: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
5c50: 75 74 65 78 5f 65 6e 74 65 72 28 75 6e 69 78 42  utex_enter(unixB
5c60: 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74 61 74 69  igLock);.}.stati
5c70: 63 20 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65  c void unixLeave
5c80: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
5c90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5ca0: 76 65 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b  ve(unixBigLock);
5cb0: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
5cc0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
5cd0: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
5ce0: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
5cf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
5d00: 65 6c 64 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29  eld(unixBigLock)
5d10: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
5d20: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
5d30: 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48  OS_TRACE./*.** H
5d40: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
5d50: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
5d60: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
5d70: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
5d80: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
5d90: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
5da0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
5db0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
5dc0: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
5dd0: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
5de0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
5df0: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
5e00: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
5e10: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
5e20: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
5e30: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
5e40: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
5e50: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
5e60: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
5e70: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
5e80: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
5e90: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
5ea0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
5eb0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
5ec0: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
5ed0: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
5ee0: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
5ef0: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
5f00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
5f10: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
5f20: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
5f30: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
5f40: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
5f50: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
5f60: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
5f70: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
5f80: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
5f90: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
5fa0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
5fb0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
5fc0: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
5fd0: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
5fe0: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
5ff0: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
6000: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
6010: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
6020: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
6030: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
6040: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
6050: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
6060: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
6070: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
6080: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
6090: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
60a0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
60b0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
60c0: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
60d0: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
60e0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
60f0: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
6100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
6110: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
6120: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
6130: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
6140: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
6150: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
6160: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
6170: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
6180: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
6190: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
61a0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
61b0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
61c0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
61d0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
61e0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
61f0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
6200: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
6210: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
6220: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
6230: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
6240: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
6250: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
6260: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
6270: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
6280: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
6290: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
62a0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
62b0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
62c0: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
62d0: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
62e0: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
62f0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
6300: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
6310: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
6320: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
6330: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
6340: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
6350: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
6360: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
6370: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
6380: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
6390: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
63a0: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
63b0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
63c0: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
63d0: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
63e0: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
63f0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
6400: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
6410: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
6420: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
6430: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
6440: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
6450: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6460: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
6470: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
6480: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
6490: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
64a0: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
64b0: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
64c0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
64d0: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
64e0: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
64f0: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
6500: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
6510: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
6520: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
6530: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
6540: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
6550: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
6560: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
6570: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
6580: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
6590: 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c  o EINTR.**.** Al
65a0: 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e  l calls to ftrun
65b0: 63 61 74 65 28 29 20 77 69 74 68 69 6e 20 74 68  cate() within th
65c0: 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  is file should b
65d0: 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68 0a 2a  e made through.*
65e0: 2a 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 20  * this wrapper. 
65f0: 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69 64 20   On the Android 
6600: 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61 73 73  platform, bypass
6610: 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20 62 65  ing the logic be
6620: 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61  low.** could lea
6630: 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74 20 64  d to a corrupt d
6640: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
6650: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
6660: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
6670: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
6680: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64  {.  int rc;.#ifd
6690: 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20  ef __ANDROID__. 
66a0: 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20   /* On Android, 
66b0: 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c 77 61  ftruncate() alwa
66c0: 79 73 20 75 73 65 73 20 33 32 2d 62 69 74 20 6f  ys uses 32-bit o
66d0: 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69 66 20  ffsets, even if 
66e0: 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53  .  ** _FILE_OFFS
66f0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
6700: 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  fined. This mean
6710: 73 20 69 74 20 69 73 20 75 6e 73 61 66 65 20 74  s it is unsafe t
6720: 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a  o attempt to.  *
6730: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
6740: 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61  e to any size la
6750: 72 67 65 72 20 74 68 61 6e 20 32 47 69 42 2e 20  rger than 2GiB. 
6760: 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20  Silently ignore 
6770: 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 61 74  any.  ** such at
6780: 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66  tempts.  */.  if
6790: 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e  ( sz>(sqlite3_in
67a0: 74 36 34 29 30 78 37 46 46 46 46 46 46 46 20 29  t64)0x7FFFFFFF )
67b0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
67c0: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  E_OK;.  }else.#e
67d0: 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20  ndif.  do{ rc = 
67e0: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
67f0: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
6800: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
6810: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
6820: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6830: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
6840: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
6850: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
6860: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
6870: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
6880: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
6890: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
68a0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
68b0: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
68c0: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
68d0: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
68e0: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
68f0: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
6900: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
6910: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
6920: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
6930: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
6940: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
6950: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
6960: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
6970: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
6980: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
6990: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
69a0: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
69b0: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
69c0: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
69d0: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
69e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
69f0: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
6a00: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
6a10: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
6a20: 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73 73 65  eIOErr) {.  asse
6a30: 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  rt( (sqliteIOErr
6a40: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6a50: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  _LOCK) || .     
6a60: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6a70: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6a80: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
6a90: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
6aa0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
6ab0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
6ac0: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
6ad0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6ae0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
6af0: 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73  RVEDLOCK) );.  s
6b00: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
6b10: 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41 43 43  r) {.  case EACC
6b20: 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41 47 41  ES: .  case EAGA
6b30: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
6b40: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
6b50: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
6b60: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
6b70: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
6b80: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
6b90: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
6ba0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
6bb0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
6bc0: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6bd0: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
6be0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
6bf0: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
6c00: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6c10: 20 20 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a    .  case EPERM:
6c20: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
6c30: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
6c40: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
6c50: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
6c60: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  r;.  }.}.../****
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ca0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
6cd0: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
6ce0: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
6cf0: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
6d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
6d10: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
6d20: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
6d30: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
6d40: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
6d50: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
6d60: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
6d70: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
6d80: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
6d90: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
6da0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
6db0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
6dc0: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
6dd0: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
6de0: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6df0: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
6e00: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
6e10: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
6e20: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
6e30: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
6e40: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
6e50: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
6e60: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
6e70: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
6e80: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
6e90: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
6ea0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
6eb0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
6ec0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
6ed0: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
6ee0: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
6ef0: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
6f00: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
6f10: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
6f20: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
6f30: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
6f40: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
6f50: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
6f60: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
6f70: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
6f80: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
6f90: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
6fa0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
6fb0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
6fc0: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
6fd0: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
6fe0: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
6ff0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7000: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
7010: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
7020: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
7030: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
7040: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7050: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
7060: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
7070: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7090: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
70a0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
70b0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
70c0: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
70d0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
70e0: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
70f0: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
7100: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
7110: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
7120: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
7130: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
7140: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
7150: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
7160: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
7170: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
7180: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
7190: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
71a0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
71b0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
71c0: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
71d0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
71e0: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
71f0: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
7200: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
7210: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
7220: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
7230: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
7240: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
7250: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
7260: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
7270: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
7280: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
7290: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
72a0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
72b0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
72c0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
72d0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
72e0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
72f0: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
7300: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
7310: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
7320: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
7330: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
7340: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
7350: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
7360: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
7370: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
7380: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
7390: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
73a0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
73b0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
73c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
73d0: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
73e0: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
73f0: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
7400: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
7410: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7430: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7440: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
7450: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
7460: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
7470: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
7480: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
7490: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
74a0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
74b0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
74c0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
74d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
74e0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
74f0: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
7500: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
7510: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
7520: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
7530: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
7540: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
7550: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7560: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
7570: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
7580: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
7590: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
75a0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
75b0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
75c0: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
75d0: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
75e0: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
75f0: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
7600: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
7610: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7620: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
7630: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
7640: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
7650: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
7660: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
7670: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
7680: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
7690: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
76a0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
76b0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
76c0: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
76d0: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
76e0: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
76f0: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
7700: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
7710: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
7720: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
7730: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7740: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
7750: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
7760: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
7770: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
7780: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
77a0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
77b0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
77c0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
77d0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
77e0: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
77f0: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
7800: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
7810: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7820: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
7830: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
7840: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7850: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7860: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
7870: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
7880: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
7890: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
78a0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
78b0: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
78c0: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
78d0: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
78e0: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
78f0: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
7900: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
7910: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
7920: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
7930: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
7940: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
7950: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
7960: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7970: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
7980: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
7990: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
79a0: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
79b0: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
79c0: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
79d0: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
79e0: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
79f0: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
7a00: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
7a10: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
7a20: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
7a30: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
7a40: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7a50: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
7a60: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
7a70: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
7a80: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
7a90: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
7aa0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7ab0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
7ac0: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
7ad0: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
7ae0: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
7af0: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
7b00: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
7b10: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
7b20: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
7b30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
7b40: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
7b50: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
7b60: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
7b70: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7b80: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7b90: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
7ba0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7bb0: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
7bc0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7bd0: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
7be0: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
7bf0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
7c00: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
7c10: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
7c20: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
7c30: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
7c40: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
7c50: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
7c60: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
7c70: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
7c80: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
7c90: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
7ca0: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
7cb0: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
7cc0: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
7cd0: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
7ce0: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
7cf0: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
7d00: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
7d10: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
7d20: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
7d30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
7d40: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
7d50: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7d60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
7d70: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
7d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
7d90: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
7da0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
7db0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
7dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
7dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
7e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
7e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7e80: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
7e90: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
7ea0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
7ec0: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
7ed0: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
7ee0: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
7ef0: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
7f00: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
7f10: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
7f20: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
7f30: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
7f40: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
7f50: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
7f60: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
7f70: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
7f80: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
7f90: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
7fa0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
7fb0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
7fc0: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
7fd0: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
7fe0: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
7ff0: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
8000: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
8010: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
8020: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
8030: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
8040: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
8050: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
8060: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
8070: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
8080: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
8090: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
80a0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
80b0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
80c0: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
80d0: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
80e0: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
80f0: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
8100: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
8110: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
8120: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
8130: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
8140: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
8150: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
8160: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
8170: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
8180: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
8190: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
81a0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
81b0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
81c0: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
81d0: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
81e0: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
81f0: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
8200: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
8210: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
8220: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
8230: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8240: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
8250: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
8260: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
8270: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
8280: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
8290: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
82a0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
82b0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
82c0: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
82d0: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
82e0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
82f0: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
8300: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
8310: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
8320: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
8330: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
8340: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
8350: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
8360: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
8370: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
8380: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
8390: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
83a0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
83b0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
83c0: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
83d0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
83e0: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
83f0: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
8400: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
8410: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
8420: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
8430: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
8440: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
8450: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
8460: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
8470: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
8480: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
8490: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
84a0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
84b0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
84c0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
84d0: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
84e0: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
84f0: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
8500: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
8510: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
8520: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
8530: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
8540: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
8550: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
8560: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
8570: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
8580: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
8590: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
85a0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
85b0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
85c0: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
85d0: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
85e0: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
85f0: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
8600: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
8610: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
8620: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
8630: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
8640: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
8650: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
8660: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
8670: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
8680: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
8690: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
86a0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
86b0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
86c0: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
86d0: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
86e0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
86f0: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
8700: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
8710: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
8720: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8730: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
8740: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
8750: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
8760: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
8770: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
8780: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8790: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
87a0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
87b0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
87c0: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
87d0: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
87e0: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
87f0: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
8800: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
8810: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
8820: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8830: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8840: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
8850: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
8860: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
8870: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
8880: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
8890: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
88a0: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
88b0: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
88c0: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
88d0: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
88e0: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
88f0: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
8900: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
8910: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
8920: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
8930: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
8940: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
8950: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
8960: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
8970: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
8980: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
8990: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
89a0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
89b0: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
89c0: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
89d0: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
89e0: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
89f0: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
8a00: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
8a10: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
8a20: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
8a30: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
8a40: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
8a50: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
8a60: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
8a70: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
8a80: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
8a90: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
8aa0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
8ab0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
8ac0: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
8ad0: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
8ae0: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
8af0: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
8b00: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
8b10: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
8b20: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
8b30: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
8b40: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8b50: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
8b60: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
8b70: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
8b80: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
8b90: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
8ba0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
8bb0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
8bc0: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
8bd0: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
8be0: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
8bf0: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
8c00: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
8c10: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
8c20: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
8c30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
8c40: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
8c50: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
8c60: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
8c70: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
8c80: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
8c90: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
8ca0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
8cb0: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
8cc0: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
8cd0: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
8ce0: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
8cf0: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
8d00: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
8d10: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
8d20: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
8d30: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
8d40: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
8d50: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
8d60: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
8d70: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
8d80: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
8d90: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
8da0: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
8db0: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
8dc0: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
8dd0: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
8de0: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
8df0: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
8e00: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
8e10: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
8e20: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
8e30: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
8e40: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
8e50: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
8e60: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
8e70: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
8e80: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
8e90: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
8ea0: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
8eb0: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
8ec0: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
8ed0: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
8ee0: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
8ef0: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
8f00: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
8f10: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
8f20: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
8f30: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
8f40: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
8f50: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
8f60: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
8f70: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
8f80: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
8f90: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
8fa0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
8fb0: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
8fc0: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
8fd0: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
8fe0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
8ff0: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
9000: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
9010: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
9020: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
9030: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
9040: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
9050: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
9060: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
9070: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
9080: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
9090: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
90a0: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
90b0: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
90c0: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
90d0: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
90e0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
90f0: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
9100: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
9110: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
9120: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9130: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
9140: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
9150: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
9160: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
9170: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
9180: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
9190: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
91a0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
91b0: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
91c0: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
91d0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
91e0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
9210: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
9220: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
9230: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
9240: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
9250: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
9260: 2a 2f 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65  */.#else.  /* We
9270: 20 61 72 65 20 74 6f 6c 64 20 74 68 61 74 20 73   are told that s
9280: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
9290: 41 6e 64 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20  Android contain 
92a0: 61 20 62 75 67 20 74 68 61 74 0a 20 20 2a 2a 20  a bug that.  ** 
92b0: 73 69 7a 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f  sizes ino_t at o
92c0: 6e 6c 79 20 33 32 2d 62 69 74 73 20 69 6e 73 74  nly 32-bits inst
92d0: 65 61 64 20 6f 66 20 36 34 2d 62 69 74 73 2e 20  ead of 64-bits. 
92e0: 28 53 65 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a  (See.  ** https:
92f0: 2f 2f 61 6e 64 72 6f 69 64 2d 72 65 76 69 65 77  //android-review
9300: 2e 67 6f 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f  .googlesource.co
9310: 6d 2f 23 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64  m/#/c/115351/3/d
9320: 69 73 74 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20  ist/sqlite3.c). 
9330: 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
9340: 6e 64 20 74 68 69 73 2c 20 61 6c 77 61 79 73 20  nd this, always 
9350: 61 6c 6c 6f 63 61 74 65 20 36 34 2d 62 69 74 73  allocate 64-bits
9360: 20 66 6f 72 20 74 68 65 20 69 6e 6f 64 65 20 6e   for the inode n
9370: 75 6d 62 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e  umber.  .  ** On
9380: 20 73 6d 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20   small machines 
9390: 74 68 61 74 20 6f 6e 6c 79 20 68 61 76 65 20 33  that only have 3
93a0: 32 2d 62 69 74 20 69 6e 6f 64 65 73 2c 20 74 68  2-bit inodes, th
93b0: 69 73 20 77 61 73 74 65 73 20 34 20 62 79 74 65  is wastes 4 byte
93c0: 73 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74  s,.  ** but that
93d0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
93e0: 20 62 69 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20   big deal. */.  
93f0: 2f 2a 20 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69  /* WAS:  ino_t i
9400: 6e 6f 3b 20 20 20 2a 2f 0a 20 20 75 36 34 20 69  no;   */.  u64 i
9410: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
9420: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
9430: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
9440: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
9450: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
9460: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
9470: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
9480: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
9490: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
94a0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
94b0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
94c0: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
94d0: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
94e0: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
94f0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
9500: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
9510: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
9520: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
9530: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
9540: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
9550: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
9560: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
9570: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
9580: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
9590: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
95a0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
95b0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
95c0: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
95d0: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
95e0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
95f0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
9600: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
9610: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
9620: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
9630: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9640: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
9650: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
9660: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
9670: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
9680: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
9690: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
96a0: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
96b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
96c0: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
96d0: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
96e0: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
96f0: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
9700: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9710: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9720: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
9730: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
9740: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
9750: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
9760: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
9770: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
9780: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
9790: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
97a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
97b0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
97c0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
97d0: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
97e0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
97f0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
9800: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
9810: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
9820: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
9830: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
9840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
9850: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
9860: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
9870: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
9880: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
9890: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
98a0: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
98b0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
98c0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
98d0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
98e0: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
98f0: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
9900: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
9910: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
9920: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
9930: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9950: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
9960: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
9970: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
9980: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
9990: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
99a0: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
99b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
99c0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
99d0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
99e0: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
99f0: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
9a00: 74 20 3d 20 30 3b 20 20 2f 2a 20 41 6c 6c 20 75  t = 0;  /* All u
9a10: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
9a20: 65 63 74 73 20 2a 2f 0a 73 74 61 74 69 63 20 75  ects */.static u
9a30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 55 6e 75  nsigned int nUnu
9a40: 73 65 64 46 64 20 3d 20 30 3b 20 20 20 20 2f 2a  sedFd = 0;    /*
9a50: 20 54 6f 74 61 6c 20 75 6e 75 73 65 64 20 66 69   Total unused fi
9a60: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 2a  le descriptors *
9a70: 2f 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  /../*.**.** This
9a80: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
9a90: 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29  LogErrorAtLine()
9aa0: 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63  , is only ever c
9ab0: 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61  alled via the ma
9ac0: 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72  cro.** unixLogEr
9ad0: 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  ror()..**.** It 
9ae0: 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72  is invoked after
9af0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
9b00: 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69   in an OS functi
9b10: 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73  on and errno has
9b20: 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74   been.** set. It
9b30: 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20   logs a message 
9b40: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f  using sqlite3_lo
9b50: 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  g() containing t
9b60: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
9b70: 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64   of.** errno and
9b80: 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74  , if possible, t
9b90: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
9ba0: 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f  e equivalent fro
9bb0: 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a  m strerror() or.
9bc0: 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  ** strerror_r().
9bd0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
9be0: 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64   argument passed
9bf0: 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68   to the macro sh
9c00: 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f  ould be the erro
9c10: 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77  r code that.** w
9c20: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
9c30: 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20  to SQLite (e.g. 
9c40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
9c50: 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  ETE, SQLITE_CANT
9c60: 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74  OPEN). .** The t
9c70: 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61 72  wo subsequent ar
9c80: 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  guments should b
9c90: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
9ca0: 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  e OS function th
9cb0: 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e  at.** failed (e.
9cc0: 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70  g. "unlink", "op
9cd0: 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73 73  en") and the ass
9ce0: 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73  ociated file-sys
9cf0: 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20  tem path,.** if 
9d00: 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  any..*/.#define 
9d10: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62  unixLogError(a,b
9d20: 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45  ,c)     unixLogE
9d30: 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63  rrorAtLine(a,b,c
9d40: 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69  ,__LINE__).stati
9d50: 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72  c int unixLogErr
9d60: 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20  orAtLine(.  int 
9d70: 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20  errcode,        
9d80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
9d90: 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
9da0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
9db0: 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20   *zFunc,        
9dc0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
9dd0: 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61   OS function tha
9de0: 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f  t failed */.  co
9df0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
9e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9e10: 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63   File path assoc
9e20: 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f 72  iated with error
9e30: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20   */.  int iLine 
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e50: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20        /* Source 
9e60: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72  line number wher
9e70: 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  e error occurred
9e80: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
9e90: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
9ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
9eb0: 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  age from strerro
9ec0: 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e  r() or equivalen
9ed0: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e  t */.  int iErrn
9ee0: 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20  o = errno;      
9ef0: 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20         /* Saved 
9f00: 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75  syscall error nu
9f10: 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  mber */..  /* If
9f20: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
9f30: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 20  hreadsafe build 
9f40: 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41  (SQLITE_THREADSA
9f50: 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65  FE==0), then use
9f60: 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72  .  ** the strerr
9f70: 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f  or() function to
9f80: 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61   obtain the huma
9f90: 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72  n-readable error
9fa0: 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71   message.  ** eq
9fb0: 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e  uivalent to errn
9fc0: 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73  o. Otherwise, us
9fd0: 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a  e strerror_r()..
9fe0: 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45    */ .#if SQLITE
9ff0: 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20 64  _THREADSAFE && d
a000: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45  efined(HAVE_STRE
a010: 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61  RROR_R).  char a
a020: 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65  Err[80];.  memse
a030: 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f  t(aErr, 0, sizeo
a040: 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72  f(aErr));.  zErr
a050: 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49   = aErr;..  /* I
a060: 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  f STRERROR_R_CHA
a070: 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74 6f  R_P (set by auto
a080: 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72  conf scripts) or
a090: 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65   __USE_GNU is de
a0a0: 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75  fined,.  ** assu
a0b0: 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74  me that the syst
a0c0: 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20  em provides the 
a0d0: 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  GNU version of s
a0e0: 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74  trerror_r() that
a0f0: 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  .  ** returns a 
a100: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
a110: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
a120: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
a130: 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a  . That pointer .
a140: 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74    ** may point t
a150: 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20  o aErr[], or it 
a160: 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d  may point to som
a170: 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67 65  e static storage
a180: 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a   somewhere. .  *
a190: 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73  * Otherwise, ass
a1a0: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
a1b0: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
a1c0: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f   POSIX version o
a1d0: 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72  f .  ** strerror
a1e0: 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61  _r(), which alwa
a1f0: 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72 72  ys writes an err
a200: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20  or message into 
a210: 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a  aErr[]..  **.  *
a220: 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e  * If the code in
a230: 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65  correctly assume
a240: 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65  s that it is the
a250: 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74   POSIX version t
a260: 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69  hat is.  ** avai
a270: 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72  lable, the error
a280: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66   message will of
a290: 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20  ten be an empty 
a2a0: 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20  string. Not a.  
a2b0: 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e  ** huge problem.
a2c0: 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e   Incorrectly con
a2d0: 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68 65  cluding that the
a2e0: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20   GNU version is 
a2f0: 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20  available .  ** 
a300: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20  could lead to a 
a310: 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e  segfault though.
a320: 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
a330: 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41  d(STRERROR_R_CHA
a340: 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  R_P) || defined(
a350: 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72  __USE_GNU).  zEr
a360: 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73  r = .# endif.  s
a370: 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f  trerror_r(iErrno
a380: 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61  , aErr, sizeof(a
a390: 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20  Err)-1);..#elif 
a3a0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
a3b0: 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61  E.  /* This is a
a3c0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c   threadsafe buil
a3d0: 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f  d, but strerror_
a3e0: 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  r() is not avail
a3f0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20  able. */.  zErr 
a400: 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a  = "";.#else.  /*
a410: 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20   Non-threadsafe 
a420: 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72  build, use strer
a430: 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72  ror(). */.  zErr
a440: 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72 72   = strerror(iErr
a450: 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  no);.#endif..  i
a460: 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50  f( zPath==0 ) zP
a470: 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69  ath = "";.  sqli
a480: 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c  te3_log(errcode,
a490: 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e  .      "os_unix.
a4a0: 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25 73  c:%d: (%d) %s(%s
a4b0: 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69  ) - %s",.      i
a4c0: 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46  Line, iErrno, zF
a4d0: 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72  unc, zPath, zErr
a4e0: 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  .  );..  return 
a4f0: 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  errcode;.}../*.*
a500: 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  * Close a file d
a510: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a  escriptor..**.**
a520: 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   We assume that 
a530: 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61  close() almost a
a540: 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e  lways works, sin
a550: 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e  ce it is only in
a560: 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20   a.** very sick 
a570: 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f  application or o
a580: 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c  n a very sick pl
a590: 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d  atform that it m
a5a0: 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66  ight fail..** If
a5b0: 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73   it does fail, s
a5c0: 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66  imply leak the f
a5d0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
a5e0: 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a  but do log the.*
a5f0: 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e  * error..**.** N
a600: 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20 6e  ote that it is n
a610: 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72 79  ot safe to retry
a620: 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45   close() after E
a630: 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a  INTR since the.*
a640: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
a650: 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72  r might have alr
a660: 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65 64  eady been reused
a670: 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65   by another thre
a680: 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e  ad..** So we don
a690: 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72  't even try to r
a6a0: 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45  ecover from an E
a6b0: 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20  INTR.  Just log 
a6c0: 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64  the error.** and
a6d0: 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61   move on..*/.sta
a6e0: 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f  tic void robust_
a6f0: 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  close(unixFile *
a700: 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e  pFile, int h, in
a710: 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28  t lineno){.  if(
a720: 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20   osClose(h) ){. 
a730: 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41     unixLogErrorA
a740: 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45  tLine(SQLITE_IOE
a750: 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65  RR_CLOSE, "close
a760: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
a770: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 20            pFile 
a780: 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a  ? pFile->zPath :
a790: 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d   0, lineno);.  }
a7a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
a7b0: 65 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  e pFile->lastErr
a7c0: 6e 6f 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20  no.  Do this in 
a7d0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20  a subroutine as 
a7e0: 74 68 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a  that provides.**
a7f0: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
a800: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
a810: 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  akpoint..*/.stat
a820: 69 63 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73  ic void storeLas
a830: 74 45 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20  tErrno(unixFile 
a840: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f  *pFile, int erro
a850: 72 29 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73  r){.  pFile->las
a860: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a  tErrno = error;.
a870: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
a880: 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ll file descript
a890: 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64 20 69  ors accumuated i
a8a0: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
a8b0: 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  nfo->pUnused lis
a8c0: 74 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f  t..*/ .static vo
a8d0: 69 64 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46  id closePendingF
a8e0: 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ds(unixFile *pFi
a8f0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
a900: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
a910: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
a920: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b  UnixUnusedFd *p;
a930: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
a940: 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d  *pNext;.  for(p=
a950: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
a960: 20 70 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20   p; p=pNext){.  
a970: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
a980: 78 74 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  xt;.    robust_c
a990: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66  lose(pFile, p->f
a9a0: 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
a9b0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a9c0: 29 3b 0a 20 20 20 20 6e 55 6e 75 73 65 64 46 64  );.    nUnusedFd
a9d0: 2d 2d 3b 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65  --;.  }.  pInode
a9e0: 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
a9f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
aa00: 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  a unixInodeInfo 
aa10: 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f  structure previo
aa20: 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  usly allocated b
aa30: 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  y findInodeInfo(
aa40: 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  )..**.** The mut
aa50: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
aa60: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
aa70: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
aa80: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
aa90: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
aaa0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a  n is called..*/.
aab0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
aac0: 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69  aseInodeInfo(uni
aad0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
aae0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
aaf0: 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
ab00: 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
ab10: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
ab20: 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59  ) );.  if( ALWAY
ab30: 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20  S(pInode) ){.   
ab40: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b   pInode->nRef--;
ab50: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
ab60: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
ab70: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
ab80: 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b  ->pShmNode==0 );
ab90: 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
aba0: 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
abb0: 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d       if( pInode-
abc0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  >pPrev ){.      
abd0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
abe0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d  ->pPrev->pNext==
abf0: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
ac00: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d    pInode->pPrev-
ac10: 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
ac20: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65  >pNext;.      }e
ac30: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
ac40: 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d  ert( inodeList==
ac50: 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20  pInode );.      
ac60: 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49    inodeList = pI
ac70: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
ac80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
ac90: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a  Inode->pNext ){.
aca0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
acb0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
acc0: 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Prev==pInode );.
acd0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
ace0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
acf0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20  Inode->pPrev;.  
ad00: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ad10: 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29  te3_free(pInode)
ad20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
ad30: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 21  sert( inodeList!
ad40: 3d 30 20 7c 7c 20 6e 55 6e 75 73 65 64 46 64 3d  =0 || nUnusedFd=
ad50: 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  =0 );.}../*.** G
ad60: 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  iven a file desc
ad70: 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74  riptor, locate t
ad80: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
ad90: 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20   object that.** 
ada0: 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20 66  describes that f
adb0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
adc0: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e   Create a new on
add0: 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20  e if necessary. 
ade0: 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76   The.** return v
adf0: 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e  alue might be un
ae00: 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61  initialized if a
ae10: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a  n error occurs..
ae20: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
ae30: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
ae40: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
ae50: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
ae60: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
ae70: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
ae80: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
ae90: 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70  Return an approp
aea0: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
aeb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aec0: 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20  findInodeInfo(. 
aed0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
aee0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
aef0: 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74  /* Unix file wit
af00: 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65 64  h file desc used
af10: 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20   in the key */. 
af20: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
af30: 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20 20  *ppInode        
af40: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e  /* Return the un
af50: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
af60: 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ct here */.){.  
af70: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
af80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
af90: 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65  * System call re
afa0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
afb0: 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
afd0: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
afe0: 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a  ptor for pFile *
aff0: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46  /.  struct unixF
b000: 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20  ileId fileId;   
b010: 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79     /* Lookup key
b020: 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e 6f   for the unixIno
b030: 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72 75  deInfo */.  stru
b040: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
b050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b060: 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66  w-level file inf
b070: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e  ormation */.  un
b080: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
b090: 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  ode = 0;     /* 
b0a0: 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49 6e  Candidate unixIn
b0b0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 2a  odeInfo object *
b0c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  /..  assert( uni
b0d0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
b0e0: 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c 65  .  /* Get low-le
b0f0: 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  vel information 
b100: 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 74  about the file t
b110: 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64 20  hat we can used 
b120: 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20 61  to.  ** create a
b130: 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f 72   unique name for
b140: 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
b150: 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b    fd = pFile->h;
b160: 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
b170: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
b180: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
b190: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
b1a0: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
b1b0: 23 69 66 20 64 65 66 69 6e 65 64 28 45 4f 56 45  #if defined(EOVE
b1c0: 52 46 4c 4f 57 29 20 26 26 20 64 65 66 69 6e 65  RFLOW) && define
b1d0: 64 28 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45  d(SQLITE_DISABLE
b1e0: 5f 4c 46 53 29 0a 20 20 20 20 69 66 28 20 70 46  _LFS).    if( pF
b1f0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
b200: 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75  EOVERFLOW ) retu
b210: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b  rn SQLITE_NOLFS;
b220: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
b230: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
b240: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41  .  }..#ifdef __A
b250: 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f  PPLE__.  /* On O
b260: 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20  S X on an msdos 
b270: 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20  filesystem, the 
b280: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20  inode number is 
b290: 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e  reported.  ** in
b2a0: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65  correctly for ze
b2b0: 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20  ro-size files.  
b2c0: 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30  See ticket #3260
b2d0: 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20  .  To work.  ** 
b2e0: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
b2f0: 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72  lem (we consider
b300: 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20   it a bug in OS 
b310: 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20  X, not SQLite). 
b320: 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e   ** we always in
b330: 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
b340: 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69  size to 1 by wri
b350: 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
b360: 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  te.  ** prior to
b370: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69   accessing the i
b380: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  node number.  Th
b390: 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74  e one byte writt
b3a0: 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53  en is.  ** an AS
b3b0: 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65  CII 'S' characte
b3c0: 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70  r which also hap
b3d0: 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66  pens to be the f
b3e0: 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69  irst byte.  ** i
b3f0: 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
b400: 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74  every SQLite dat
b410: 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20  abase.  In this 
b420: 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20  way, if there.  
b430: 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  ** is a race con
b440: 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74  dition such that
b450: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
b460: 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75  has already popu
b470: 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66  lated.  ** the f
b480: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
b490: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61   database, no da
b4a0: 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20  mage is done..  
b4b0: 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66  */.  if( statbuf
b4c0: 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28  .st_size==0 && (
b4d0: 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26  pFile->fsFlags &
b4e0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
b4f0: 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a  IS_MSDOS)!=0 ){.
b500: 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57      do{ rc = osW
b510: 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29  rite(fd, "S", 1)
b520: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
b530: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
b540: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20  ;.    if( rc!=1 
b550: 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
b560: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
b570: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
b580: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
b590: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
b5a0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
b5b0: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
b5c0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  rc!=0 ){.      s
b5d0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
b5e0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
b5f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b600: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
b610: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
b620: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
b630: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
b640: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
b650: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
b660: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
b670: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
b680: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
b690: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 28 75   fileId.ino = (u
b6a0: 36 34 29 73 74 61 74 62 75 66 2e 73 74 5f 69 6e  64)statbuf.st_in
b6b0: 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  o;.#endif.  asse
b6c0: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30  rt( inodeList!=0
b6d0: 20 7c 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30   || nUnusedFd==0
b6e0: 20 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69   );.  pInode = i
b6f0: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
b700: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
b710: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
b720: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
b730: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
b740: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
b750: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
b760: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
b770: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
b780: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
b790: 34 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  4( sizeof(*pInod
b7a0: 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  e) );.    if( pI
b7b0: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  node==0 ){.     
b7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
b7d0: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
b7e0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f  .    memset(pIno
b7f0: 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
b800: 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d  Inode));.    mem
b810: 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  cpy(&pInode->fil
b820: 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69  eId, &fileId, si
b830: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
b840: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20     pInode->nRef 
b850: 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  = 1;.    pInode-
b860: 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69  >pNext = inodeLi
b870: 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  st;.    pInode->
b880: 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69  pPrev = 0;.    i
b890: 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69  f( inodeList ) i
b8a0: 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20  nodeList->pPrev 
b8b0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e  = pInode;.    in
b8c0: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
b8d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
b8e0: 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Inode->nRef++;. 
b8f0: 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20   }.  *ppInode = 
b900: 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e  pInode;.  return
b910: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b920: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
b930: 20 69 66 20 70 46 69 6c 65 20 68 61 73 20 62 65   if pFile has be
b940: 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e  en renamed or un
b950: 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20  linked since it 
b960: 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
b970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b980: 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69  fileHasMoved(uni
b990: 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23  xFile *pFile){.#
b9a0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
b9b0: 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49  return pFile->pI
b9c0: 6e 6f 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65  node!=0 && pFile
b9d0: 2d 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49  ->pId!=pFile->pI
b9e0: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64  node->fileId.pId
b9f0: 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74  ;.#else.  struct
ba00: 20 73 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74   stat buf;.  ret
ba10: 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  urn pFile->pInod
ba20: 65 21 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f  e!=0 &&.      (o
ba30: 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61  sStat(pFile->zPa
ba40: 74 68 2c 20 26 62 75 66 29 21 3d 30 20 0a 20 20  th, &buf)!=0 .  
ba50: 20 20 20 20 20 20 20 7c 7c 20 28 75 36 34 29 62         || (u64)b
ba60: 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65  uf.st_ino!=pFile
ba70: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
ba80: 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  .ino);.#endif.}.
ba90: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20  ../*.** Check a 
baa0: 75 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69 73  unixFile that is
bab0: 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 56 65   a database.  Ve
bac0: 72 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  rify the followi
bad0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68  ng:.**.** (1) Th
bae0: 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
baf0: 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20  ne hard link on 
bb00: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20  the file.** (2) 
bb10: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
bb20: 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a  a symbolic link.
bb30: 2a 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65 20  ** (3) The file 
bb40: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e  has not been ren
bb50: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
bb60: 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c  .**.** Issue sql
bb70: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bb80: 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73  WARNING,...) mes
bb90: 73 61 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e  sages if anythin
bba0: 67 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a  g is not right..
bbb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
bbc0: 65 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78  erifyDbFile(unix
bbd0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
bbe0: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
bbf0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
bc00: 20 54 68 65 73 65 20 76 65 72 69 66 69 63 61 74   These verificat
bc10: 69 6f 6e 73 20 6f 63 63 75 72 73 20 66 6f 72 20  ions occurs for 
bc20: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
bc30: 65 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69 66 28 20  e only */.  if( 
bc40: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
bc50: 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f   & UNIXFILE_NOLO
bc60: 43 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  CK ) return;..  
bc70: 72 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69  rc = osFstat(pFi
bc80: 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  le->h, &buf);.  
bc90: 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
bca0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
bcb0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61  ITE_WARNING, "ca
bcc0: 6e 6e 6f 74 20 66 73 74 61 74 20 64 62 20 66 69  nnot fstat db fi
bcd0: 6c 65 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  le %s", pFile->z
bce0: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
bcf0: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
bd00: 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a  .st_nlink==0 ){.
bd10: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
bd20: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
bd30: 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77  "file unlinked w
bd40: 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20  hile open: %s", 
bd50: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
bd60: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
bd70: 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e   if( buf.st_nlin
bd80: 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  k>1 ){.    sqlit
bd90: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
bda0: 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70 6c 65  RNING, "multiple
bdb0: 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65 3a 20   links to file: 
bdc0: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
bdd0: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
bde0: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61    }.  if( fileHa
bdf0: 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b  sMoved(pFile) ){
be00: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
be10: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
be20: 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77   "file renamed w
be30: 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20  hile open: %s", 
be40: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
be50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d     return;.  }.}
be60: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
be70: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
be80: 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
be90: 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
bea0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
beb0: 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
bec0: 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
bed0: 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
bee0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
bef0: 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
bf00: 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
bf10: 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
bf20: 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
bf30: 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
bf40: 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
bf50: 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
bf60: 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
bf70: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
bf80: 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
bf90: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
bfa0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
bfb0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
bfc0: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
bfd0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
bfe0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
bff0: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
c000: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
c010: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
c020: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
c030: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
c040: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
c050: 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20  ERVEDLOCK; );.. 
c060: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
c070: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
c080: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
c090: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 75  ARED_LOCK );.  u
c0a0: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
c0b0: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
c0c0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
c0d0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
c0e0: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
c0f0: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
c100: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
c110: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
c120: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
c130: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
c140: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
c150: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
c160: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
c170: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
c180: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
c190: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
c1a0: 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f  #ifndef __DJGPP_
c1b0: 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  _.  if( !reserve
c1c0: 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e  d && !pFile->pIn
c1d0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
c1e0: 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  k ){.    struct 
c1f0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
c200: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
c210: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
c220: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
c230: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
c240: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
c250: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
c260: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
c270: 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65  f( osFcntl(pFile
c280: 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
c290: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ock) ){.      rc
c2a0: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
c2b0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
c2c0: 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
c2d0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
c2e0: 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73  rrno);.    } els
c2f0: 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
c300: 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e!=F_UNLCK ){.  
c310: 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
c320: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
c330: 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76  if.  .  unixLeav
c340: 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
c350: 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f  ACE(("TEST WR-LO
c360: 43 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69  CK %d %d %d (uni
c370: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
c380: 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
c390: 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
c3a0: 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
c3b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
c3c0: 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20  ttempt to set a 
c3d0: 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74  system-lock on t
c3e0: 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20  he file pFile.  
c3f0: 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  The lock is .** 
c400: 64 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f  described by pLo
c410: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
c420: 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65   pFile was opene
c430: 64 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f  d read/write fro
c440: 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65  m unix-excl, the
c450: 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a  n the only lock.
c460: 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64  ** ever obtained
c470: 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65   is an exclusive
c480: 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73   lock, and it is
c490: 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c   obtained exactl
c4a0: 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69  y once.** the fi
c4b0: 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63  rst time any loc
c4c0: 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20  k is attempted. 
c4d0: 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
c4e0: 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a  system locking.*
c4f0: 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63  * operations bec
c500: 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63  ome no-ops.  Loc
c510: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20  king operations 
c520: 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74  still happen int
c530: 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f  ernally,.** in o
c540: 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61  rder to coordina
c550: 74 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65  te access betwee
c560: 6e 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62  n separate datab
c570: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
c580: 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70  ** within this p
c590: 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20  rocess, but all 
c5a0: 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c  of that is handl
c5b0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64  ed in memory and
c5c0: 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e   the.** operatin
c5d0: 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f  g system does no
c5e0: 74 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a  t participate..*
c5f0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
c600: 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72  on is a pass-thr
c610: 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f  ough to fcntl(F_
c620: 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20  SETLK) if pFile 
c630: 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20  is using.** any 
c640: 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22  VFS other than "
c650: 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66  unix-excl" or if
c660: 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64   pFile is opened
c670: 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a   on "unix-excl".
c680: 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f  ** and is read-o
c690: 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20  nly..**.** Zero 
c6a0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  is returned if t
c6b0: 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65  he call complete
c6c0: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  s successfully, 
c6d0: 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a  or -1 if a call.
c6e0: 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61  ** to fcntl() fa
c6f0: 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ils. In this cas
c700: 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20  e, errno is set 
c710: 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62  appropriately (b
c720: 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73  y fcntl())..*/.s
c730: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69  tatic int unixFi
c740: 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  leLock(unixFile 
c750: 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66  *pFile, struct f
c760: 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20  lock *pLock){.  
c770: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e  int rc;.  unixIn
c780: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
c790: 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
c7a0: 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
c7b0: 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
c7c0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d  assert( pInode!=
c7d0: 30 20 29 3b 0a 20 20 69 66 28 20 28 70 46 69 6c  0 );.  if( (pFil
c7e0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 28  e->ctrlFlags & (
c7f0: 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 7c 55 4e  UNIXFILE_EXCL|UN
c800: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 29 3d  IXFILE_RDONLY))=
c810: 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 20 29  =UNIXFILE_EXCL )
c820: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  {.    if( pInode
c830: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
c840: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
c850: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
c860: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
c870: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  de->nLock==0 );.
c880: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
c890: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
c8a0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
c8b0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
c8c0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
c8d0: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
c8e0: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
c8f0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
c900: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e        rc = osFcn
c910: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
c920: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
c930: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
c940: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
c950: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
c960: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
c970: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
c980: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c990: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
c9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
c9b0: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
c9c0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
c9d0: 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck);.  }.  retur
c9e0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
c9f0: 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
ca00: 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
ca10: 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
ca20: 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
ca30: 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
ca40: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
ca50: 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
ca60: 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
ca70: 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
ca80: 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
ca90: 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
caa0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
cab0: 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
cac0: 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
cad0: 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
cae0: 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
caf0: 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
cb00: 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
cb10: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
cb20: 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
cb30: 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
cb40: 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
cb50: 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
cb60: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
cb70: 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
cb80: 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
cb90: 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
cba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
cbb0: 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
cbc0: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
cbd0: 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
cbe0: 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
cbf0: 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
cc00: 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
cc10: 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
cc20: 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
cc30: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
cc40: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
cc50: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
cc60: 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
cc70: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
cc80: 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
cc90: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
cca0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
ccb0: 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
ccc0: 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
ccd0: 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
cce0: 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
ccf0: 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
cd00: 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
cd10: 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
cd20: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
cd30: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
cd40: 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ){.  /* The foll
cd50: 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20  owing describes 
cd60: 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
cd70: 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75  on of the variou
cd80: 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a  s locks and.  **
cd90: 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e   lock transition
cda0: 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68  s in terms of th
cdb0: 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  e POSIX advisory
cdc0: 20 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c   shared and excl
cdd0: 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  usive.  ** lock 
cde0: 70 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c  primitives (call
cdf0: 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e  ed read-locks an
ce00: 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65  d write-locks be
ce10: 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20  low, to avoid.  
ce20: 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74  ** confusion wit
ce30: 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61  h SQLite lock na
ce40: 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69  mes). The algori
ce50: 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63  thms are complic
ce60: 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74  ated.  ** slight
ce70: 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62  ly in order to b
ce80: 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74  e compatible wit
ce90: 68 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74  h Windows95 syst
cea0: 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73  ems simultaneous
ceb0: 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e  ly.  ** accessin
cec0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
ced0: 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73  ase file, in cas
cee0: 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72  e that is ever r
cef0: 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20  equired..  **.  
cf00: 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e  ** Symbols defin
cf10: 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e  ed in os.h inden
cf20: 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e  tify the 'pendin
cf30: 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20  g byte' and the 
cf40: 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62  'reserved.  ** b
cf50: 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c  yte', each singl
cf60: 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20  e bytes at well 
cf70: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61  known offsets, a
cf80: 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62  nd the 'shared b
cf90: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c  yte.  ** range',
cfa0: 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20   a range of 510 
cfb0: 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20  bytes at a well 
cfc0: 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20  known offset..  
cfd0: 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69  **.  ** To obtai
cfe0: 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  n a SHARED lock,
cff0: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20   a read-lock is 
d000: 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
d010: 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79  'pending.  ** by
d020: 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73  te'.  If this is
d030: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 27 73 68   successful, 'sh
d040: 61 72 65 64 20 62 79 74 65 20 72 61 6e 67 65 27  ared byte range'
d050: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a   is read-locked.
d060: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63    ** and the loc
d070: 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  k on the 'pendin
d080: 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64  g byte' released
d090: 2e 20 20 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a  .  (Legacy note:
d0a0: 20 20 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69    When.  ** SQLi
d0b0: 74 65 20 77 61 73 20 66 69 72 73 74 20 64 65 76  te was first dev
d0c0: 65 6c 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73 39  eloped, Windows9
d0d0: 35 20 73 79 73 74 65 6d 73 20 77 65 72 65 20 73  5 systems were s
d0e0: 74 69 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e  till very common
d0f0: 2c 0a 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f  ,.  ** and Widno
d100: 77 73 39 35 20 6c 61 63 6b 73 20 61 20 73 68 61  ws95 lacks a sha
d110: 72 65 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c  red-lock capabil
d120: 69 74 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64  ity.  So on Wind
d130: 6f 77 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69  ows95, a.  ** si
d140: 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65  ngle randomly se
d150: 6c 65 63 74 65 64 20 62 79 20 66 72 6f 6d 20 74  lected by from t
d160: 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65 20  he 'shared byte 
d170: 72 61 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65 64  range' is locked
d180: 2e 0a 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35  ..  ** Windows95
d190: 20 69 73 20 6e 6f 77 20 70 72 65 74 74 79 20 6d   is now pretty m
d1a0: 75 63 68 20 65 78 74 69 6e 63 74 2c 20 62 75 74  uch extinct, but
d1b0: 20 74 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e   this work-aroun
d1c0: 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c  d for the.  ** l
d1d0: 61 63 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f  ack of shared-lo
d1e0: 63 6b 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35  cks on Windows95
d1f0: 20 6c 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62   lives on, for b
d200: 61 63 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f  ackwards.  ** co
d210: 6d 70 61 74 69 62 69 6c 69 74 79 2e 29 0a 20 20  mpatibility.).  
d220: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
d230: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
d240: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
d250: 6b 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61  k after it has a
d260: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20   SHARED lock..  
d270: 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f  ** A RESERVED lo
d280: 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  ck is implemente
d290: 64 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20  d by grabbing a 
d2a0: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
d2b0: 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64  e.  ** 'reserved
d2c0: 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20   byte'. .  **.  
d2d0: 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79  ** A process may
d2e0: 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50   only obtain a P
d2f0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65  ENDING lock afte
d300: 72 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65  r it has obtaine
d310: 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20  d a.  ** SHARED 
d320: 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20  lock. A PENDING 
d330: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
d340: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
d350: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20   a write-lock.  
d360: 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ** on the 'pendi
d370: 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65  ng byte'. This e
d380: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e  nsures that no n
d390: 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ew SHARED locks 
d3a0: 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61  can be.  ** obta
d3b0: 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69  ined, but existi
d3c0: 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  ng SHARED locks 
d3d0: 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70  are allowed to p
d3e0: 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73  ersist. A proces
d3f0: 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  s.  ** does not 
d400: 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61  have to obtain a
d410: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
d420: 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50  n the way to a P
d430: 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a  ENDING lock..  *
d440: 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20  * This property 
d450: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61  is used by the a
d460: 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c  lgorithm for rol
d470: 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72  ling back a jour
d480: 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66  nal file.  ** af
d490: 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a  ter a crash..  *
d4a0: 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53  *.  ** An EXCLUS
d4b0: 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e  IVE lock, obtain
d4c0: 65 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49  ed after a PENDI
d4d0: 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c  NG lock is held,
d4e0: 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65   is.  ** impleme
d4f0: 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e  nted by obtainin
d500: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
d510: 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68  n the entire 'sh
d520: 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72  ared byte.  ** r
d530: 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c  ange'. Since all
d540: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71   other locks req
d550: 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b  uire a read-lock
d560: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62   on one of the b
d570: 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e  ytes.  ** within
d580: 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69   this range, thi
d590: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
d5a0: 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72  o other locks ar
d5b0: 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20  e held on the.  
d5c0: 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20  ** database. .  
d5d0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
d5e0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
d5f0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
d600: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
d610: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
d620: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
d630: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
d640: 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  tErrno = 0;..  a
d650: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
d660: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
d670: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
d680: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
d690: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
d6a0: 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  >h,.      azFile
d6b0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
d6c0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
d6d0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
d6e0: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
d6f0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
d700: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65  FileLock), pFile
d710: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
d720: 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69  d,.      osGetpi
d730: 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  d(0)));..  /* If
d740: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
d750: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
d760: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
d770: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
d780: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
d790: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
d7a0: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
d7b0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
d7c0: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
d7d0: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
d7e0: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
d7f0: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
d800: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
d810: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
d820: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
d830: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
d840: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
d850: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
d860: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
d870: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
d880: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d890: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
d8a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
d8b0: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
d8c0: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
d8d0: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
d8e0: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
d8f0: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
d900: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
d910: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
d920: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
d930: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
d940: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
d950: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
d960: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
d970: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
d980: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
d990: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
d9a0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
d9b0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
d9c0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
d9d0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
d9e0: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
d9f0: 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
da00: 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
da10: 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
da20: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
da30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
da40: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
da50: 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
da60: 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
da70: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
da80: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
da90: 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
daa0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
dab0: 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
dac0: 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
dad0: 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
dae0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
daf0: 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
db00: 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
db10: 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
db20: 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
db30: 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
db40: 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
db50: 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
db60: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
db70: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
db80: 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
db90: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
dba0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
dbb0: 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
dbc0: 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
dbd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
dbe0: 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
dbf0: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
dc00: 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
dc10: 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
dc20: 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
dc30: 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
dc40: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
dc50: 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
dc60: 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
dc70: 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
dc80: 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
dc90: 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
dca0: 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
dcb0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
dcc0: 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
dcd0: 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
dce0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
dcf0: 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
dd00: 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
dd10: 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
dd20: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
dd30: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
dd40: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
dd50: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
dd60: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
dd70: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
dd80: 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
dd90: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
dda0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
ddb0: 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
ddc0: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
ddd0: 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
dde0: 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
ddf0: 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
de00: 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
de10: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
de20: 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
de30: 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
de40: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
de50: 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
de60: 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
de70: 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
de80: 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
de90: 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
dea0: 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
deb0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
dec0: 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
ded0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
dee0: 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
def0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
df00: 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
df10: 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
df20: 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
df30: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
df40: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
df50: 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
df60: 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
df70: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
df80: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
df90: 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
dfa0: 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  File, &lock) ){.
dfb0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
dfc0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
dfd0: 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
dfe0: 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
dff0: 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
e000: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
e010: 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
e020: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
e030: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
e040: 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
e050: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
e060: 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
e070: 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
e080: 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
e090: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
e0a0: 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
e0b0: 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
e0c0: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
e0d0: 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
e0e0: 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
e0f0: 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
e100: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
e110: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
e120: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
e130: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
e140: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
e150: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
e160: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
e170: 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
e180: 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
e190: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
e1a0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
e1b0: 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
e1c0: 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
e1d0: 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ZE;.    if( unix
e1e0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
e1f0: 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20  &lock) ){.      
e200: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
e210: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
e220: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
e230: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
e240: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
e250: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
e260: 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
e270: 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
e280: 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  /.    lock.l_sta
e290: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
e2a0: 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
e2b0: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b  n = 1L;.    lock
e2c0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
e2d0: 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  K;.    if( unixF
e2e0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e2f0: 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c  lock) && rc==SQL
e300: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e310: 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
e320: 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
e330: 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
e340: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
e350: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  o;.      rc = SQ
e360: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
e370: 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  K; .    }..    i
e380: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
e390: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
e3a0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
e3b0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
e3c0: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
e3d0: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
e3e0: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65  end_lock;.    }e
e3f0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
e400: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
e410: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
e420: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
e430: 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
e440: 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
e450: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
e460: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
e470: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
e480: 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
e490: 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
e4a0: 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
e4b0: 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
e4c0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
e4d0: 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
e4e0: 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
e4f0: 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
e500: 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
e510: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
e520: 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
e530: 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
e540: 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
e550: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
e560: 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
e570: 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
e580: 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
e590: 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
e5a0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
e5b0: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
e5c0: 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
e5d0: 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
e5e0: 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63  eLock );.    loc
e5f0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
e600: 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  CK;..    assert(
e610: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
e620: 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  RVED_LOCK || eFi
e630: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
e640: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  E_LOCK );.    if
e650: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
e660: 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
e670: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
e680: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
e690: 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
e6a0: 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c  en = 1L;.    }el
e6b0: 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  se{.      lock.l
e6c0: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
e6d0: 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
e6e0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
e6f0: 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _SIZE;.    }..  
e700: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e710: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e720: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
e730: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e740: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e750: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e760: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e770: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
e780: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e790: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
e7a0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
e7b0: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
e7c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e7d0: 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .  ..#ifdef SQLI
e7e0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65  TE_DEBUG.  /* Se
e7f0: 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  t up the transac
e800: 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61  tion-counter cha
e810: 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61  nge checking fla
e820: 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61  gs when.  ** tra
e830: 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20  nsitioning from 
e840: 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45  a SHARED to a RE
e850: 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68  SERVED lock.  Th
e860: 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72  e change.  ** fr
e870: 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53  om SHARED to RES
e880: 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20  ERVED marks the 
e890: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e  beginning of a n
e8a0: 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65  ormal.  ** write
e8b0: 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20   operation (not 
e8c0: 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f  a hot journal ro
e8d0: 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20  llback)..  */.  
e8e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e8f0: 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65  K.   && pFile->e
e900: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
e910: 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c  _LOCK.   && eFil
e920: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e930: 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46  LOCK.  ){.    pF
e940: 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
e950: 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c  ng = 0;.    pFil
e960: 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b  e->dbUpdate = 0;
e970: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
e980: 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20  rmalWrite = 1;. 
e990: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66   }.#endif...  if
e9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e9b0: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
e9c0: 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
e9d0: 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
e9e0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
e9f0: 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
ea00: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
ea10: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
ea20: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
ea30: 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
ea40: 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
ea50: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
ea60: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
ea70: 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  .end_lock:.  uni
ea80: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
ea90: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
eaa0: 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69     %d %s %s (uni
eab0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
eac0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
ead0: 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72  eLock), .      r
eae0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
eaf0: 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
eb00: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
eb10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20  ../*.** Add the 
eb20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
eb30: 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e  used by file han
eb40: 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65  dle pFile to the
eb50: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
eb60: 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  * pUnused list..
eb70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
eb80: 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78  etPendingFd(unix
eb90: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
eba0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
ebb0: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
ebc0: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
ebd0: 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65  sedFd *p = pFile
ebe0: 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
ebf0: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
ec00: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
ec10: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
ec20: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
ec30: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
ec40: 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
ec50: 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a 20  tedUnused = 0;. 
ec60: 20 6e 55 6e 75 73 65 64 46 64 2b 2b 3b 0a 7d 0a   nUnusedFd++;.}.
ec70: 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
ec80: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
ec90: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
eca0: 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
ecb0: 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
ecc0: 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
ecd0: 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
ece0: 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
ecf0: 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
ed00: 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
ed10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
ed20: 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
ed30: 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
ed40: 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
ed50: 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
ed60: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20   is a no-op..** 
ed70: 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53  .** If handleNFS
ed80: 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20  Unlock is true, 
ed90: 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64  then on downgrad
eda0: 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
edb0: 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a  _LOCK to SHARED.
edc0: 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67  ** the byte rang
edd0: 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74  e is divided int
ede0: 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68  o 2 parts and th
edf0: 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20  e first part is 
ee00: 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a  unlocked then.**
ee10: 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c   set to a read l
ee20: 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74  ock, then the ot
ee30: 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70  her part is simp
ee40: 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68  ly unlocked.  Th
ee50: 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f  is works .** aro
ee60: 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44  und a bug in BSD
ee70: 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f   NFS lockd (also
ee80: 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20   seen on MacOSX 
ee90: 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c  10.3+) that fail
eea0: 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20  s to .** remove 
eeb0: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
eec0: 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20  n a region when 
eed0: 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
eee0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
eef0: 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71  t posixUnlock(sq
ef00: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
ef10: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69  int eFileLock, i
ef20: 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  nt handleNFSUnlo
ef30: 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  ck){.  unixFile 
ef40: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ef50: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
ef60: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
ef70: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
ef80: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d  lock;.  int rc =
ef90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
efa0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
efb0: 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
efc0: 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
efd0: 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%d,%d) pid=%d (
efe0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
eff0: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
f000: 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
f010: 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
f020: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
f030: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
f040: 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f  nShared,.      o
f050: 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
f060: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
f070: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
f080: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
f090: 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65  eFileLock<=eFile
f0a0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75  Lock ){.    retu
f0b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
f0c0: 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
f0d0: 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
f0e0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
f0f0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
f100: 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a  ->nShared!=0 );.
f110: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
f120: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
f130: 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
f140: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
f150: 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ock==pFile->eFil
f160: 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66  eLock );..#ifdef
f170: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
f180: 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69    /* When reduci
f190: 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74  ng a lock such t
f1a0: 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73  hat other proces
f1b0: 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20  ses can start.  
f1c0: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
f1d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
f1e0: 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20  gain, make sure 
f1f0: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
f200: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
f210: 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20  ter was updated 
f220: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74  if any part of t
f230: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
f240: 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e  ** file changed.
f250: 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
f260: 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
f270: 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20  not updated,.   
f280: 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63   ** other connec
f290: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d  tions to the sam
f2a0: 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74  e file might not
f2b0: 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20   realize that.  
f2c0: 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61    ** the file ha
f2d0: 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65  s changed and he
f2e0: 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e  nce might not kn
f2f0: 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69  ow to flush thei
f300: 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20  r.    ** cache. 
f310: 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74   The use of a st
f320: 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65  ale cache can le
f330: 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63  ad to database c
f340: 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a  orruption..    *
f350: 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  /.    pFile->inN
f360: 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a  ormalWrite = 0;.
f370: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64  #endif..    /* d
f380: 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20  owngrading to a 
f390: 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e  shared lock on N
f3a0: 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61  FS involves clea
f3b0: 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c  ring the write l
f3c0: 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  ock.    ** befor
f3d0: 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74  e establishing t
f3e0: 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f  he readlock - to
f3f0: 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f   avoid a race co
f400: 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67  ndition we downg
f410: 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  rade.    ** the 
f420: 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73  lock in 2 blocks
f430: 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f  , so that part o
f440: 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c  f the range will
f450: 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61   be covered by a
f460: 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c   .    ** write l
f470: 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65  ock until the re
f480: 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79  st is covered by
f490: 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20   a read lock:.  
f4a0: 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57    **  1:   [WWWW
f4b0: 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20  W].    **  2:   
f4c0: 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20  [....W].    **  
f4d0: 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20  3:   [RRRRW].   
f4e0: 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e   **  4:   [RRRR.
f4f0: 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ].    */.    if(
f500: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
f510: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66 20 21  ED_LOCK ){.#if !
f520: 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
f530: 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e  _) || !SQLITE_EN
f540: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
f550: 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68  LE.      (void)h
f560: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a  andleNFSUnlock;.
f570: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61        assert( ha
f580: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30  ndleNFSUnlock==0
f590: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   );.#endif.#if d
f5a0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
f5b0: 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
f5c0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
f5d0: 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c  .      if( handl
f5e0: 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20  eNFSUnlock ){.  
f5f0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
f600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f610: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
f620: 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65  om system call e
f630: 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20  rrors */.       
f640: 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d   off_t divSize =
f650: 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31   SHARED_SIZE - 1
f660: 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20  ;.        .     
f670: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f680: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
f690: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f6a0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f6b0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f6c0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
f6d0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f6e0: 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
f6f0: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
f700: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f710: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
f720: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
f730: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f740: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
f750: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
f760: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
f770: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
f780: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f790: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
f7a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
f7b0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
f7c0: 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
f7d0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
f7e0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
f7f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f800: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
f810: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f820: 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20  len = divSize;. 
f830: 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46         if( unixF
f840: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
f850: 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  lock)==(-1) ){. 
f860: 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20           tErrno 
f870: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
f880: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
f890: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
f8a0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
f8b0: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a  _IOERR_RDLOCK);.
f8c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53            if( IS
f8d0: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
f8e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
f8f0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
f900: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
f910: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
f920: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
f930: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f940: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
f950: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
f960: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
f970: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f980: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
f990: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
f9a0: 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20  RST+divSize;.   
f9b0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
f9c0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69  = SHARED_SIZE-di
f9d0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
f9e0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f9f0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28  pFile, &lock)==(
fa00: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
fa10: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
fa20: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
fa30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
fa40: 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73  OCK;.          s
fa50: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
fa60: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
fa70: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
fa80: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
fa90: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23   }.      }else.#
faa0: 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
fab0: 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
fac0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
fad0: 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20  KING_STYLE */.  
fae0: 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f      {.        lo
faf0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  ck.l_type = F_RD
fb00: 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
fb10: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
fb20: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
fb30: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
fb40: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
fb50: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
fb60: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
fb70: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
fb80: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
fb90: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ock) ){.        
fba0: 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20    /* In theory, 
fbb0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  the call to unix
fbc0: 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f  FileLock() canno
fbd0: 74 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 61  t fail because a
fbe0: 6e 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20  nother.         
fbf0: 20 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68   ** process is h
fc00: 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70  olding an incomp
fc10: 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20  atible lock. If 
fc20: 69 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20  it does, this . 
fc30: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69           ** indi
fc40: 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20 6f  cates that the o
fc50: 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
fc60: 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  not following th
fc70: 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20  e locking.      
fc80: 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e      ** protocol.
fc90: 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
fca0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
fcb0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65  IOERR_RDLOCK. Re
fcc0: 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20  turning.        
fcd0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
fce0: 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74   would confuse t
fcf0: 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 28  he upper layer (
fd00: 69 6e 20 70 72 61 63 74 69 63 65 20 69 74 20 63  in practice it c
fd10: 61 75 73 65 73 20 0a 20 20 20 20 20 20 20 20 20  auses .         
fd20: 20 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f   ** an assert to
fd30: 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20   fail). */ .    
fd40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fd50: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a  E_IOERR_RDLOCK;.
fd60: 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
fd70: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
fd80: 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
fd90: 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
fda0: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
fdb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c     }.    }.    l
fdc0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
fdd0: 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  NLCK;.    lock.l
fde0: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
fdf0: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
fe00: 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
fe10: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
fe20: 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72  len = 2L;  asser
fe30: 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t( PENDING_BYTE+
fe40: 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45  1==RESERVED_BYTE
fe50: 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78   );.    if( unix
fe60: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
fe70: 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20  &lock)==0 ){.   
fe80: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
fe90: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
fea0: 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  CK;.    }else{. 
feb0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
fec0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
fed0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
fee0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
fef0: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
ff00: 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  d_unlock;.    }.
ff10: 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c    }.  if( eFileL
ff20: 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a  ock==NO_LOCK ){.
ff30: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
ff40: 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
ff50: 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
ff60: 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
ff70: 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
ff80: 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
ff90: 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
ffa0: 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
ffb0: 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
ffc0: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
ffd0: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
ffe0: 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
fff0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
10000 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
10010 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
10020 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63  UNLCK;.      loc
10030 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
10040 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
10050 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b  k.l_start = lock
10060 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20  .l_len = 0L;.   
10070 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
10080 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
10090 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
100a0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
100b0 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
100c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
100d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
100e0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
100f0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
10100 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
10110 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
10120 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
10130 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70  _LOCK;.        p
10140 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
10150 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
10160 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10170 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63   Decrement the c
10180 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67  ount of locks ag
10190 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20  ainst this same 
101a0 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a  file.  When the.
101b0 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61      ** count rea
101c0 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65  ches zero, close
101d0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20   any other file 
101e0 64 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73  descriptors whos
101f0 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77  e close.    ** w
10200 61 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61  as deferred beca
10210 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69  use of outstandi
10220 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f  ng locks..    */
10230 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
10240 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ck--;.    assert
10250 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e  ( pInode->nLock>
10260 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49  =0 );.    if( pI
10270 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29  node->nLock==0 )
10280 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  {.      closePen
10290 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
102a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75      }.  }..end_u
102b0 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  nlock:.  unixLea
102c0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
102d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
102e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
102f0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
10300 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10310 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
10320 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
10330 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10340 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
10350 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
10360 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
10370 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
10380 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
10390 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
103a0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
103b0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
103c0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
103d0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
103e0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
103f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
10400 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10410 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c  atic int unixUnl
10420 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
10430 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
10440 6f 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  ock){.#if SQLITE
10450 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
10460 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10470 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10480 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20  K || ((unixFile 
10490 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74  *)id)->nFetchOut
104a0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
104b0 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
104c0 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
104d0 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  , 0);.}..#if SQL
104e0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
104f0 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75  E>0.static int u
10500 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46  nixMapfile(unixF
10510 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42  ile *pFd, i64 nB
10520 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  yte);.static voi
10530 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
10540 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a  unixFile *pFd);.
10550 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
10560 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66  is function perf
10570 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f  orms the parts o
10580 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c  f the "close fil
10590 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a  e" operation .**
105a0 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
105b0 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20  ocking schemes. 
105c0 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69  It closes the di
105d0 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65  rectory and file
105e0 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20  .** handles, if 
105f0 74 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20  they are valid, 
10600 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65  and sets all fie
10610 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46  lds of the unixF
10620 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
10630 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20   to 0..**.** It 
10640 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61  is *not* necessa
10650 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ry to hold the m
10660 75 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72  utex when this r
10670 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
10680 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57  ,.** even on VxW
10690 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77  orks.  A mutex w
106a0 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20  ill be acquired 
106b0 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68  on VxWorks by th
106c0 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65  e.** vxworksRele
106d0 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74  aseFileId() rout
106e0 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
106f0 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  nt closeUnixFile
10700 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
10710 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
10720 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
10730 65 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54  e*)id;.#if SQLIT
10740 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
10750 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  0.  unixUnmapfil
10760 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66  e(pFile);.#endif
10770 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e  .  if( pFile->h>
10780 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74  =0 ){.    robust
10790 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46  _close(pFile, pF
107a0 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  ile->h, __LINE__
107b0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  );.    pFile->h 
107c0 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53  = -1;.  }.#if OS
107d0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70  _VXWORKS.  if( p
107e0 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20  File->pId ){.   
107f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
10800 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
10810 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20  _DELETE ){.     
10820 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d   osUnlink(pFile-
10830 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  >pId->zCanonical
10840 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Name);.    }.   
10850 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
10860 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64  ileId(pFile->pId
10870 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49  );.    pFile->pI
10880 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  d = 0;.  }.#endi
10890 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
108a0 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f  UNLINK_AFTER_CLO
108b0 53 45 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  SE.  if( pFile->
108c0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
108d0 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
108e0 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c     osUnlink(pFil
108f0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73  e->zPath);.    s
10900 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68  qlite3_free(*(ch
10910 61 72 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61  ar**)&pFile->zPa
10920 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
10930 7a 50 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23  zPath = 0;.  }.#
10940 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28  endif.  OSTRACE(
10950 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e  ("CLOSE   %-3d\n
10960 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20  ", pFile->h));. 
10970 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
10980 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
10990 28 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f  (pFile->pPreallo
109a0 63 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20 20  catedUnused);.  
109b0 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
109c0 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
109d0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
109e0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
109f0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
10a00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
10a10 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
10a20 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
10a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10a40 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
10a50 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
10a60 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69  id;.  verifyDbFi
10a70 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69  le(pFile);.  uni
10a80 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
10a90 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  OCK);.  unixEnte
10aa0 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
10ab0 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20  unixFile.pInode 
10ac0 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
10ad0 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  here. Otherwise,
10ae0 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f   a different clo
10af0 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  se.  ** routine 
10b00 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  (e.g. nolockClos
10b10 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61  e()) would be ca
10b20 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  lled instead..  
10b30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
10b40 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
10b50 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49  k>0 || pFile->pI
10b60 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
10b70 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41  ck==0 );.  if( A
10b80 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e  LWAYS(pFile->pIn
10b90 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70  ode) && pFile->p
10ba0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
10bb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10bc0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
10bd0 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
10be0 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
10bf0 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
10c00 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
10c10 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
10c20 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
10c30 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
10c40 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
10c50 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
10c60 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
10c70 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
10c80 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
10c90 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
10ca0 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
10cb0 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
10cc0 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
10cd0 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ile);.  }.  rele
10ce0 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
10cf0 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  le);.  rc = clos
10d00 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10d10 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
10d20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10d30 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
10d40 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
10d50 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
10d60 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
10d70 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
10d80 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10dd0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
10de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10e20 2a 2a 2a 0a 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 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
10e50 20 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 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
10e80 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
10e90 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
10ea0 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
10eb0 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
10ec0 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
10ed0 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
10ee0 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
10ef0 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
10f00 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
10f10 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
10f20 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
10f30 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
10f40 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
10f50 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
10f60 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
10f70 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
10f80 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
10f90 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
10fa0 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
10fb0 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
10fc0 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
10fd0 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
10fe0 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
10ff0 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
11000 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
11010 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
11020 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
11030 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
11040 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
11050 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
11060 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
11070 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
11080 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
11090 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
110a0 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
110b0 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
110c0 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
110d0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
110e0 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
110f0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
11100 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
11110 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
11120 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
11130 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
11140 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
11150 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
11160 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
11170 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11180 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52  NotUsed, int *pR
11190 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
111a0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
111b0 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
111c0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
111d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
111e0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
111f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
11200 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
11210 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
11220 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
11230 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
11240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11250 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
11260 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
11270 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
11280 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
11290 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
112a0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
112b0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
112c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
112d0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
112e0 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
112f0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
11300 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
11310 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
11320 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
11330 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
11340 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
11350 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
11360 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
11370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11380 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
11390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113d0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11420 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
11430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11440 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
11450 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
11460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11470 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
11480 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
11490 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
114a0 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e 63  ses the existenc
114b0 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  e of separate lo
114c0 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61  ck.** files (rea
114d0 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29  lly a directory)
114e0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
114f0 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
11500 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a  se.  This works.
11510 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74  ** on just about
11520 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
11530 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
11540 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
11550 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
11560 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
11570 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
11580 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
11590 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
115a0 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
115b0 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
115c0 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
115d0 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
115e0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
115f0 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
11600 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
11610 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
11620 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
11630 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
11640 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
11650 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
11660 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
11670 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
11680 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
11690 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
116a0 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
116b0 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
116c0 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
116d0 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
116e0 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
116f0 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
11700 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62  y creating a sub
11710 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65  directory in the
11720 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
11730 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  as.** the databa
11740 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
11750 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
11760 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
11770 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
11780 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   The existence o
11790 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  f a lock directo
117a0 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  ry implies an EX
117b0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
117c0 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b  ll other.** lock
117d0 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
117e0 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
117f0 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
11800 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
11810 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
11820 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
11830 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
11840 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
11850 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
11860 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  * lock directory
11870 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54  ..*/.#define DOT
11880 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f  LOCK_SUFFIX ".lo
11890 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ck"../*.** This 
118a0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
118b0 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
118c0 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
118d0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
118e0 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
118f0 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
11900 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
11910 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
11920 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
11930 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
11940 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
11950 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
11960 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
11970 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
11980 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
11990 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
119a0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
119b0 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
119c0 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65  **.** In dotfile
119d0 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72   locking, either
119e0 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f   a lock exists o
119f0 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20  r it does not.  
11a00 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61  So in this.** va
11a10 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b  riation of Check
11a20 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20  ReservedLock(), 
11a30 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
11a40 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c  to true if any l
11a50 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f  ock.** is held o
11a60 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66  n the file and f
11a70 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65  alse if the file
11a80 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f   is unlocked..*/
11a90 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11aa0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
11ab0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11ac0 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11ad0 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
11ae0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11af0 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
11b00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11b10 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11b20 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
11b30 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
11b40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
11b50 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
11b60 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
11b70 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65 72 76  File );.  reserv
11b80 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 28 63  ed = osAccess((c
11b90 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
11ba0 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11bb0 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41  , 0)==0;.  OSTRA
11bc0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11bd0 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
11be0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11bf0 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
11c00 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11c10 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11c20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11c30 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
11c40 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
11c50 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
11c60 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
11c70 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
11c80 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
11c90 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11ca0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11cb0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11cc0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11cd0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11ce0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11cf0 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11d00 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11d10 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11d20 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11d30 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
11d40 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
11d50 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
11d60 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
11d70 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
11d80 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
11d90 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11da0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11db0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11dc0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11dd0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11de0 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11df0 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11e00 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11e10 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11e20 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11e30 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
11e40 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
11e50 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
11e60 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
11e70 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
11e80 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
11e90 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11ea0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11eb0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11ec0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11ed0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11ee0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11ef0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11f00 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11f10 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11f20 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11f30 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
11f40 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
11f50 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
11f60 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
11f70 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
11f80 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
11f90 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
11fa0 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
11fb0 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11fc0 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11fd0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11fe0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11ff0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
12000 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
12010 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12020 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
12030 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
12040 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
12050 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
12060 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
12070 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
12080 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
12090 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
120a0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
120b0 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
120c0 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
120d0 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
120e0 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
120f0 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
12100 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
12110 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
12120 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
12130 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
12140 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
12150 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
12160 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
12170 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
12180 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
12190 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
121a0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
121b0 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
121c0 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
121d0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
121e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
121f0 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
12200 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
12210 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
12220 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
12230 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
12240 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
12250 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
12260 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
12270 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
12280 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
12290 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
122a0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
122b0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
122c0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
122d0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
122e0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
122f0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12300 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
12310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12320 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
12330 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12340 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
12350 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12360 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
12370 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
12380 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
12390 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
123a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
123b0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
123c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
123d0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
123e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
123f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
12400 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
12410 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
12420 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
12430 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
12440 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
12450 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
12460 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
12470 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
12480 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
12490 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
124a0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
124b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
124c0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
124d0 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
124e0 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
124f0 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
12500 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
12510 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
12520 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
12530 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12540 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
12550 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
12560 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
12570 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
12580 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
12590 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
125a0 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
125b0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
125c0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
125d0 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
125e0 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
125f0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12600 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
12610 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12620 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
12630 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
12640 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
12650 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
12660 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
12670 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
12680 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12690 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
126a0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
126b0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
126c0 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
126d0 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
126e0 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
126f0 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
12700 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
12710 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
12720 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
12730 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
12740 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
12750 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
12760 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
12770 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
12780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
12790 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
127a0 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
127b0 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
127c0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
127d0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
127e0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
127f0 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
12800 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
12810 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
12820 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
12830 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
12840 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e  f( tErrno==ENOEN
12850 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  T ){.      rc = 
12860 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
12870 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
12880 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12890 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
128a0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
128b0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
128c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
128d0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
128e0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
128f0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
12900 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12910 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
12920 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
12930 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
12940 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
12950 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
12960 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
12970 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
12980 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
12990 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
129a0 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
129b0 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f  id!=0 );.  dotlo
129c0 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
129d0 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
129e0 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
129f0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
12a00 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
12a10 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a  File(id);.}./***
12a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
12a30 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
12a40 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
12a50 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
12a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
12a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
12ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b20 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
12b30 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
12b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
12b60 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
12b70 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
12b80 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
12b90 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
12ba0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
12bb0 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
12bc0 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
12bd0 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
12be0 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
12bf0 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
12c00 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
12c10 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
12c20 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
12c30 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
12c40 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
12c50 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
12c60 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
12c70 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
12c80 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
12c90 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
12ca0 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
12cb0 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
12cc0 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
12cd0 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
12ce0 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
12cf0 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
12d00 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
12d10 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
12d20 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
12d30 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
12d40 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
12d50 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
12d60 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c  d off.*/.#if SQL
12d70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
12d80 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
12d90 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
12da0 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
12db0 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
12dc0 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
12dd0 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
12de0 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
12df0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
12e00 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
12e10 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
12e20 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
12e30 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
12e40 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
12e50 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
12e60 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
12e70 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
12e80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12e90 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12ea0 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12eb0 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12ec0 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12ed0 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
12ee0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
12ef0 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
12f00 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
12f10 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
12f20 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
12f30 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
12f40 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
12f50 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
12f60 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
12f70 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
12f80 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
12f90 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12fa0 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
12fb0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
12fc0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12fd0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12fe0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
12ff0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
13000 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
13010 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
13020 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13030 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
13040 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13050 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
13060 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
13070 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
13080 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
13090 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
130a0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
130b0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
130c0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
130d0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
130e0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
130f0 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
13100 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
13110 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
13120 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
13130 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
13140 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
13150 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
13160 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
13170 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
13180 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
13190 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
131a0 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
131b0 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
131c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
131d0 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
131e0 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
131f0 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
13200 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
13210 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
13220 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
13230 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
13240 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
13250 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
13260 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
13270 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
13280 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
13290 20 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c   .        storeL
132a0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
132b0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
132c0 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
132d0 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
132e0 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
132f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
13300 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
13310 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
13320 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
13330 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
13340 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
13350 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
13360 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
13370 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
13380 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
13390 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
133a0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
133b0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
133c0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
133d0 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
133e0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
133f0 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
13400 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66  LOCK %d %d %d (f
13410 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
13420 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
13430 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ));..#ifdef SQLI
13440 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
13450 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
13460 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d  ( (rc & 0xff) ==
13470 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
13480 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
13490 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
134a0 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
134b0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
134c0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
134d0 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
134e0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
134f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13500 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
13510 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
13520 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
13530 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
13540 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
13550 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
13560 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
13570 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
13580 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
13590 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
135a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
135b0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
135c0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
135d0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
135e0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
135f0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
13600 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
13610 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
13620 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
13630 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
13640 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
13650 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
13660 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
13670 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
13680 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
13690 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
136a0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
136b0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
136c0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
136d0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
136e0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
136f0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
13700 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
13710 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
13720 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
13730 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
13740 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
13750 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
13760 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
13770 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
13780 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
13790 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
137a0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
137b0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
137c0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
137d0 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
137e0 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
137f0 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
13800 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
13810 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
13820 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
13830 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
13840 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
13850 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
13860 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
13870 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
13880 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
13890 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
138a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
138b0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
138c0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
138d0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
138e0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
138f0 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
13900 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
13910 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
13920 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
13930 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
13940 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
13950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
13960 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
13970 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
13980 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
13990 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
139a0 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
139b0 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
139c0 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
139d0 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
139e0 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
139f0 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
13a00 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13a10 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
13a20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13a30 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
13a40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13a50 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13a60 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
13a70 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
13a80 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
13a90 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
13aa0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
13ab0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
13ac0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
13ad0 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
13ae0 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
13af0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
13b00 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
13b10 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
13b20 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
13b30 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
13b40 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74  (rc) ){.      st
13b50 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
13b60 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
13b70 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
13b80 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13b90 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13ba0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
13bb0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13bc0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
13bd0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
13be0 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66  K    %d %s %s (f
13bf0 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
13c00 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
13c10 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
13c20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
13c30 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
13c40 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66  ailed"));.#ifdef
13c50 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
13c60 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
13c70 0a 20 20 69 66 28 20 28 72 63 20 26 20 30 78 66  .  if( (rc & 0xf
13c80 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  f) == SQLITE_IOE
13c90 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
13ca0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
13cb0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13cc0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13cd0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
13ce0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
13cf0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
13d00 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
13d10 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
13d20 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
13d30 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
13d40 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
13d50 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
13d60 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
13d70 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
13d80 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
13d90 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
13da0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
13db0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
13dc0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
13dd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13de0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13df0 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
13e00 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13e10 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13e20 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
13e30 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13e40 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61  File*)id;.  .  a
13e50 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
13e60 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
13e70 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
13e80 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c   pid=%d (flock)\
13e90 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
13ea0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
13eb0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13ec0 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
13ed0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
13ee0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
13ef0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13f00 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13f10 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
13f20 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
13f30 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
13f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13f50 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
13f60 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
13f70 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
13f80 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
13f90 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
13fa0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13fb0 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
13fc0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13fd0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
13fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ff0 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
14000 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
14010 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75  k. */.  if( robu
14020 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
14030 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23  h, LOCK_UN) ){.#
14040 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
14050 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
14060 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e  RRORS.    return
14070 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
14080 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
14090 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
140a0 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74  RRORS */.    ret
140b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
140c0 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  _UNLOCK;.  }else
140d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
140e0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
140f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
14100 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
14110 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
14120 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14130 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
14140 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
14150 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
14160 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  );.  flockUnlock
14170 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
14180 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
14190 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
141a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
141b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
141c0 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
141d0 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
141e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
141f0 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
14200 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14220 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
14230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14270 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
14280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
142c0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
142d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
142e0 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
142f0 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
14300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14310 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
14320 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
14330 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
14340 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
14350 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
14360 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
14370 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
14380 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
14390 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
143a0 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
143b0 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
143c0 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
143d0 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
143e0 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
143f0 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
14400 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
14410 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
14420 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
14430 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
14440 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
14450 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
14460 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
14470 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14480 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
14490 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
144a0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
144b0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
144c0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
144d0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
144e0 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
144f0 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
14500 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
14510 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
14520 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
14530 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
14540 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
14550 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
14560 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
14570 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
14580 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
14590 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
145a0 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63  tic int semXChec
145b0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
145c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
145d0 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
145e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
145f0 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
14600 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
14610 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14620 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
14630 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
14640 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14650 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
14660 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
14670 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
14680 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
14690 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
146a0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
146b0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
146c0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
146d0 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
146e0 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
146f0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
14700 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
14710 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
14720 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
14730 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
14740 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
14750 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
14760 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
14770 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
14780 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
14790 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
147a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
147b0 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
147c0 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
147d0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
147e0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
147f0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14800 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
14810 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  LOCK);.        s
14820 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
14830 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
14840 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
14850 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
14860 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
14870 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
14880 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
14890 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
148a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
148b0 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
148c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
148d0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
148e0 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
148f0 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
14900 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
14910 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
14920 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
14930 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
14940 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
14950 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
14960 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
14970 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
14980 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14990 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
149a0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
149b0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
149c0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
149d0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
149e0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
149f0 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
14a00 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
14a10 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
14a20 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
14a30 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
14a40 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
14a50 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
14a60 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
14a70 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
14a80 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14a90 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14aa0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14ab0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14ac0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14ad0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14ae0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14af0 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14b00 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14b10 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14b20 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
14b30 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
14b40 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
14b50 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
14b60 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
14b70 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
14b80 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14b90 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14ba0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14bb0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14bc0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14bd0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14be0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14bf0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14c00 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14c10 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14c20 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
14c30 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
14c40 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
14c50 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
14c60 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
14c70 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
14c80 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
14c90 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
14ca0 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
14cb0 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
14cc0 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
14cd0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
14ce0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
14cf0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
14d00 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
14d10 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
14d20 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
14d30 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
14d40 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
14d50 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
14d60 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
14d70 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
14d80 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14d90 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14da0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14db0 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65   semXLock(sqlite
14dc0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14dd0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14de0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14df0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14e00 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14e10 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14e20 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
14e30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
14e40 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
14e50 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
14e60 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
14e70 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
14e80 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
14e90 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
14ea0 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
14eb0 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
14ec0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
14ed0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14ee0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
14ef0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
14f00 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14f10 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
14f20 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
14f30 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
14f40 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
14f50 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
14f60 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
14f70 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
14f80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
14f90 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14fa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
14fb0 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
14fc0 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
14fd0 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
14fe0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14ff0 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
15000 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
15010 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
15020 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
15030 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
15040 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
15050 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
15060 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
15070 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
15080 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
15090 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
150a0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
150b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
150c0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
150d0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
150e0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
150f0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
15100 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
15110 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
15120 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
15130 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
15140 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
15150 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
15160 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
15170 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
15180 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
15190 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
151a0 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
151b0 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
151c0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
151d0 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
151e0 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
151f0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
15200 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15210 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
15220 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
15230 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
15240 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
15250 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
15260 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
15270 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
15280 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
15290 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
152a0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
152b0 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
152c0 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
152d0 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
152e0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
152f0 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
15300 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
15310 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
15320 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
15330 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
15340 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
15350 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
15360 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
15370 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
15380 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
15390 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
153a0 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
153b0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
153c0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
153d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
153e0 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
153f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
15400 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
15410 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
15420 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
15430 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
15440 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
15450 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
15460 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15470 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
15480 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
15490 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
154a0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
154b0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
154c0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
154d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
154e0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
154f0 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  mXUnlock(id, NO_
15500 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
15510 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
15520 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
15530 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
15540 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
15550 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
15560 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
15570 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
15580 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15590 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
155a0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
155b0 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
155c0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
155d0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
155e0 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
155f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
15600 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
15610 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
15620 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
15690 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
156a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
156e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15700 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
15710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
15730 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
15740 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
15750 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
15760 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
15770 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
15780 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
15790 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
157a0 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
157b0 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
157c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
157d0 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
157e0 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
157f0 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
15800 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
15810 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
15820 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
15830 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
15840 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
15850 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
15860 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
15870 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
15880 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
15890 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
158a0 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
158b0 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
158c0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
158d0 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
158e0 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
158f0 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
15900 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
15910 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
15920 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
15930 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
15940 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
15950 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
15960 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
15970 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
15980 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
15990 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
159a0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
159b0 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
159c0 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
159d0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
159e0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
159f0 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
15a00 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
15a10 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
15a20 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
15a30 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
15a40 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
15a50 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
15a60 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
15a70 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
15a80 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
15a90 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
15aa0 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
15ab0 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
15ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15ae0 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15af0 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15b00 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15b10 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15b20 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
15b30 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
15b40 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
15b50 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
15b60 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
15b70 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
15b80 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
15b90 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
15ba0 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
15bb0 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
15bc0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15bd0 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15be0 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15bf0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15c00 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15c10 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15c20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15c30 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
15c40 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
15c50 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
15c60 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
15c70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
15c80 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
15c90 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
15ca0 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15cb0 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15cc0 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15cd0 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15ce0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15cf0 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15d00 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15d10 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15d20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
15d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
15d40 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
15d50 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
15d60 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
15d70 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
15d80 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
15d90 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15da0 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15db0 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15dc0 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15dd0 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15de0 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15df0 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15e00 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15e10 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15e20 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
15e30 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
15e40 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
15e50 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
15e60 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
15e70 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
15e80 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
15e90 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15ea0 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15eb0 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15ec0 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15ed0 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15ee0 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15ef0 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15f00 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15f10 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15f20 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
15f30 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
15f40 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
15f50 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
15f60 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
15f70 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
15f80 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
15f90 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15fa0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15fb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15fc0 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15fd0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15fe0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15ff0 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
16000 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
16010 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
16020 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
16030 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
16040 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
16050 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
16060 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
16070 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
16080 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
16090 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
160a0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
160b0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
160c0 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
160d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
160e0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
160f0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
16100 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
16110 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
16120 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
16130 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
16140 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
16150 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
16160 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
16170 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
16180 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
16190 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
161a0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
161b0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
161c0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
161d0 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
161e0 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
161f0 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
16200 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
16210 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
16220 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
16230 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
16240 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16250 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
16260 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16270 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
16280 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
16290 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
162a0 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
162b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
162c0 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  text;.  .  Simul
162d0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
162e0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
162f0 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
16300 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
16310 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f  t( pFile );.  co
16320 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
16330 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
16340 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
16350 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
16360 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
16370 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
16380 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16390 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
163a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
163b0 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
163c0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
163d0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
163e0 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
163f0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
16400 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
16410 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
16420 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
16430 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
16440 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
16450 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
16460 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
16470 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
16480 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
16490 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
164a0 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
164b0 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
164c0 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
164d0 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
164e0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
164f0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
16500 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
16510 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
16520 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
16530 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
16540 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
16550 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
16560 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
16570 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
16580 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
16590 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
165a0 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
165b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
165c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
165d0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
165e0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
165f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
16600 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
16610 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
16620 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
16630 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
16640 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
16650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
16660 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
16670 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
16680 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
16690 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
166a0 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
166b0 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
166c0 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
166d0 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
166e0 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
166f0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
16700 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
16710 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
16720 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
16730 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
16740 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
16750 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
16760 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
16770 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
16780 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
16790 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
167a0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
167b0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
167c0 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
167d0 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
167e0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
167f0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
16800 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
16810 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
16820 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
16830 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
16840 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
16850 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
16860 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
16870 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
16880 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
16890 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
168a0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
168b0 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
168c0 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
168d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
168e0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
168f0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
16900 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
16910 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
16920 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
16930 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
16940 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
16950 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
16960 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
16970 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
16980 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
16990 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
169a0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
169b0 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
169c0 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
169d0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
169e0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
169f0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
16a00 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
16a10 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
16a20 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
16a30 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
16a40 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
16a50 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16a60 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
16a70 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16a80 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
16a90 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16aa0 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
16ab0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
16ac0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16ad0 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
16ae0 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
16af0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16b00 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
16b10 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
16b20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16b30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
16b40 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
16b50 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
16b60 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
16b70 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
16b80 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16b90 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
16ba0 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
16bb0 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
16bc0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
16bd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
16be0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
16bf0 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
16c00 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16c10 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
16c20 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
16c30 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
16c40 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
16c50 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
16c60 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
16c70 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
16c80 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
16c90 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
16ca0 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
16cb0 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16cc0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16cd0 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
16ce0 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
16cf0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16d00 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
16d10 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
16d20 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
16d30 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
16d40 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
16d50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16d60 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
16d70 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
16d80 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16d90 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
16da0 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
16db0 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
16dc0 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
16dd0 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
16de0 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
16df0 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16e00 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
16e10 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
16e20 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
16e30 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
16e40 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
16e50 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
16e60 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
16e70 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
16e80 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16e90 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16ea0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16eb0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
16ec0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
16ed0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16ee0 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
16ef0 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16f00 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16f10 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
16f20 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
16f30 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
16f40 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
16f50 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
16f60 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
16f70 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
16f80 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16f90 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
16fa0 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16fb0 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
16fc0 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
16fd0 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
16fe0 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
16ff0 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
17000 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
17010 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
17020 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
17030 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
17040 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
17050 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
17060 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
17070 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
17080 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
17090 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
170a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
170b0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
170c0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
170d0 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
170e0 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
170f0 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
17100 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
17110 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
17120 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
17130 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
17140 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
17150 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
17160 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
17170 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
17180 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
17190 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
171a0 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
171b0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
171c0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
171d0 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
171e0 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
171f0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
17200 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17210 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
17220 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
17230 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17240 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
17250 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
17260 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
17270 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
17280 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
17290 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
172a0 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
172b0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
172c0 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
172d0 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
172e0 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
172f0 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
17300 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
17310 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
17320 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
17330 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
17340 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
17350 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
17360 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
17370 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
17380 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
17390 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
173a0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
173b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
173c0 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
173d0 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
173e0 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
173f0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17400 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17410 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
17420 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
17430 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
17440 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
17450 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17460 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
17470 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
17480 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
17490 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
174a0 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
174b0 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
174c0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
174d0 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
174e0 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
174f0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
17500 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
17510 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
17520 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
17530 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
17540 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
17550 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
17560 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
17570 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
17580 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
17590 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
175a0 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
175b0 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
175c0 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
175d0 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
175e0 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
175f0 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
17600 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
17610 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
17620 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
17630 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
17640 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
17650 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
17660 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
17670 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
17680 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
17690 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
176a0 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
176b0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
176c0 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
176d0 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
176e0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
176f0 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
17700 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
17710 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
17720 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
17730 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
17740 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
17750 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
17760 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
17770 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
17780 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17790 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
177a0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
177b0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
177c0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
177d0 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72  ) ) {.      stor
177e0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
177f0 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20  , lrc1Errno);.  
17800 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
17810 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17820 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
17830 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
17840 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
17850 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
17860 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
17870 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
17880 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
17890 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
178a0 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
178b0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
178c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
178d0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
178e0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
178f0 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
17900 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
17910 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
17920 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
17930 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
17940 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
17950 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
17960 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
17970 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
17980 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
17990 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
179a0 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
179b0 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
179c0 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
179d0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
179e0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
179f0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
17a00 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
17a10 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
17a20 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
17a30 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
17a40 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
17a50 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
17a60 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
17a70 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
17a80 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
17a90 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
17aa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
17ab0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17ac0 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
17ad0 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
17ae0 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
17af0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
17b00 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
17b10 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
17b20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
17b30 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
17b40 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
17b50 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
17b60 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
17b70 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
17b80 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
17b90 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
17ba0 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
17bb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17bc0 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
17bd0 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
17be0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
17bf0 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
17c00 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
17c10 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
17c20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
17c30 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
17c40 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
17c50 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
17c60 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
17c70 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
17c80 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
17c90 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
17ca0 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
17cb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
17cc0 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
17cd0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17ce0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17cf0 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
17d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d10 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
17d20 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
17d30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
17d40 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
17d50 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
17d60 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
17d70 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
17d80 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
17d90 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17da0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17db0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17dc0 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17dd0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17df0 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
17e00 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
17e10 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
17e20 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
17e30 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17e40 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
17e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
17e60 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
17e70 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17e80 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
17e90 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
17ea0 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
17eb0 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
17ec0 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
17ed0 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
17ee0 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
17ef0 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
17f00 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17f10 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
17f20 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45   0xff) == SQLITE
17f30 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64  _IOERR) ? failed
17f40 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20  2 : .           
17f50 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
17f60 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  _LOCK;.         
17f70 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
17f80 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20  ck;.        } . 
17f90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17fa0 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
17fb0 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a   .      }.    }.
17fc0 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29      if( failed )
17fd0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69  {.      rc = fai
17fe0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  led;.    }.  }. 
17ff0 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49   .  if( rc==SQLI
18000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
18010 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18020 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70  eFileLock;.    p
18030 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
18040 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
18050 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c  }else if( eFileL
18060 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ock==EXCLUSIVE_L
18070 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
18080 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
18090 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
180a0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
180b0 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
180c0 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64  ;.  }.  .afp_end
180d0 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
180e0 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
180f0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
18100 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22  d %s %s (afp)\n"
18110 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
18120 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
18130 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d  ), .         rc=
18140 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b  =SQLITE_OK ? "ok
18150 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a  " : "failed"));.
18160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18170 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
18180 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
18190 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
181a0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
181b0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
181c0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
181d0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
181e0 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
181f0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
18200 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
18210 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
18220 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
18230 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
18240 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
18250 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
18260 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
18270 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c  tatic int afpUnl
18280 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
18290 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
182a0 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  ock) {.  int rc 
182b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
182c0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
182d0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
182e0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
182f0 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  *pInode;.  afpLo
18300 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
18310 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
18320 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
18330 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
18340 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53  ext;.  int skipS
18350 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65  hared = 0;.#ifde
18360 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
18370 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68  int h = pFile->h
18380 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
18390 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
183a0 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
183b0 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64   %d %d was %d(%d
183c0 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
183d0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
183e0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
183f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
18400 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
18410 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
18420 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
18430 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
18440 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29       osGetpid(0)
18450 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65  ));..  assert( e
18460 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
18470 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
18480 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
18490 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
184a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
184b0 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e  OK;.  }.  unixEn
184c0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49  terMutex();.  pI
184d0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
184e0 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
184f0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
18500 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
18510 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
18520 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
18530 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
18540 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
18550 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
18560 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18570 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
18580 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
18590 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
185a0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
185b0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
185c0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
185d0 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
185e0 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
185f0 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
18600 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
18610 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
18620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18630 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
18640 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
18650 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
18660 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
18670 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
18680 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
18690 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
186a0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
186b0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
186c0 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
186d0 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
186e0 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
186f0 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
18700 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
18710 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
18720 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
18730 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
18740 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
18750 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
18760 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
18770 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
18780 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
18790 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
187a0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
187b0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
187c0 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
187d0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
187e0 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
187f0 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
18800 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
18810 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
18820 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
18830 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
18840 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
18850 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
18860 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
18870 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18880 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18890 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
188a0 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
188b0 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
188c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
188d0 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
188e0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
188f0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
18900 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
18910 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
18920 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
18930 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
18940 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
18950 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
18960 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
18970 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
18980 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18990 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
189a0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
189b0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
189c0 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
189d0 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
189e0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
189f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18a00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18a10 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
18a20 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
18a30 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18a40 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18a50 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18a60 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
18a70 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
18a80 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18a90 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
18aa0 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
18ab0 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
18ac0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
18ad0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18ae0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18af0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
18b00 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
18b10 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
18b20 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
18b30 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
18b40 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
18b50 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
18b60 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
18b70 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
18b80 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
18b90 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
18ba0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
18bb0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
18bc0 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
18bd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18be0 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
18bf0 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
18c00 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
18c10 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
18c20 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
18c30 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
18c40 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
18c50 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
18c60 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
18c70 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
18c80 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
18c90 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
18ca0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
18cb0 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
18cc0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
18cd0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
18ce0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
18cf0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
18d00 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
18d10 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
18d20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18d30 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
18d40 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18d50 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
18d60 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
18d70 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18d80 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
18d90 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
18da0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
18db0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18dc0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
18dd0 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
18de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
18df0 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
18e00 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
18e10 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
18e20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
18e30 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18e40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18e50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
18e70 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
18e80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
18e90 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
18ea0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
18eb0 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
18ec0 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64         closePend
18ed0 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
18ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
18ef0 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
18f00 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
18f10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
18f20 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18f30 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
18f40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18f50 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26  * Close a file &
18f60 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65   cleanup AFP spe
18f70 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f  cific locking co
18f80 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63  ntext .*/.static
18f90 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71   int afpClose(sq
18fa0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
18fb0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18fc0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
18fd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
18fe0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  xFile*)id;.  ass
18ff0 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
19000 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  afpUnlock(id, NO
19010 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e  _LOCK);.  unixEn
19020 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
19030 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  ( pFile->pInode 
19040 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
19050 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
19060 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
19070 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
19080 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
19090 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
190a0 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
190b0 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
190c0 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
190d0 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
190e0 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
190f0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
19100 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64  to pInode->aPend
19110 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ing.  It will be
19120 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
19130 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a  losed when.    *
19140 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
19150 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
19160 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e  */.    setPendin
19170 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  gFd(pFile);.  }.
19180 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
19190 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c  fo(pFile);.  sql
191a0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
191b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
191c0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
191d0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
191e0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
191f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19200 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
19210 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
19220 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
19230 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
19240 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
19250 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
19260 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
19270 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
19280 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
19290 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
192a0 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
192b0 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
192c0 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
192d0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
192e0 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
192f0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
19300 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
19310 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
19320 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
19330 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
19340 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
19350 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
19360 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
19370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19380 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193d0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
193e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
193f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19420 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19440 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
19450 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
19460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19470 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
19480 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
19490 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
194a0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
194b0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
194c0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
194d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
194e0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
194f0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
19500 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
19510 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
19520 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
19530 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
19540 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
19550 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
19560 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
19570 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
19580 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
19590 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
195a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
195b0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
195c0 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
195d0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
195e0 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
195f0 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c   posixUnlock(id,
19600 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a   eFileLock, 1);.
19610 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
19620 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
19630 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
19640 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
19650 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
19660 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46   above is the NF
19670 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  S lock implement
19680 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
19690 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
196a0 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
196b0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
196c0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
196d0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
196e0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
196f0 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a  able.  .**.*****
19700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19710 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20   End of the NFS 
19720 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
19730 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
19740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
19750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
197a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
197e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
197f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e  ************ Non
19800 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33  -locking sqlite3
19810 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a  _file methods **
19820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
19840 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73  * The next divis
19850 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70  ion contains imp
19860 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72  lementations for
19870 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20   all methods of 
19880 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  the .** sqlite3_
19890 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65  file object othe
198a0 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69  r than the locki
198b0 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65  ng methods.  The
198c0 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68   locking.** meth
198d0 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64  ods were defined
198e0 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62   in divisions ab
198f0 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67  ove (one locking
19900 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64   method per.** d
19910 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65  ivision).  Those
19920 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72   methods that ar
19930 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20  e common to all 
19940 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a  locking modes.**
19950 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65   are gather toge
19960 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64  ther into this d
19970 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a  ivision..*/../*.
19980 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
19990 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20  ffset passed as 
199a0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
199b0 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63  ent, then read c
199c0 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74  nt .** bytes int
199d0 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74  o pBuf. Return t
199e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
199f0 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
19a00 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20  ..**.** NB:  If 
19a10 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50  you define USE_P
19a20 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41  READ or USE_PREA
19a30 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67  D64, then it mig
19a40 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65  ht also.** be ne
19a50 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e  cessary to defin
19a60 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20  e _XOPEN_SOURCE 
19a70 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73  to be 500.  This
19a80 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20   varies from.** 
19a90 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e  one system to an
19aa0 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51  other.  Since SQ
19ab0 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65  Lite does not de
19ac0 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a  fine USE_PREAD.*
19ad0 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79  * in any form by
19ae0 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c   default, we wil
19af0 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f  l not attempt to
19b00 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
19b10 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69  OURCE..** See ti
19b20 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20  ckets #2741 and 
19b30 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  #2681..**.** To 
19b40 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74  avoid stomping t
19b50 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f  he errno value o
19b60 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20  n a failed read 
19b70 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
19b80 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
19b90 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
19ba0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
19bb0 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69  ekAndRead(unixFi
19bc0 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f  le *id, sqlite3_
19bd0 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f  int64 offset, vo
19be0 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
19bf0 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  t){.  int got;. 
19c00 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a   int prior = 0;.
19c10 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53  #if (!defined(US
19c20 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66  E_PREAD) && !def
19c30 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
19c40 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73  )).  i64 newOffs
19c50 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d  et;.#endif.  TIM
19c60 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65  ER_START;.  asse
19c70 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78  rt( cnt==(cnt&0x
19c80 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65  1ffff) );.  asse
19c90 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20  rt( id->h>2 );. 
19ca0 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64   do{.#if defined
19cb0 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20  (USE_PREAD).    
19cc0 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64  got = osPread(id
19cd0 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
19ce0 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
19cf0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
19d00 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
19d10 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19d20 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  D64).    got = o
19d30 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20  sPread64(id->h, 
19d40 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65  pBuf, cnt, offse
19d50 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  t);.    Simulate
19d60 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d  IOError( got = -
19d70 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e  1 );.#else.    n
19d80 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b  ewOffset = lseek
19d90 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20  (id->h, offset, 
19da0 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53  SEEK_SET);.    S
19db0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
19dc0 6e 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20 29  newOffset = -1 )
19dd0 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66  ;.    if( newOff
19de0 73 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73  set<0 ){.      s
19df0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
19e00 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72  nixFile*)id, err
19e10 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
19e20 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
19e30 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
19e40 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
19e50 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
19e60 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
19e70 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
19e80 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
19e90 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
19ea0 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
19eb0 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
19ec0 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
19ed0 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
19ee0 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20  *)id,  errno);. 
19ef0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19f00 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20  }else if( got>0 
19f10 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20  ){.      cnt -= 
19f20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  got;.      offse
19f30 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t += got;.      
19f40 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20  prior += got;.  
19f50 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
19f60 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29  *)(got + (char*)
19f70 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pBuf);.    }.  }
19f80 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a  while( got>0 );.
19f90 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f    TIMER_END;.  O
19fa0 53 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20  STRACE(("READ   
19fb0 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20   %-3d %5d %7lld 
19fc0 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %llu\n",.       
19fd0 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b       id->h, got+
19fe0 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72  prior, offset-pr
19ff0 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53  ior, TIMER_ELAPS
1a000 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67  ED));.  return g
1a010 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a  ot+prior;.}../*.
1a020 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
1a030 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20  m a file into a 
1a040 62 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20  buffer.  Return 
1a050 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c  SQLITE_OK if all
1a060 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72  .** bytes were r
1a070 65 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ead successfully
1a080 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52   and SQLITE_IOER
1a090 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  R if anything go
1a0a0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a  es.** wrong..*/.
1a0b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
1a0c0 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ead(.  sqlite3_f
1a0d0 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64  ile *id, .  void
1a0e0 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61   *pBuf, .  int a
1a0f0 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  mt,.  sqlite3_in
1a100 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20  t64 offset.){.  
1a110 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1a120 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
1a130 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61  ;.  int got;.  a
1a140 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1a150 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30  ssert( offset>=0
1a160 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1a170 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1a180 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1a190 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1a1a0 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1a1b0 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1a1c0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1a1d0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1a1e0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1a1f0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1a200 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1a210 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1a220 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
1a230 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  edUnused==0.    
1a240 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1a250 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1a260 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1a270 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1a280 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1a290 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1a2a0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1a2b0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1a2c0 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72  h of this read r
1a2d0 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
1a2e0 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
1a2f0 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
1a300 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
1a310 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
1a320 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
1a330 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
1a340 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
1a350 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
1a360 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1a370 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1a380 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
1a390 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1a3a0 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a  [offset], amt);.
1a3b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1a3c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1a3d0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
1a3e0 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
1a3f0 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1a400 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66       memcpy(pBuf
1a410 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  , &((u8 *)(pFile
1a420 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1a430 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a  ffset], nCopy);.
1a440 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
1a450 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
1a460 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
1a470 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
1a480 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
1a490 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
1a4a0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
1a4b0 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
1a4c0 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
1a4d0 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
1a4e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1a4f0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
1a500 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
1a510 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
1a520 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
1a530 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
1a540 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
1a550 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74  .  }else{.    st
1a560 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1a570 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74  le, 0);   /* not
1a580 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
1a590 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  */.    /* Unread
1a5a0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
1a5b0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
1a5c0 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
1a5d0 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
1a5e0 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
1a5f0 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
1a600 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a610 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1a620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1a630 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
1a640 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
1a650 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1a660 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
1a670 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
1a680 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
1a690 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
1a6a0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1a6b0 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
1a6c0 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
1a6d0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
1a6e0 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
1a6f0 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
1a700 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
1a710 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
1a720 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
1a730 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
1a740 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
1a750 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1a760 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
1a770 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a790 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1a7a0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1a7b0 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
1a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7d0 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1a7e0 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1a7f0 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1a800 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1a810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1a820 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1a830 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1a840 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1a850 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1a860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1a870 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1a880 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1a890 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a8b0 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1a8c0 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1a8d0 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1a8e0 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1a8f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1a900 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1a910 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1a920 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1a930 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1a940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1a950 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  2 );.  assert( p
1a960 69 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e  iErrno!=0 );.  n
1a970 42 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a  Buf &= 0x1ffff;.
1a980 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a    TIMER_START;..
1a990 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
1a9a0 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20  PREAD).  do{ rc 
1a9b0 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28  = (int)osPwrite(
1a9c0 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20  fd, pBuf, nBuf, 
1a9d0 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72  iOff); }while( r
1a9e0 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1a9f0 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66  NTR );.#elif def
1aa00 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1aa10 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e  ).  do{ rc = (in
1aa20 74 29 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c  t)osPwrite64(fd,
1aa30 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1aa40 66 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  f);}while( rc<0 
1aa50 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29  && errno==EINTR)
1aa60 3b 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20  ;.#else.  do{.  
1aa70 20 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73    i64 iSeek = ls
1aa80 65 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45  eek(fd, iOff, SE
1aa90 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d  EK_SET);.    Sim
1aaa0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53  ulateIOError( iS
1aab0 65 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20  eek = -1 );.    
1aac0 69 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20  if( iSeek<0 ){. 
1aad0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1aae0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1aaf0 0a 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74  .    rc = osWrit
1ab00 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  e(fd, pBuf, nBuf
1ab10 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c  );.  }while( rc<
1ab20 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1ab30 52 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54  R );.#endif..  T
1ab40 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1ab50 41 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d  ACE(("WRITE   %-
1ab60 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1ab70 75 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f  u\n", fd, rc, iO
1ab80 66 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  ff, TIMER_ELAPSE
1ab90 44 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30  D));..  if( rc<0
1aba0 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72   ) *piErrno = er
1abb0 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rno;.  return rc
1abc0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ;.}.../*.** Seek
1abd0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69   to the offset i
1abe0 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65  n id->offset the
1abf0 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73  n read cnt bytes
1ac00 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52   into pBuf..** R
1ac10 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1ac20 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1ac30 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65  ly read.  Update
1ac40 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a   the offset..**.
1ac50 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1ac60 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1ac70 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1ac80 20 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45   write the lastE
1ac90 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
1aca0 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
1acb0 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1acc0 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74   int seekAndWrit
1acd0 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  e(unixFile *id, 
1ace0 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73  i64 offset, cons
1acf0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  t void *pBuf, in
1ad00 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e  t cnt){.  return
1ad10 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
1ad20 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70  id->h, offset, p
1ad30 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c  Buf, cnt, &id->l
1ad40 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f  astErrno);.}.../
1ad50 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20  *.** Write data 
1ad60 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e  from a buffer in
1ad70 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75  to a file.  Retu
1ad80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
1ad90 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f  success.** or so
1ada0 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
1adb0 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ode on failure..
1adc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1add0 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74  ixWrite(.  sqlit
1ade0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
1adf0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1ae00 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20  , .  int amt,.  
1ae10 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
1ae20 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46  fset .){.  unixF
1ae30 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1ae40 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
1ae50 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61  t wrote = 0;.  a
1ae60 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61  ssert( id );.  a
1ae70 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1ae80 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1ae90 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1aea0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1aeb0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1aec0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1aed0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1aee0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1aef0 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1af00 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1af10 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1af20 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50  ssert( pFile->pP
1af30 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
1af40 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1af50 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1af60 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1af70 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1af80 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1af90 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1afa0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1afb0 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1afc0 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1afd0 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1afe0 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1aff0 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
1b000 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1b010 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1b020 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1b030 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
1b040 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1b050 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
1b060 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1b070 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
1b080 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
1b090 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1b0a0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
1b0b0 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
1b0c0 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
1b0d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1b0e0 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1b0f0 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
1b100 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
1b110 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
1b120 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1b130 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
1b140 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
1b150 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
1b160 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1b170 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
1b180 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1b190 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1b1a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
1b1b0 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
1b1c0 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
1b1d0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1b1e0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1b1f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
1b200 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
1b210 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
1b220 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
1b230 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1b240 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1b250 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
1b260 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1b270 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
1b280 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1b290 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
1b2a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1b2b0 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
1b2c0 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
1b2d0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1b2e0 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1b2f0 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
1b300 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1b310 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1b320 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1b330 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1b340 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1b350 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1b360 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1b370 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1b380 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1b390 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1b3a0 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
1b3b0 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1b3c0 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1b3d0 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
1b3e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1b3f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b400 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1b410 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1b420 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1b430 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
1b440 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1b450 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1b460 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
1b470 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1b480 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1b490 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1b4a0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1b4b0 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1b4c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1b4d0 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74   .  while( (wrot
1b4e0 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1b4f0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1b500 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20  pBuf, amt))<amt 
1b510 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20  && wrote>0 ){.  
1b520 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1b530 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1b540 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1b550 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1b560 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1b570 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1b580 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1b590 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1b5a0 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1b5b0 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1b5c0 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f  ;..  if( amt>wro
1b5d0 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  te ){.    if( wr
1b5e0 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1b5f0 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1b600 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1b610 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1b620 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1b630 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1b640 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1b650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b660 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1b670 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f  pFile, 0); /* no
1b680 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1b690 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1b6a0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1b6b0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1b6c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1b6d0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1b6e0 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1b6f0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1b700 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1b710 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1b720 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1b730 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1b740 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1b750 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1b760 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1b770 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1b780 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1b790 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1b7a0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1b7b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1b7c0 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1b7d0 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1b7e0 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1b7f0 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1b800 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1b810 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1b820 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1b830 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1b840 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1b850 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1b860 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1b870 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1b880 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1b890 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1b8a0 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1b8b0 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1b8c0 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44  ync or -DHAVE_FD
1b8d0 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21  ATASYNC.*/.#if !
1b8e0 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1b8f0 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54  c) && !HAVE_FDAT
1b900 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
1b910 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
1b920 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1b930 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1b940 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
1b950 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1b960 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
1b970 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
1b980 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
1b990 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
1b9a0 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
1b9b0 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
1b9c0 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
1b9d0 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
1b9e0 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
1b9f0 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
1ba00 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
1ba10 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
1ba20 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
1ba30 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1ba40 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
1ba50 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
1ba60 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
1ba70 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
1ba80 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
1ba90 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
1baa0 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
1bab0 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
1bac0 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
1bad0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
1bae0 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
1baf0 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
1bb00 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
1bb10 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
1bb20 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
1bb30 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
1bb40 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
1bb50 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
1bb60 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
1bb70 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
1bb80 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
1bb90 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
1bba0 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
1bbb0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1bbc0 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
1bbd0 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
1bbe0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
1bbf0 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
1bc00 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1bc10 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
1bc20 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
1bc30 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
1bc40 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1bc50 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1bc60 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
1bc70 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
1bc80 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
1bc90 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
1bca0 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
1bcb0 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
1bcc0 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
1bcd0 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
1bce0 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
1bcf0 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
1bd00 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
1bd10 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
1bd20 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
1bd30 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
1bd40 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
1bd50 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
1bd60 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
1bd70 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
1bd80 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
1bd90 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
1bda0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1bdb0 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
1bdc0 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
1bdd0 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
1bde0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1bdf0 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
1be00 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
1be10 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
1be20 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
1be30 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
1be40 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
1be50 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
1be60 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1be70 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
1be80 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
1be90 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
1bea0 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
1beb0 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
1bec0 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
1bed0 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
1bee0 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
1bef0 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
1bf00 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
1bf10 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
1bf20 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
1bf30 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
1bf40 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
1bf50 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
1bf60 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
1bf70 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
1bf80 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
1bf90 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
1bfa0 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
1bfb0 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
1bfc0 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
1bfd0 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
1bfe0 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
1bff0 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
1c000 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
1c010 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
1c020 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
1c030 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
1c040 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
1c050 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c060 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
1c070 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1c080 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c090 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1c0a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1c0b0 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
1c0c0 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1c0d0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1c0e0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1c0f0 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
1c100 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1c110 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1c120 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1c130 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
1c140 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
1c150 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
1c160 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
1c170 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
1c180 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
1c190 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
1c1a0 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
1c1b0 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
1c1c0 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
1c1d0 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
1c1e0 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
1c1f0 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c200 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1c210 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
1c220 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1c230 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
1c240 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
1c250 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
1c260 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
1c270 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1c280 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1c290 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1c2a0 6f 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65 61  op.  But go ahea
1c2b0 64 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61 74  d and call fstat
1c2c0 28 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20 74  () to validate t
1c2d0 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  he file.  ** des
1c2e0 63 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e 65  criptor as we ne
1c2f0 65 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20 70  ed a method to p
1c300 72 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72 65  rovoke a failure
1c310 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f 76   during.  ** cov
1c320 65 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a 20  erate testing.. 
1c330 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1c340 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20 20  E_NO_SYNC.  {.  
1c350 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1c360 66 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73  f;.    rc = osFs
1c370 74 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a 20  tat(fd, &buf);. 
1c380 20 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55   }.#elif HAVE_FU
1c390 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1c3a0 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
1c3b0 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46   = osFcntl(fd, F
1c3c0 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a  _FULLFSYNC, 0);.
1c3d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1c3e0 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1c3f0 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1c400 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1c410 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1c420 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1c430 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1c440 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1c450 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1c460 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1c470 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1c480 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1c490 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1c4a0 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1c4b0 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1c4c0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1c4d0 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1c4e0 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1c4f0 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1c500 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1c510 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1c520 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1c530 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1c540 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1c550 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1c560 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1c570 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1c580 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1c590 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1c5a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1c5b0 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1c5c0 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1c5d0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1c5e0 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1c5f0 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1c600 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1c610 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1c620 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1c630 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1c640 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1c650 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1c660 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1c670 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1c680 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1c690 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1c6a0 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1c6b0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1c6c0 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1c6d0 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1c6e0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1c6f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1c700 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1c710 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1c720 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1c730 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1c740 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1c750 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1c760 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1c770 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1c780 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1c790 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c7a0 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1c7b0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1c7c0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1c7d0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1c7e0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1c7f0 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1c800 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1c810 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1c820 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1c830 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1c840 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1c850 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1c860 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1c870 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1c880 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1c890 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1c8a0 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1c8b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1c8c0 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1c8d0 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1c8e0 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1c8f0 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1c900 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1c910 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1c920 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1c930 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1c940 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1c950 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1c960 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1c970 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1c980 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1c990 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1c9a0 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1c9b0 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1c9c0 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1c9d0 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1c9e0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1c9f0 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1ca00 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1ca10 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1ca20 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1ca30 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1ca40 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1ca50 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1ca60 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1ca70 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1ca80 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1ca90 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1caa0 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1cab0 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1cac0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1cad0 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1cae0 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1caf0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1cb00 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1cb10 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1cb20 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1cb30 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1cb40 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1cb50 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1cb60 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1cb70 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1cb80 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1cb90 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1cba0 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1cbb0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1cbc0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1cbd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cbe0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1cbf0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1cc00 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1cc10 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1cc20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1cc30 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1cc40 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1cc50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1cc60 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1cc70 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1cc80 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1cc90 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1cca0 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26 20  rname); ii>0 && 
1ccb0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1ccc0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1ccd0 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1cce0 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1ccf0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
1cd00 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d 27  ( zDirname[0]!='
1cd10 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30 5d  /' ) zDirname[0]
1cd20 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69 72   = '.';.    zDir
1cd30 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d  name[1] = 0;.  }
1cd40 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
1cd50 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f  pen(zDirname, O_
1cd60 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c  RDONLY|O_BINARY,
1cd70 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30   0);.  if( fd>=0
1cd80 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
1cd90 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1cda0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1cdb0 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46 64  me));.  }.  *pFd
1cdc0 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64 3e   = fd;.  if( fd>
1cdd0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1cde0 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20  TE_OK;.  return 
1cdf0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
1ce00 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
1ce10 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72  T, "openDirector
1ce20 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d  y", zDirname);.}
1ce30 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1ce40 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
1ce50 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
1ce60 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
1ce70 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49  to disk..**.** I
1ce80 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68  f dataOnly==0 th
1ce90 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65  en both the file
1cea0 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20   itself and its 
1ceb0 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a  metadata (file.*
1cec0 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74  * size, access t
1ced0 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79  ime, etc) are sy
1cee0 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e  nced.  If dataOn
1cef0 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20  ly!=0 then only 
1cf00 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61  the.** file data
1cf10 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a   is synced..**.*
1cf20 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c  * Under Unix, al
1cf30 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  so make sure tha
1cf40 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  t the directory 
1cf50 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69  entry for the fi
1cf60 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63  le.** has been c
1cf70 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d  reated by fsync-
1cf80 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72  ing the director
1cf90 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
1cfa0 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20  the file..** If 
1cfb0 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69  we do not do thi
1cfc0 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74  s and we encount
1cfd0 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  er a power failu
1cfe0 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72  re, the director
1cff0 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74  y.** entry for t
1d000 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
1d010 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72   not exist after
1d020 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65   we reboot.  The
1d030 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20   next.** SQLite 
1d040 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69  to access the fi
1d050 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77  le will not know
1d060 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
1d070 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73  l exists (becaus
1d080 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f  e.** the directo
1d090 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  ry entry for the
1d0a0 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76   journal was nev
1d0b0 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20  er created) and 
1d0c0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  the transaction.
1d0d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c  ** will not roll
1d0e0 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79   back - possibly
1d0f0 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61   leading to data
1d100 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1d110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1d120 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f  nixSync(sqlite3_
1d130 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c  file *id, int fl
1d140 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ags){.  int rc;.
1d150 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1d160 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1d170 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61  d;..  int isData
1d180 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51  Only = (flags&SQ
1d190 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e  LITE_SYNC_DATAON
1d1a0 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c  LY);.  int isFul
1d1b0 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30  lsync = (flags&0
1d1c0 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1d1d0 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68  C_FULL;..  /* Ch
1d1e0 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  eck that one of 
1d1f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1d200 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70  AL or FULL was p
1d210 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72  assed */.  asser
1d220 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d  t((flags&0x0F)==
1d230 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
1d240 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61  AL.      || (fla
1d250 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1d260 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a  _SYNC_FULL.  );.
1d270 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f  .  /* Unix canno
1d280 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74  t, but some syst
1d290 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ems may return S
1d2a0 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20  QLITE_FULL from 
1d2b0 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20  here. This.  ** 
1d2c0 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20  line is to test 
1d2d0 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f  that doing so do
1d2e0 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79  es not cause any
1d2f0 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a   problems..  */.
1d300 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75    SimulateDiskfu
1d310 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  llError( return 
1d320 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a  SQLITE_FULL );..
1d330 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
1d340 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53  );.  OSTRACE(("S
1d350 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
1d360 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63  pFile->h));.  rc
1d370 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46   = full_fsync(pF
1d380 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79  ile->h, isFullsy
1d390 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b  nc, isDataOnly);
1d3a0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1d3b0 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66  or( rc=1 );.  if
1d3c0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72  ( rc ){.    stor
1d3d0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
1d3e0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1d3f0 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f  turn unixLogErro
1d400 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  r(SQLITE_IOERR_F
1d410 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e  SYNC, "full_fsyn
1d420 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  c", pFile->zPath
1d430 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73  );.  }..  /* Als
1d440 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65  o fsync the dire
1d450 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1d460 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65   the file if the
1d470 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20   DIRSYNC flag.  
1d480 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73  ** is set.  This
1d490 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f   is a one-time o
1d4a0 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79  ccurrence.  Many
1d4b0 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c   systems (exampl
1d4c0 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72  es: AIX).  ** ar
1d4d0 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e  e unable to fsyn
1d4e0 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73  c a directory, s
1d4f0 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20  o ignore errors 
1d500 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20  on the fsync..  
1d510 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1d520 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
1d530 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a  FILE_DIRSYNC ){.
1d540 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20      int dirfd;. 
1d550 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52     OSTRACE(("DIR
1d560 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75  SYNC %s (have_fu
1d570 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73  llfsync=%d fulls
1d580 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c  ync=%d)\n", pFil
1d590 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20  e->zPath,.      
1d5a0 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46        HAVE_FULLF
1d5b0 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63  SYNC, isFullsync
1d5c0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  ));.    rc = osO
1d5d0 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69  penDirectory(pFi
1d5e0 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66  le->zPath, &dirf
1d5f0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
1d600 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d610 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69     full_fsync(di
1d620 72 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  rfd, 0, 0);.    
1d630 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
1d640 46 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c  File, dirfd, __L
1d650 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73  INE__);.    }els
1d660 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1d670 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
1d680 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
1d690 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d6a0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
1d6b0 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
1d6c0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20  XFILE_DIRSYNC;. 
1d6d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d6e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
1d6f0 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
1d700 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
1d710 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
1d720 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
1d730 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1d740 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
1d750 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d760 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1d770 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1d780 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
1d790 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1d7a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d7b0 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
1d7c0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
1d7d0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
1d7e0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
1d7f0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
1d800 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
1d810 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
1d820 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
1d830 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
1d840 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
1d850 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
1d860 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
1d870 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
1d880 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
1d890 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
1d8a0 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
1d8b0 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
1d8c0 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
1d8d0 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
1d8e0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
1d8f0 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
1d900 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1d910 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
1d920 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
1d930 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
1d940 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1d950 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1d960 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1d970 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1d980 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1d990 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1d9a0 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1d9b0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
1d9c0 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
1d9d0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
1d9e0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
1d9f0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
1da00 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1da10 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
1da20 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
1da30 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1da40 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1da50 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1da60 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
1da70 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
1da80 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
1da90 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
1daa0 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
1dab0 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
1dac0 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
1dad0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
1dae0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
1daf0 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
1db00 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
1db10 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
1db20 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
1db30 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
1db40 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
1db50 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
1db60 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1db70 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
1db80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
1db90 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1dba0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  .    }.#endif..#
1dbb0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1dbc0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a  AP_SIZE>0.    /*
1dbd0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
1dbe0 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20   just truncated 
1dbf0 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
1dc00 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
1dc10 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ntly.    ** mapp
1dc20 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
1dc30 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
1dc40 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
1dc50 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
1dc60 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61  l.    ** use rea
1dc70 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
1dc80 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
1dc90 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
1dca0 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a   from now on.  .
1dcb0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1dcc0 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
1dcd0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46  Size ){.      pF
1dce0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
1dcf0 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  nByte;.    }.#en
1dd00 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
1dd10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
1dd20 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
1dd30 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
1dd40 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
1dd50 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
1dd60 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
1dd70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1dd80 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
1dd90 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
1dda0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
1ddb0 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
1ddc0 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e  c = osFstat(((un
1ddd0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
1dde0 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
1ddf0 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
1de00 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
1de10 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1de20 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1de30 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  d, errno);.    r
1de40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1de50 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
1de60 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
1de70 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
1de80 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
1de90 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
1dea0 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
1deb0 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
1dec0 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
1ded0 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
1dee0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
1def0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
1df00 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
1df10 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
1df20 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
1df30 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
1df40 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
1df50 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
1df60 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
1df70 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
1df80 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
1df90 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
1dfa0 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
1dfb0 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
1dfc0 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
1dfd0 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
1dfe0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1dff0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
1e000 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
1e010 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
1e020 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
1e030 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
1e040 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
1e050 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
1e060 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
1e070 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
1e080 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
1e090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
1e0a0 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
1e0b0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
1e0c0 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
1e0d0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
1e0e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
1e0f0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c  o handle the SQL
1e100 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
1e110 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e  INT .** file-con
1e120 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20  trol operation. 
1e130 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74   Enlarge the dat
1e140 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20  abase to nBytes 
1e150 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e  in size.** (roun
1e160 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  ded up to the ne
1e170 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20  xt chunk-size). 
1e180 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1e190 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e   is already.** n
1e1a0 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c  Bytes or larger,
1e1b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e1c0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1e1d0 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a  tic int fcntlSiz
1e1e0 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a  eHint(unixFile *
1e1f0 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65  pFile, i64 nByte
1e200 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
1e210 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
1e220 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20   i64 nSize;     
1e230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e240 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20  * Required file 
1e250 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
1e260 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20  ct stat buf;    
1e270 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
1e280 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e  d to hold return
1e290 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74   values of fstat
1e2a0 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66  () */.   .    if
1e2b0 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  ( osFstat(pFile-
1e2c0 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
1e2d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e2e0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1e2f0 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d    }..    nSize =
1e300 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
1e310 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
1e320 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
1e330 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
1e340 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
1e350 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
1e360 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
1e370 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1e380 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
1e390 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
1e3a0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
1e3b0 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
1e3c0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
1e3d0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
1e3e0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
1e3f0 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
1e400 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
1e410 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
1e420 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
1e430 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
1e440 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
1e450 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
1e460 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
1e470 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
1e480 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
1e490 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
1e4a0 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
1e4b0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
1e4c0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
1e4d0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
1e4e0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
1e4f0 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
1e500 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
1e510 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1e520 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
1e530 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
1e540 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
1e550 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
1e560 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20  it. Write a .   
1e570 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
1e580 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
1e590 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
1e5a0 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69   that falls enti
1e5b0 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69  rely.      ** wi
1e5c0 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
1e5d0 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20  d region. Then, 
1e5e0 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73  if required, a s
1e5f0 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20  ingle byte.     
1e600 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e   ** at offset (n
1e610 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20  Size-1), to set 
1e620 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1e630 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a  file correctly..
1e640 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
1e650 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e   a similar techn
1e660 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65  ique to that use
1e670 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79  d by glibc on sy
1e680 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74  stems.      ** t
1e690 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
1e6a0 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
1e6b0 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  () call..      *
1e6c0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
1e6d0 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
1e6e0 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
1e6f0 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
1e700 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
1e710 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1e720 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1e730 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  bytes written by
1e740 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
1e750 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
1e760 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1e770 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
1e780 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
1e790 0a 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  ..      iWrite =
1e7a0 20 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42   (buf.st_size/nB
1e7b0 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20  lk)*nBlk + nBlk 
1e7c0 2d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  - 1;.      asser
1e7d0 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73  t( iWrite>=buf.s
1e7e0 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  t_size );.      
1e7f0 61 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65  assert( ((iWrite
1e800 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a  +1)%nBlk)==0 );.
1e810 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f        for(/*no-o
1e820 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a  p*/; iWrite<nSiz
1e830 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65  e+nBlk-1; iWrite
1e840 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20  +=nBlk ){.      
1e850 20 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53    if( iWrite>=nS
1e860 69 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e  ize ) iWrite = n
1e870 53 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20  Size - 1;.      
1e880 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41    nWrite = seekA
1e890 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69  ndWrite(pFile, i
1e8a0 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20  Write, "", 1);. 
1e8b0 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74         if( nWrit
1e8c0 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
1e8d0 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1e8e0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1e8f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
1e900 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1e910 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
1e920 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1e930 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1e940 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1e950 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1e960 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e970 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1e980 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1e990 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1e9a0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  e) ){.        st
1e9b0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1e9c0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1e9d0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1e9e0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1e9f0 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1ea00 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1ea10 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1ea20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1ea30 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1ea40 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1ea50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1ea60 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1ea70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ea80 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1ea90 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61  s initially nega
1eaa0 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1eab0 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1eac0 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1ead0 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1eae0 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1eaf0 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1eb00 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1eb10 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1eb20 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1eb30 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1eb40 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1eb50 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1eb60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1eb70 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69   unixModeBit(uni
1eb80 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  xFile *pFile, un
1eb90 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1eba0 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1ebb0 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1ebc0 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1ebd0 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1ebe0 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1ebf0 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1ec00 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1ec10 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1ec20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ec30 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1ec40 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1ec50 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1ec60 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1ec70 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
1ec80 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
1ec90 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a  har *zBuf);../*.
1eca0 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
1ecb0 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
1ecc0 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1ecd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ece0 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
1ecf0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1ed00 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
1ed10 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
1ed20 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1ed30 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
1ed40 74 63 68 28 20 6f 70 20 29 7b 0a 23 69 66 20 64  tch( op ){.#if d
1ed50 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
1ed60 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1ed70 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
1ed80 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
1ed90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1eda0 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d 49  CNTL_BEGIN_ATOMI
1edb0 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
1edc0 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
1edd0 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
1ede0 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49  _IOC_START_ATOMI
1edf0 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  C_WRITE);.      
1ee00 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
1ee10 54 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f 41  TE_IOERR_BEGIN_A
1ee20 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f  TOMIC : SQLITE_O
1ee30 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
1ee40 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
1ee50 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
1ee60 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE: {.      int 
1ee70 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69  rc = osIoctl(pFi
1ee80 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f  le->h, F2FS_IOC_
1ee90 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52  COMMIT_ATOMIC_WR
1eea0 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
1eeb0 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
1eec0 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  OERR_COMMIT_ATOM
1eed0 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  IC : SQLITE_OK;.
1eee0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1eef0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c 4c  QLITE_FCNTL_ROLL
1ef00 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49 54  BACK_ATOMIC_WRIT
1ef10 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  E: {.      int r
1ef20 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69 6c  c = osIoctl(pFil
1ef30 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 41  e->h, F2FS_IOC_A
1ef40 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57 52  BORT_VOLATILE_WR
1ef50 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ITE);.      retu
1ef60 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f 49  rn rc ? SQLITE_I
1ef70 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54  OERR_ROLLBACK_AT
1ef80 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  OMIC : SQLITE_OK
1ef90 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
1efa0 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53  * __linux__ && S
1efb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54  QLITE_ENABLE_BAT
1efc0 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  CH_ATOMIC_WRITE 
1efd0 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  */..    case SQL
1efe0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
1eff0 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
1f000 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1f010 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
1f020 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f030 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1f040 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f050 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
1f060 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1f070 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
1f080 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
1f090 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1f0a0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1f0b0 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
1f0c0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
1f0d0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
1f0e0 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
1f0f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f100 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1f110 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f120 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
1f130 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
1f140 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1f150 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
1f160 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
1f170 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
1f180 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
1f190 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1f1a0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1f1b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1f1c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f1d0 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
1f1e0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
1f1f0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
1f200 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
1f210 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
1f220 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f240 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f250 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
1f260 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
1f270 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
1f280 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
1f290 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
1f2a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f2b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f2c0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f2d0 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
1f2e0 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
1f2f0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
1f300 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
1f310 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
1f320 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1f330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1f340 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1f350 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
1f360 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
1f370 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
1f380 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69  e3_malloc64( pFi
1f390 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
1f3a0 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
1f3b0 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
1f3c0 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e      unixGetTempn
1f3d0 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ame(pFile->pVfs-
1f3e0 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46  >mxPathname, zTF
1f3f0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  ile);.        *(
1f400 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
1f410 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
1f420 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f430 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1f440 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1f450 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20  L_HAS_MOVED: {. 
1f460 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1f470 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28   = fileHasMoved(
1f480 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  pFile);.      re
1f490 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f4a0 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
1f4b0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1f4c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f4d0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
1f4e0 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65  : {.      i64 ne
1f4f0 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29  wLimit = *(i64*)
1f500 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  pArg;.      int 
1f510 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f520 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
1f530 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  it>sqlite3Global
1f540 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b  Config.mxMmap ){
1f550 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
1f560 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
1f570 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a  lConfig.mxMmap;.
1f580 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1f590 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * The value of n
1f5a0 65 77 4c 69 6d 69 74 20 6d 61 79 20 62 65 20 65  ewLimit may be e
1f5b0 76 65 6e 74 75 61 6c 6c 79 20 63 61 73 74 20 74  ventually cast t
1f5c0 6f 20 28 73 69 7a 65 5f 74 29 20 61 6e 64 20 70  o (size_t) and p
1f5d0 61 73 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 74  assed.      ** t
1f5e0 6f 20 6d 6d 61 70 28 29 2e 20 52 65 73 74 72 69  o mmap(). Restri
1f5f0 63 74 20 69 74 73 20 76 61 6c 75 65 20 74 6f 20  ct its value to 
1f600 32 47 42 20 69 66 20 28 73 69 7a 65 5f 74 29 20  2GB if (size_t) 
1f610 69 73 20 6e 6f 74 20 61 74 20 6c 65 61 73 74 20  is not at least 
1f620 61 0a 20 20 20 20 20 20 2a 2a 20 36 34 2d 62 69  a.      ** 64-bi
1f630 74 20 74 79 70 65 2e 20 2a 2f 0a 20 20 20 20 20  t type. */.     
1f640 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 30 20   if( newLimit>0 
1f650 26 26 20 73 69 7a 65 6f 66 28 73 69 7a 65 5f 74  && sizeof(size_t
1f660 29 3c 38 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  )<8 ){.        n
1f670 65 77 4c 69 6d 69 74 20 3d 20 28 6e 65 77 4c 69  ewLimit = (newLi
1f680 6d 69 74 20 26 20 30 78 37 46 46 46 46 46 46 46  mit & 0x7FFFFFFF
1f690 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1f6a0 20 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20    *(i64*)pArg = 
1f6b0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1f6c0 61 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65  ax;.      if( ne
1f6d0 77 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77  wLimit>=0 && new
1f6e0 4c 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d  Limit!=pFile->mm
1f6f0 61 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69  apSizeMax && pFi
1f700 6c 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  le->nFetchOut==0
1f710 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
1f720 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  e->mmapSizeMax =
1f730 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20   newLimit;.     
1f740 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d     if( pFile->mm
1f750 61 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  apSize>0 ){.    
1f760 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
1f770 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ile(pFile);.    
1f780 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d        rc = unixM
1f790 61 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31  apfile(pFile, -1
1f7a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1f7b0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1f7c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  n rc;.    }.#end
1f7d0 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
1f7e0 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68  _DEBUG.    /* Th
1f7f0 65 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68  e pager calls th
1f800 69 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67  is method to sig
1f810 6e 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20  nal that it has 
1f820 64 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f  done.    ** a ro
1f830 6c 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20  llback and that 
1f840 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
1f850 74 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e  therefore unchan
1f860 67 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69  ged and.    ** i
1f870 74 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b  t hence it is OK
1f880 20 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63   for the transac
1f890 74 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e  tion change coun
1f8a0 74 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  ter to be.    **
1f8b0 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20   unchanged..    
1f8c0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1f8d0 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48  TE_FCNTL_DB_UNCH
1f8e0 41 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28  ANGED: {.      (
1f8f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
1f900 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20  dbUpdate = 0;.  
1f910 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f920 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
1f930 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
1f940 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1f950 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
1f960 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
1f970 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  e SQLITE_FCNTL_S
1f980 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
1f990 3a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  :.    case SQLIT
1f9a0 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b  E_FCNTL_GET_LOCK
1f9b0 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
1f9c0 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
1f9d0 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
1f9e0 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
1f9f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
1fa00 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
1fa10 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
1fa20 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
1fa30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1fa40 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
1fa50 0a 2a 2a 20 49 66 20 70 46 64 2d 3e 73 65 63 74  .** If pFd->sect
1fa60 6f 72 53 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65  orSize is non-ze
1fa70 72 6f 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ro when this fun
1fa80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1fa90 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f   it is a.** no-o
1faa0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
1fab0 65 20 76 61 6c 75 65 73 20 6f 66 20 70 46 64 2d  e values of pFd-
1fac0 3e 73 65 63 74 6f 72 53 69 7a 65 20 61 6e 64 20  >sectorSize and 
1fad0 0a 2a 2a 20 70 46 64 2d 3e 64 65 76 69 63 65 43  .** pFd->deviceC
1fae0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 61  haracteristics a
1faf0 72 65 20 73 65 74 20 61 63 63 6f 72 64 69 6e 67  re set according
1fb00 20 74 6f 20 74 68 65 20 66 69 6c 65 2d 73 79 73   to the file-sys
1fb10 74 65 6d 20 0a 2a 2a 20 63 68 61 72 61 63 74 65  tem .** characte
1fb20 72 69 73 74 69 63 73 2e 20 0a 2a 2a 0a 2a 2a 20  ristics. .**.** 
1fb30 54 68 65 72 65 20 61 72 65 20 74 77 6f 20 76 65  There are two ve
1fb40 72 73 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66  rsions of this f
1fb50 75 6e 63 74 69 6f 6e 2e 20 4f 6e 65 20 66 6f 72  unction. One for
1fb60 20 51 4e 58 20 61 6e 64 20 6f 6e 65 20 66 6f 72   QNX and one for
1fb70 20 61 6c 6c 0a 2a 2a 20 6f 74 68 65 72 20 73 79   all.** other sy
1fb80 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65  stems..*/.#ifnde
1fb90 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 73 74 61  f __QNXNTO__.sta
1fba0 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 76 69  tic void setDevi
1fbb0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fbc0 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  s(unixFile *pFd)
1fbd0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  {.  assert( pFd-
1fbe0 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
1fbf0 69 73 74 69 63 73 3d 3d 30 20 7c 7c 20 70 46 64  istics==0 || pFd
1fc00 2d 3e 73 65 63 74 6f 72 53 69 7a 65 21 3d 30 20  ->sectorSize!=0 
1fc10 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 73 65  );.  if( pFd->se
1fc20 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 7b 0a 23  ctorSize==0 ){.#
1fc30 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  if defined(__lin
1fc40 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ux__) && defined
1fc50 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42  (SQLITE_ENABLE_B
1fc60 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
1fc70 45 29 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  E).    int res;.
1fc80 20 20 20 20 75 33 32 20 66 20 3d 20 30 3b 0a 0a      u32 f = 0;..
1fc90 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
1fca0 20 73 75 70 70 6f 72 74 20 66 6f 72 20 46 32 46   support for F2F
1fcb0 53 20 61 74 6f 6d 69 63 20 62 61 74 63 68 20 77  S atomic batch w
1fcc0 72 69 74 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65  rites. */.    re
1fcd0 73 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 64 2d  s = osIoctl(pFd-
1fce0 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f 47 45 54  >h, F2FS_IOC_GET
1fcf0 5f 46 45 41 54 55 52 45 53 2c 20 26 66 29 3b 0a  _FEATURES, &f);.
1fd00 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26      if( res==0 &
1fd10 26 20 28 66 20 26 20 46 32 46 53 5f 46 45 41 54  & (f & F2FS_FEAT
1fd20 55 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  URE_ATOMIC_WRITE
1fd30 29 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  ) ){.      pFd->
1fd40 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
1fd50 73 74 69 63 73 20 3d 20 53 51 4c 49 54 45 5f 49  stics = SQLITE_I
1fd60 4f 43 41 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49  OCAP_BATCH_ATOMI
1fd70 43 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  C;.    }.#endif 
1fd80 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20  /* __linux__ && 
1fd90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
1fda0 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
1fdb0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
1fdc0 74 68 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56  the POWERSAFE_OV
1fdd0 45 52 57 52 49 54 45 20 66 6c 61 67 20 69 66 20  ERWRITE flag if 
1fde0 72 65 71 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20  requested. */.  
1fdf0 20 20 69 66 28 20 70 46 64 2d 3e 63 74 72 6c 46    if( pFd->ctrlF
1fe00 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
1fe10 50 53 4f 57 20 29 7b 0a 20 20 20 20 20 20 70 46  PSOW ){.      pF
1fe20 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  d->deviceCharact
1fe30 65 72 69 73 74 69 63 73 20 7c 3d 20 53 51 4c 49  eristics |= SQLI
1fe40 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
1fe50 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
1fe60 20 20 7d 0a 0a 20 20 20 20 70 46 64 2d 3e 73 65    }..    pFd->se
1fe70 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54  ctorSize = SQLIT
1fe80 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52  E_DEFAULT_SECTOR
1fe90 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  _SIZE;.  }.}.#el
1fea0 73 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  se.#include <sys
1feb0 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e  /dcmd_blk.h>.#in
1fec0 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76  clude <sys/statv
1fed0 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69  fs.h>.static voi
1fee0 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61  d setDeviceChara
1fef0 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46  cteristics(unixF
1ff00 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69  ile *pFile){.  i
1ff10 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
1ff20 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Size == 0 ){.   
1ff30 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20   struct statvfs 
1ff40 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a  fsInfo;.       .
1ff50 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75      /* Set defau
1ff60 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70  lts for non-supp
1ff70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  orted filesystem
1ff80 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  s */.    pFile->
1ff90 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
1ffa0 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
1ffb0 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69  OR_SIZE;.    pFi
1ffc0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
1ffd0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
1ffe0 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28     if( fstatvfs(
1fff0 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66  pFile->h, &fsInf
20000 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
20010 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
20020 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72 63 6d  ..    if( !strcm
20030 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  p(fsInfo.f_baset
20040 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a  ype, "tmp") ) {.
20050 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
20060 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
20070 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
20080 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
20090 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
200a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
200b0 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20  CAP_ATOMIC4K |  
200c0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20       /* All ram 
200d0 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
200e0 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
200f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20100 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
20110 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
20120 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
20130 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
20170 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
20180 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20190 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
201a0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
201b0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
201c0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
201d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
201f0 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
20200 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
20210 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
20220 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
20230 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65  o.f_basetype, "e
20240 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  tfs") ){.      p
20250 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20260 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
20270 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
20280 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20290 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
202a0 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65 72 20  /* etfs cluster 
202b0 73 69 7a 65 20 77 72 69 74 65 73 20 61 72 65 20  size writes are 
202c0 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
202d0 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72    (pFile->sector
202e0 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
202f0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
20300 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53  512) |.        S
20310 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
20320 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
20330 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
20340 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
20350 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20370 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
20380 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
20390 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
203a0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
203b0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
203c0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
203d0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
203e0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
20410 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
20420 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
20430 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
20440 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
20450 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b  type, "qnx6") ){
20460 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
20470 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
20480 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
20490 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
204a0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
204b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
204c0 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20  OCAP_ATOMIC |   
204d0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c        /* All fil
204e0 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
204f0 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
20500 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
20510 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
20520 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
20530 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
20540 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
20550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20570 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
20580 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
20590 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
205a0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
205b0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
205c0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
205d0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
205e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
205f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20600 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
20610 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
20620 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
20630 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
20640 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78  f_basetype, "qnx
20650 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  4") ){.      pFi
20660 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
20670 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
20680 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
20690 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
206a0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
206b0 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20   full bitset of 
206c0 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78  atomics from max
206d0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64   sector size and
206e0 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
206f0 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63      ((pFile->sec
20700 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
20710 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
20720 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20  MIC512) << 1) - 
20730 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  2 |.        SQLI
20740 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
20750 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65  IAL |     /* The
20760 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
20770 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68  has no write beh
20780 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ind.            
20790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
207a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20            ** so 
207b0 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f  it is ordered */
207c0 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
207d0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72  }else if( strstr
207e0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
207f0 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20  pe, "dos") ){.  
20800 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
20810 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
20820 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
20830 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
20840 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
20850 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
20860 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
20870 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
20880 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
20890 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
208a0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
208b0 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
208c0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
208d0 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
208e0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
208f0 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
20900 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
20910 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
20920 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20950 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
20960 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
20970 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
20980 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
20990 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
209a0 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
209b0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
209c0 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63  2 |      /* bloc
209d0 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  ks are atomic */
209e0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
209f0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
20a00 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
20a10 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
20a20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
20a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a50 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
20a60 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
20a70 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a         0;.    }.
20a80 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68    }.  /* Last ch
20a90 61 6e 63 65 20 76 65 72 69 66 69 63 61 74 69 6f  ance verificatio
20aa0 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 74 6f  n.  If the secto
20ab0 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d  r size isn't a m
20ac0 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20  ultiple of 512. 
20ad0 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27   ** then it isn'
20ae0 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28  t valid.*/.  if(
20af0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
20b00 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b  ze % 512 != 0 ){
20b10 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
20b20 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20b30 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  s = 0;.    pFile
20b40 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53  ->sectorSize = S
20b50 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45  QLITE_DEFAULT_SE
20b60 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d  CTOR_SIZE;.  }.}
20b70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
20b80 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
20b90 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
20ba0 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
20bb0 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
20bc0 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
20bd0 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
20be0 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
20bf0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
20c00 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
20c10 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
20c20 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
20c30 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
20c40 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
20c50 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
20c60 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
20c70 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
20c80 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
20c90 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
20ca0 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
20cb0 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
20cc0 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
20cd0 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
20ce0 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
20cf0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
20d00 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  both..*/.static 
20d10 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
20d20 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
20d30 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
20d40 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
20d50 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69  e*)id;.  setDevi
20d60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20d70 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e  s(pFd);.  return
20d80 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
20d90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20da0 6e 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61  n the device cha
20db0 72 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72  racteristics for
20dc0 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
20dd0 20 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74   This VFS is set
20de0 20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51   up to return SQ
20df0 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52  LITE_IOCAP_POWER
20e00 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62  SAFE_OVERWRITE b
20e10 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f  y default..** Ho
20e20 77 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69  wever, that choi
20e30 63 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73  ce is controvers
20e40 69 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69  ial since techni
20e50 63 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c  cally the underl
20e60 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73  ying.** file sys
20e70 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77  tem does not alw
20e80 61 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65  ays provide powe
20e90 72 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73  rsafe overwrites
20ea0 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20  .  (In other.** 
20eb0 77 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70  words, after a p
20ec0 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c  ower-loss event,
20ed0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69   parts of the fi
20ee0 6c 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76  le that were nev
20ef0 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69  er.** written mi
20f00 67 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67  ght end up being
20f10 20 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65   altered.)  Howe
20f20 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65  ver, non-PSOW be
20f30 68 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a  havior is very,.
20f40 2a 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41  ** very rare.  A
20f50 6e 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f  nd asserting PSO
20f60 57 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20  W makes a large 
20f70 72 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  reduction in the
20f80 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65   amount.** of re
20f90 71 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a  quired I/O for j
20fa0 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65  ournaling, since
20fb0 20 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e   a lot of paddin
20fc0 67 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e  g is eliminated.
20fd0 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c  .**  Hence, whil
20fe0 65 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  e POWERSAFE_OVER
20ff0 57 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64  WRITE is on by d
21000 65 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73  efault, there is
21010 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a   a file-control.
21020 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  ** available to 
21030 74 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20  turn it off and 
21040 55 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65  URI query parame
21050 74 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f  ter available to
21060 20 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f   turn it off..*/
21070 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
21080 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
21090 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69  stics(sqlite3_fi
210a0 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
210b0 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
210c0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 74 44  File*)id;.  setD
210d0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
210e0 74 69 63 73 28 70 46 64 29 3b 0a 20 20 72 65 74  tics(pFd);.  ret
210f0 75 72 6e 20 70 46 64 2d 3e 64 65 76 69 63 65 43  urn pFd->deviceC
21100 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a  haracteristics;.
21110 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
21120 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
21130 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
21140 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a  MAP_SIZE>0../*.*
21150 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73  * Return the sys
21160 74 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  tem page size..*
21170 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
21180 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  on should not be
21190 20 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79   called directly
211a0 20 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69   by other code i
211b0 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a  n this file. .**
211c0 20 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f   Instead, it sho
211d0 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69  uld be called vi
211e0 61 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67  a macro osGetpag
211f0 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  esize()..*/.stat
21200 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61  ic int unixGetpa
21210 67 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69  gesize(void){.#i
21220 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72  f OS_VXWORKS.  r
21230 65 74 75 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69  eturn 1024;.#eli
21240 66 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53  f defined(_BSD_S
21250 4f 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20  OURCE).  return 
21260 67 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23  getpagesize();.#
21270 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69  else.  return (i
21280 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50  nt)sysconf(_SC_P
21290 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66  AGESIZE);.#endif
212a0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  .}..#endif /* !d
212b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
212c0 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
212d0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
212e0 30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  0 */..#ifndef SQ
212f0 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f  LITE_OMIT_WAL../
21300 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64  *.** Object used
21310 20 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e   to represent an
21320 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62   shared memory b
21330 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  uffer.  .**.** W
21340 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72  hen multiple thr
21350 65 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e  eads all referen
21360 63 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d  ce the same wal-
21370 69 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65  index, each thre
21380 61 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77  ad.** has its ow
21390 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  n unixShm object
213a0 2c 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70  , but they all p
213b0 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65  oint to a single
213c0 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20   instance.** of 
213d0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
213e0 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68   object.  In oth
213f0 65 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77  er words, each w
21400 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e  al-index is open
21410 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20  ed.** only once 
21420 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  per process..**.
21430 2a 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e  ** Each unixShmN
21440 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f  ode object is co
21450 6e 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e  nnected to a sin
21460 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  gle unixInodeInf
21470 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20  o object..** We 
21480 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74  could coalesce t
21490 68 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  his object into 
214a0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62  unixInodeInfo, b
214b0 75 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65  ut that would me
214c0 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e  an.** every open
214d0 20 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20   file that does 
214e0 6e 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d  not use shared m
214f0 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20  emory (in other 
21500 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f  words, most.** o
21510 70 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64  pen files) would
21520 20 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61   have to carry a
21530 72 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61  round this extra
21540 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53   information.  S
21550 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f  o.** the unixIno
21560 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f  deInfo object co
21570 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
21580 20 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d   to this unixShm
21590 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61  Node object.** a
215a0 6e 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  nd the unixShmNo
215b0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65  de object is cre
215c0 61 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e  ated only when n
215d0 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69  eeded..**.** uni
215e0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73  xMutexHeld() mus
215f0 74 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63  t be true when c
21600 72 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72  reating or destr
21610 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62  oying.** this ob
21620 6a 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65  ject or while re
21630 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
21640 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   the following f
21650 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  ields:.**.**    
21660 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65    nRef.**.** The
21670 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
21680 73 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  s are read-only 
21690 61 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74  after the object
216a0 20 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20   is created:.** 
216b0 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20  .**      fid.** 
216c0 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a       zFilename.*
216d0 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78  *.** Either unix
216e0 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75  ShmNode.mutex mu
216f0 73 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e  st be held or un
21700 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d  ixShmNode.nRef==
21710 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74  0 and.** unixMut
21720 65 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65  exHeld() is true
21730 20 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72   when reading or
21740 20 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68   writing any oth
21750 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74  er field.** in t
21760 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  his structure..*
21770 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  /.struct unixShm
21780 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f  Node {.  unixIno
21790 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
217a0 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65      /* unixInode
217b0 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74  Info that owns t
217c0 68 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a  his SHM node */.
217d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
217e0 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20  *mutex;      /* 
217f0 4d 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20  Mutex to access 
21800 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  this object */. 
21810 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
21820 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
21830 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70  ame of the mmapp
21840 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
21850 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
21860 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
21870 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
21880 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
21890 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
218a0 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65  /* Size of share
218b0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
218c0 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f   */.  u16 nRegio
218d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
218e0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61   /* Size of arra
218f0 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  y apRegion */.  
21900 75 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20  u8 isReadonly;  
21910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21920 75 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20  ue if read-only 
21930 2a 2f 0a 20 20 75 38 20 69 73 55 6e 6c 6f 63 6b  */.  u8 isUnlock
21940 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
21950 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 44 4d  /* True if no DM
21960 53 20 6c 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 20  S lock held */. 
21970 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e   char **apRegion
21980 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
21990 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73  rray of mapped s
219a0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
219b0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
219c0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
219d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
219e0 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  f unixShm object
219f0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
21a00 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  is */.  unixShm 
21a10 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
21a20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68     /* All unixSh
21a30 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
21a40 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69  ng to this */.#i
21a50 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21a60 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b  G.  u8 exclMask;
21a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21a80 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
21a90 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
21aa0 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73  /.  u8 sharedMas
21ab0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
21ac0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
21ad0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
21ae0 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
21af0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21b00 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e  ext available un
21b10 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  ixShm.id value *
21b20 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
21b30 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
21b40 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
21b50 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
21b60 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
21b70 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
21b80 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
21b90 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
21ba0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
21bb0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
21bc0 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
21bd0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
21be0 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
21bf0 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
21c00 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46  **    unixShm.pF
21c10 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  ile.**    unixSh
21c20 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
21c30 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
21c40 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
21c50 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e   unixShm.pFile->
21c60 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
21c70 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
21c80 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
21c90 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
21ca0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
21cb0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
21cc0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a  pShmNode;     /*
21cd0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
21ce0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
21cf0 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
21d00 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
21d10 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
21d20 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
21d30 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
21d40 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
21d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21d60 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
21d70 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
21d80 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64  mutex */.  u8 id
21d90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
21da0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
21db0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
21dc0 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
21dd0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73  mNode */.  u16 s
21de0 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
21df0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
21e00 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
21e10 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
21e20 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
21e30 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
21e40 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
21e50 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ld */.};../*.** 
21e60 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
21e70 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
21e80 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
21e90 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
21ea0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
21eb0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
21ec0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
21ed0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44  efine UNIX_SHM_D
21ee0 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f  MS    (UNIX_SHM_
21ef0 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
21f00 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
21f10 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
21f20 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
21f30 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
21f40 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f  or all bytes fro
21f50 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f  m ofst through o
21f60 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c  fst+n-1..**.** L
21f70 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68  ocks block if th
21f80 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c  e mask is exactl
21f90 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64  y UNIX_SHM_C and
21fa0 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e   are non-blockin
21fb0 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  g.** otherwise..
21fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
21fd0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
21fe0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
21ff0 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  le,       /* Ope
22000 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  n connection to 
22010 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
22020 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
22030 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
22040 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
22050 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
22060 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
22070 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
22080 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
22090 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
220a0 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
220b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
220c0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
220d0 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  /.){.  unixShmNo
220e0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
220f0 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
22100 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
22110 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
22120 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  */.  struct floc
22130 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  k f;        /* T
22140 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
22150 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  y locking struct
22160 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ure */.  int rc 
22170 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
22180 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
22190 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
221a0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
221b0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
221c0 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
221d0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
221e0 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20  r */.  pShmNode 
221f0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
22200 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
22210 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
22220 52 65 66 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  Ref==0 || sqlite
22230 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 53 68  3_mutex_held(pSh
22240 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b  mNode->mutex) );
22250 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
22260 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
22270 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
22280 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
22290 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
222a0 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
222b0 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
222c0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
222d0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
222e0 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
222f0 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  K );..  if( pShm
22300 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
22310 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
22320 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61  the locking para
22330 6d 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65  meters */.    me
22340 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65  mset(&f, 0, size
22350 6f 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f  of(f));.    f.l_
22360 74 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b  type = lockType;
22370 0a 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20  .    f.l_whence 
22380 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
22390 66 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74  f.l_start = ofst
223a0 3b 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20  ;.    f.l_len = 
223b0 6e 3b 0a 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  n;..    rc = osF
223c0 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
223d0 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 66 29 3b 0a  , F_SETLK, &f);.
223e0 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d      rc = (rc!=(-
223f0 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
22400 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
22410 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
22420 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20  the global lock 
22430 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65 62  state and do deb
22440 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69  ug tracing */.#i
22450 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
22460 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a  G.  { u16 mask;.
22470 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
22480 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b  LOCK "));.  mask
22490 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78 66   = ofst>31 ? 0xf
224a0 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b  fff : (1<<(ofst+
224b0 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
224c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
224d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
224e0 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
224f0 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
22500 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f  CE(("unlock %d o
22510 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
22520 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
22530 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
22540 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
22550 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61  haredMask &= ~ma
22560 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  sk;.    }else if
22570 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44  ( lockType==F_RD
22580 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  LCK ){.      OST
22590 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b  RACE(("read-lock
225a0 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
225b0 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
225c0 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
225d0 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
225e0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c  de->sharedMask |
225f0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73  = mask;.    }els
22600 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
22610 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
22620 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
22630 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
22640 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b   %d ok", ofst));
22650 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
22660 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73  >exclMask |= mas
22670 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  k;.      pShmNod
22680 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  e->sharedMask &=
22690 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20   ~mask;.    }.  
226a0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6c  }else{.    if( l
226b0 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b  ockType==F_UNLCK
226c0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
226d0 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61  E(("unlock %d fa
226e0 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
226f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
22700 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
22710 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
22720 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c  ("read-lock fail
22730 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ed"));.    }else
22740 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
22750 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43  lockType==F_WRLC
22760 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41  K );.      OSTRA
22770 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20  CE(("write-lock 
22780 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73 74  %d failed", ofst
22790 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ));.    }.  }.  
227a0 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66 74  OSTRACE((" - aft
227b0 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30 33  erwards %03x,%03
227c0 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
227d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
227e0 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d  dMask, pShmNode-
227f0 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d  >exclMask));.  }
22800 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
22810 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a  n rc;        .}.
22820 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22830 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72  e minimum number
22840 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65 67   of 32KB shm reg
22850 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c 64  ions that should
22860 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a   be mapped at.**
22870 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e   a time, assumin
22880 67 20 74 68 61 74 20 65 61 63 68 20 6d 61 70 70  g that each mapp
22890 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20 69  ing must be an i
228a0 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65 20  nteger multiple 
228b0 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
228c0 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73 69  t system page-si
228d0 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c  ze..**.** Usuall
228e0 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54 68  y, this is 1. Th
228f0 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65 6d  e exception seem
22900 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73 20  s to be systems 
22910 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67 75  that are configu
22920 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34  red.** to use 64
22930 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74 68  KB pages - in th
22940 69 73 20 63 61 73 65 20 65 61 63 68 20 6d 61 70  is case each map
22950 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72 20  ping must cover 
22960 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20  at least two.** 
22970 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a  shm regions..*/.
22980 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
22990 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 76  hmRegionPerMap(v
229a0 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73  oid){.  int shms
229b0 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20 20  z = 32*1024;    
229c0 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20 72          /* SHM r
229d0 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20  egion size */.  
229e0 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65 74  int pgsz = osGet
229f0 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a  pagesize();   /*
22a00 20 53 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   System page siz
22a10 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  e */.  assert( (
22a20 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d  (pgsz-1)&pgsz)==
22a30 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20 73  0 );   /* Page s
22a40 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f  ize must be a po
22a50 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66  wer of 2 */.  if
22a60 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72  ( pgsz<shmsz ) r
22a70 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
22a80 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a  n pgsz/shmsz;.}.
22a90 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65  ./*.** Purge the
22aa0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74   unixShmNodeList
22ab0 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74   list of all ent
22ac0 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53 68  ries with unixSh
22ad0 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a  mNode.nRef==0..*
22ae0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
22af0 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65   a VFS shared-me
22b00 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20  mory method; it 
22b10 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e  is a utility fun
22b20 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20  ction called.** 
22b30 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65  by VFS shared-me
22b40 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f  mory methods..*/
22b50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
22b60 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46 69  xShmPurge(unixFi
22b70 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78  le *pFd){.  unix
22b80 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64  ShmNode *p = pFd
22b90 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
22ba0 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
22bb0 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
22bc0 0a 20 20 69 66 28 20 70 20 26 26 20 41 4c 57 41  .  if( p && ALWA
22bd0 59 53 28 70 2d 3e 6e 52 65 66 3d 3d 30 29 20 29  YS(p->nRef==0) )
22be0 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65  {.    int nShmPe
22bf0 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65  rMap = unixShmRe
22c00 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20  gionPerMap();.  
22c10 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
22c20 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d  ert( p->pInode==
22c30 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  pFd->pInode );. 
22c40 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
22c50 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
22c60 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
22c70 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e  p->nRegion; i+=n
22c80 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20  ShmPerMap){.    
22c90 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
22ca0 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  .        osMunma
22cb0 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  p(p->apRegion[i]
22cc0 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a  , p->szRegion);.
22cd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22ce0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
22cf0 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  e(p->apRegion[i]
22d00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22d10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22d20 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a  e(p->apRegion);.
22d30 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
22d40 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
22d50 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c  close(pFd, p->h,
22d60 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
22d70 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20    p->h = -1;.   
22d80 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65   }.    p->pInode
22d90 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a  ->pShmNode = 0;.
22da0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22db0 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  (p);.  }.}../*.*
22dc0 2a 20 54 68 65 20 44 4d 53 20 6c 6f 63 6b 20 68  * The DMS lock h
22dd0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
22de0 74 61 6b 65 6e 20 6f 6e 20 73 68 6d 20 66 69 6c  taken on shm fil
22df0 65 20 70 53 68 6d 4e 6f 64 65 2e 20 41 74 74 65  e pShmNode. Atte
22e00 6d 70 74 20 74 6f 0a 2a 2a 20 74 61 6b 65 20 69  mpt to.** take i
22e10 74 20 6e 6f 77 2e 20 52 65 74 75 72 6e 20 53 51  t now. Return SQ
22e20 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
22e30 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c  ssful, or an SQL
22e40 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
22e50 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a  e otherwise..**.
22e60 2a 2a 20 49 66 20 74 68 65 20 44 4d 53 20 63 61  ** If the DMS ca
22e70 6e 6e 6f 74 20 62 65 20 6c 6f 63 6b 65 64 20 62  nnot be locked b
22e80 65 63 61 75 73 65 20 74 68 69 73 20 69 73 20 61  ecause this is a
22e90 20 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 3d 31 20   readonly_shm=1 
22ea0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  .** connection a
22eb0 6e 64 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63  nd no other proc
22ec0 65 73 73 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ess already hold
22ed0 73 20 61 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e  s a lock, return
22ee0 0a 2a 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  .** SQLITE_READO
22ef0 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 61 6e 64  NLY_CANTINIT and
22f00 20 73 65 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   set pShmNode->i
22f10 73 55 6e 6c 6f 63 6b 65 64 3d 31 2e 0a 2a 2f 0a  sUnlocked=1..*/.
22f20 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
22f30 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  ockSharedMemory(
22f40 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 2c  unixFile *pDbFd,
22f50 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
22f60 68 6d 4e 6f 64 65 29 7b 0a 20 20 73 74 72 75 63  hmNode){.  struc
22f70 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
22f80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22f90 4f 4b 3b 0a 0a 20 20 2f 2a 20 55 73 65 20 46 5f  OK;..  /* Use F_
22fa0 47 45 54 4c 4b 20 74 6f 20 64 65 74 65 72 6d 69  GETLK to determi
22fb0 6e 65 20 74 68 65 20 6c 6f 63 6b 73 20 6f 74 68  ne the locks oth
22fc0 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65  er processes are
22fd0 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 6f 6e   holding.  ** on
22fe0 20 74 68 65 20 44 4d 53 20 62 79 74 65 2e 20 49   the DMS byte. I
22ff0 66 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 74  f it indicates t
23000 68 61 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  hat another proc
23010 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 0a 20  ess is holding. 
23020 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
23030 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f  k, then this pro
23040 63 65 73 73 20 6d 61 79 20 61 6c 73 6f 20 74 61  cess may also ta
23050 6b 65 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ke a SHARED lock
23060 0a 20 20 2a 2a 20 61 6e 64 20 70 72 6f 63 65 65  .  ** and procee
23070 64 20 77 69 74 68 20 6f 70 65 6e 69 6e 67 20 74  d with opening t
23080 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2e 20 0a  he *-shm file. .
23090 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66    **.  ** Or, if
230a0 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
230b0 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 79  s is holding any
230c0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 69 73   lock, then this
230d0 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73   process.  ** is
230e0 20 74 68 65 20 66 69 72 73 74 20 74 6f 20 6f 70   the first to op
230f0 65 6e 20 69 74 2e 20 49 6e 20 74 68 69 73 20 63  en it. In this c
23100 61 73 65 20 74 61 6b 65 20 61 6e 20 45 58 43 4c  ase take an EXCL
23110 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
23120 65 0a 20 20 2a 2a 20 44 4d 53 20 62 79 74 65 20  e.  ** DMS byte 
23130 61 6e 64 20 74 72 75 6e 63 61 74 65 20 74 68 65  and truncate the
23140 20 2a 2d 73 68 6d 20 66 69 6c 65 20 74 6f 20 7a   *-shm file to z
23150 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
23160 65 2e 20 54 68 65 6e 0a 20 20 2a 2a 20 64 6f 77  e. Then.  ** dow
23170 6e 67 72 61 64 65 20 74 6f 20 61 20 53 48 41 52  ngrade to a SHAR
23180 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 44  ED lock on the D
23190 4d 53 20 62 79 74 65 2e 0a 20 20 2a 2a 0a 20 20  MS byte..  **.  
231a0 2a 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 70 72  ** If another pr
231b0 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
231c0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
231d0 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79  ck on the DMS by
231e0 74 65 2c 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  te,.  ** return 
231f0 53 51 4c 49 54 45 5f 42 55 53 59 20 74 6f 20 74  SQLITE_BUSY to t
23200 68 65 20 63 61 6c 6c 65 72 20 28 69 74 20 77 69  he caller (it wi
23210 6c 6c 20 74 72 79 20 61 67 61 69 6e 29 2e 20 41  ll try again). A
23220 6e 20 65 61 72 6c 69 65 72 0a 20 20 2a 2a 20 76  n earlier.  ** v
23230 65 72 73 69 6f 6e 20 6f 66 20 74 68 69 73 20 63  ersion of this c
23240 6f 64 65 20 61 74 74 65 6d 70 74 65 64 20 74 68  ode attempted th
23250 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 74  e SHARED lock at
23260 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 42 75 74   this point. But
23270 0a 20 20 2a 2a 20 74 68 69 73 20 69 6e 74 72 6f  .  ** this intro
23280 64 75 63 65 64 20 61 20 73 75 62 74 6c 65 20 72  duced a subtle r
23290 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 3a 20 69  ace condition: i
232a0 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 68 6f  f the process ho
232b0 6c 64 69 6e 67 0a 20 20 2a 2a 20 45 58 43 4c 55  lding.  ** EXCLU
232c0 53 49 56 45 20 66 61 69 6c 65 64 20 6a 75 73 74  SIVE failed just
232d0 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69   before truncati
232e0 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  ng the *-shm fil
232f0 65 2c 20 74 68 65 6e 20 74 68 69 73 0a 20 20 2a  e, then this.  *
23300 2a 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  * process might 
23310 6f 70 65 6e 20 61 6e 64 20 75 73 65 20 74 68 65  open and use the
23320 20 2a 2d 73 68 6d 20 66 69 6c 65 20 77 69 74 68   *-shm file with
23330 6f 75 74 20 74 72 75 6e 63 61 74 69 6e 67 20 69  out truncating i
23340 74 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66 20 74  t..  ** And if t
23350 68 65 20 2a 2d 73 68 6d 20 66 69 6c 65 20 68 61  he *-shm file ha
23360 73 20 62 65 65 6e 20 63 6f 72 72 75 70 74 65 64  s been corrupted
23370 20 62 79 20 61 20 70 6f 77 65 72 20 66 61 69 6c   by a power fail
23380 75 72 65 20 6f 72 0a 20 20 2a 2a 20 73 79 73 74  ure or.  ** syst
23390 65 6d 20 63 72 61 73 68 2c 20 74 68 65 20 64 61  em crash, the da
233a0 74 61 62 61 73 65 20 69 74 73 65 6c 66 20 6d 61  tabase itself ma
233b0 79 20 61 6c 73 6f 20 62 65 63 6f 6d 65 20 63 6f  y also become co
233c0 72 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6c 6f 63  rrupt.  */.  loc
233d0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
233e0 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f  K_SET;.  lock.l_
233f0 73 74 61 72 74 20 3d 20 55 4e 49 58 5f 53 48 4d  start = UNIX_SHM
23400 5f 44 4d 53 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  _DMS;.  lock.l_l
23410 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 2e 6c  en = 1;.  lock.l
23420 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
23430 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
23440 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 47 45  ShmNode->h, F_GE
23450 54 4c 4b 2c 20 26 6c 6f 63 6b 29 21 3d 30 20 29  TLK, &lock)!=0 )
23460 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49   {.    rc = SQLI
23470 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
23480 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e   }else if( lock.
23490 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
234a0 29 7b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  ){.    if( pShmN
234b0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
234c0 29 7b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  ){.      pShmNod
234d0 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20  e->isUnlocked = 
234e0 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  1;.      rc = SQ
234f0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
23500 4e 54 49 4e 49 54 3b 0a 20 20 20 20 7d 65 6c 73  NTINIT;.    }els
23510 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  e{.      rc = un
23520 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
23530 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20  pDbFd, F_WRLCK, 
23540 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
23550 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
23560 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 6f 62  SQLITE_OK && rob
23570 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
23580 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b  hmNode->h, 0) ){
23590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
235a0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
235b0 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 2c  E_IOERR_SHMOPEN,
235c0 22 66 74 72 75 6e 63 61 74 65 22 2c 70 53 68 6d  "ftruncate",pShm
235d0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
235e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
235f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b    }else if( lock
23600 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  .l_type==F_WRLCK
23610 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
23620 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
23630 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23640 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
23650 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
23660 5f 55 4e 4c 43 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c  _UNLCK || lock.l
23670 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
23680 3b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53  ;.    rc = unixS
23690 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
236a0 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49  Fd, F_RDLCK, UNI
236b0 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20  X_SHM_DMS, 1);. 
236c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
236d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
236e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
236f0 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
23700 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
23710 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
23720 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
23730 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
23740 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
23750 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
23760 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
23770 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
23780 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
23790 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
237a0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
237b0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
237c0 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
237d0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
237e0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
237f0 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
23800 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
23810 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
23820 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
23830 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
23840 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
23850 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
23860 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
23870 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
23880 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
23890 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
238a0 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
238b0 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
238c0 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
238d0 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
238e0 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
238f0 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
23900 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
23910 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
23920 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
23930 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
23940 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
23950 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
23960 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
23970 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
23980 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
23990 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
239a0 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
239b0 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
239c0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
239d0 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
239e0 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
239f0 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
23a00 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
23a10 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
23a20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
23a30 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
23a40 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
23a50 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
23a60 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
23a70 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
23a80 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
23a90 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
23aa0 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
23ab0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
23ac0 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
23ad0 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
23ae0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
23af0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
23b00 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
23b10 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
23b20 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
23b30 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
23b40 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
23b50 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
23b60 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
23b70 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
23b80 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
23b90 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
23ba0 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
23bb0 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
23bc0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
23bd0 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
23be0 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
23bf0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
23c00 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
23c10 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
23c20 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
23c30 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
23c40 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
23c50 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
23c60 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
23c70 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
23c80 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
23c90 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
23ca0 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
23cb0 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
23cc0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
23cd0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
23ce0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
23cf0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
23d00 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
23d10 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
23d20 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
23d30 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
23d40 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
23d50 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
23d60 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
23d70 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
23d80 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
23d90 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
23da0 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
23db0 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
23dc0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
23dd0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
23de0 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
23df0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
23e00 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
23e10 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
23e20 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
23e30 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
23e40 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
23e50 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
23e60 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
23e70 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
23e80 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
23e90 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
23ea0 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
23eb0 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
23ec0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
23ed0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23ee0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
23ef0 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
23f00 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
23f10 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
23f20 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
23f30 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
23f40 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
23f50 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
23f60 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
23f70 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
23f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
23f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
23fa0 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
23fb0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
23fc0 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
23fd0 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
23fe0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
23ff0 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
24000 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
24010 69 6c 65 20 75 73 65 64 20 66 6f 72 20 53 48 4d  ile used for SHM
24020 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 6d 46 69   */.  int nShmFi
24030 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
24040 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
24050 20 74 68 65 20 53 48 4d 20 66 69 6c 65 6e 61 6d   the SHM filenam
24060 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  e in bytes */.. 
24070 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
24080 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  ce for the new u
24090 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2e 20 2a  nixShm object. *
240a0 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  /.  p = sqlite3_
240b0 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
240c0 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 3d  (*p) );.  if( p=
240d0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
240e0 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
240f0 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
24100 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73 73  zeof(*p));.  ass
24110 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68 6d  ert( pDbFd->pShm
24120 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
24130 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20 75  ck to see if a u
24140 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
24150 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
24160 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73 74  . Reuse an exist
24170 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66 20  ing.  ** one if 
24180 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65 20  present. Create 
24190 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
241a0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 75  essary..  */.  u
241b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
241c0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  .  pInode = pDbF
241d0 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53 68  d->pInode;.  pSh
241e0 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  mNode = pInode->
241f0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28 20  pShmNode;.  if( 
24200 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
24210 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
24220 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
24230 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28 29        /* fstat()
24240 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62 61   info for databa
24250 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e 64  se file */.#ifnd
24260 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ef SQLITE_SHM_DI
24270 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e 73  RECTORY.    cons
24280 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61 74  t char *zBasePat
24290 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74 68  h = pDbFd->zPath
242a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
242b0 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74 6f   Call fstat() to
242c0 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   figure out the 
242d0 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
242e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
242f0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65  . If.    ** a ne
24300 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73 20  w *-shm file is 
24310 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74 65  created, an atte
24320 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64 65  mpt will be made
24330 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20 20   to create it.  
24340 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73 61    ** with the sa
24350 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a  me permissions..
24360 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f      */.    if( o
24370 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68 2c  sFstat(pDbFd->h,
24380 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
24390 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
243a0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
243b0 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
243c0 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
243d0 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
243e0 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
243f0 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
24400 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
24410 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c  CTORY) + 31;.#el
24420 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
24430 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73  ame = 6 + (int)s
24440 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29  trlen(zBasePath)
24450 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
24460 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  mNode = sqlite3_
24470 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
24480 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
24490 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
244a0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
244b0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
244c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
244d0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
244e0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
244f0 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 53 68  }.    memset(pSh
24500 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  mNode, 0, sizeof
24510 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d  (*pShmNode)+nShm
24520 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a  Filename);.    z
24530 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  Shm = pShmNode->
24540 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
24550 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b  r*)&pShmNode[1];
24560 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
24570 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
24580 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24590 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
245a0 7a 53 68 6d 2c 20 0a 20 20 20 20 20 20 20 20 20  zShm, .         
245b0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
245c0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
245d0 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78   "/sqlite-shm-%x
245e0 2d 25 78 22 2c 0a 20 20 20 20 20 20 20 20 20 20  -%x",.          
245f0 20 20 20 20 20 20 20 20 20 20 20 28 75 33 32 29             (u32)
24600 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75  sStat.st_ino, (u
24610 33 32 29 73 53 74 61 74 2e 73 74 5f 64 65 76 29  32)sStat.st_dev)
24620 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73 71 6c 69  ;.#else.    sqli
24630 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68  te3_snprintf(nSh
24640 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c  mFilename, zShm,
24650 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65   "%s-shm", zBase
24660 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
24670 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44  e3FileSuffix3(pD
24680 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d  bFd->zPath, zShm
24690 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53  );.#endif.    pS
246a0 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a  hmNode->h = -1;.
246b0 20 20 20 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64      pDbFd->pInod
246c0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  e->pShmNode = pS
246d0 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  hmNode;.    pShm
246e0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70  Node->pInode = p
246f0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
24700 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
24710 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
24720 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 53  utex ){.      pS
24730 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20  hmNode->mutex = 
24740 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
24750 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
24760 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 69 66  _FAST);.      if
24770 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  ( pShmNode->mute
24780 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  x==0 ){.        
24790 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
247a0 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
247b0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
247c0 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
247d0 0a 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ..    if( pInode
247e0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
247f0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  0 ){.      if( 0
24800 3d 3d 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ==sqlite3_uri_bo
24810 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61  olean(pDbFd->zPa
24820 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68  th, "readonly_sh
24830 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  m", 0) ){.      
24840 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
24850 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d  robust_open(zShm
24860 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54  , O_RDWR|O_CREAT
24870 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
24880 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 7d  &0777));.      }
24890 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
248a0 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
248b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
248c0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53  = robust_open(zS
248d0 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73  hm, O_RDONLY, (s
248e0 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37  Stat.st_mode&077
248f0 37 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  7));.        if(
24900 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
24910 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24920 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
24930 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
24940 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
24950 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
24960 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
24970 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24980 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65    pShmNode->isRe
24990 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adonly = 1;.    
249a0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
249b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
249c0 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
249d0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
249e0 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20   the SHM file.  
249f0 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20      ** is owned 
24a00 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72  by the same user
24a10 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f   that owns the o
24a20 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
24a30 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  .  Otherwise,.  
24a40 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
24a50 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e  nal owner will n
24a60 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f  ot be able to co
24a70 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  nnect..      */.
24a80 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f        robustFcho
24a90 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
24aa0 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
24ab0 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20  tat.st_gid);..  
24ac0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63      rc = unixLoc
24ad0 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  kSharedMemory(pD
24ae0 62 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a  bFd, pShmNode);.
24af0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
24b00 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
24b10 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
24b20 41 4e 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73  ANTINIT ) goto s
24b30 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
24b40 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
24b50 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
24b60 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
24b70 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
24b80 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
24b90 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
24ba0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
24bb0 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
24bc0 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
24bd0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
24be0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
24bf0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
24c00 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
24c10 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
24c20 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
24c30 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
24c40 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
24c50 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
24c60 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
24c70 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
24c80 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
24c90 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
24ca0 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
24cb0 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
24cc0 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
24cd0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
24ce0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
24cf0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
24d00 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
24d10 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
24d20 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
24d30 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
24d40 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
24d50 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
24d60 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
24d70 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
24d80 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
24d90 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
24da0 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
24db0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
24dc0 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
24dd0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
24de0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
24df0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
24e00 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
24e10 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
24e20 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
24e30 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79  Jump here on any
24e40 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70   error */.shm_op
24e50 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68  en_err:.  unixSh
24e60 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b 20 20  mPurge(pDbFd);  
24e70 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
24e80 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65  l frees pShmNode
24e90 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
24ea0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
24eb0 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
24ec0 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
24ed0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
24ee0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
24ef0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61  lled to obtain a
24f00 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69   pointer to regi
24f10 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68  on iRegion of th
24f20 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  e .** shared-mem
24f30 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
24f40 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
24f50 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64   file fd. Shared
24f60 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
24f70 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64  .** are numbered
24f80 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a   starting from z
24f90 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64  ero. Each shared
24fa0 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69  -memory region i
24fb0 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62  s szRegion .** b
24fc0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ytes in size..**
24fd0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
24fe0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
24ff0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
25000 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74  d and *pp is set
25010 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
25020 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68  Otherwise, if th
25030 65 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65  e bExtend parame
25040 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65  ter is 0 and the
25050 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65   requested share
25060 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69  d-memory.** regi
25070 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  on has not been 
25080 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e  allocated (by an
25090 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64  y client, includ
250a0 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20  ing one running 
250b0 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65  in a.** separate
250c0 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20   process), then 
250d0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
250e0 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
250f0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a   returned. If .*
25100 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e  * bExtend is non
25110 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65  -zero and the re
25120 71 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d  quested shared-m
25130 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
25140 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65   not yet .** bee
25150 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20  n allocated, it 
25160 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20  is allocated by 
25170 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
25180 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72  *.** If the shar
25190 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
251a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
251b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69  n allocated or i
251c0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
251d0 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64  * this call as d
251e0 65 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20  escribed above, 
251f0 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65  then it is mappe
25200 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
25210 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73  esses .** addres
25220 73 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69  s space (if it i
25230 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20  s not already), 
25240 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f  *pp is set to po
25250 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65  int to the mappe
25260 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64  d .** memory and
25270 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25280 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
25290 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20  nt unixShmMap(. 
252a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
252b0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
252c0 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20   /* Handle open 
252d0 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
252e0 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f   */.  int iRegio
252f0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
25300 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20        /* Region 
25310 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20  to retrieve */. 
25320 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20   int szRegion,  
25330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25340 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69   /* Size of regi
25350 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78  ons */.  int bEx
25360 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20  tend,           
25370 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
25380 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20   to extend file 
25390 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
253a0 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20    void volatile 
253b0 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20  **pp            
253c0 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64    /* OUT: Mapped
253d0 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
253e0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
253f0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
25400 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20  .  unixShm *p;. 
25410 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
25420 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63  hmNode;.  int rc
25430 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25440 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d  int nShmPerMap =
25450 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65   unixShmRegionPe
25460 72 4d 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52  rMap();.  int nR
25470 65 71 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20  eqRegion;..  /* 
25480 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65  If the shared-me
25490 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f  mory file has no
254a0 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65  t yet been opene
254b0 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20  d, open it now. 
254c0 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e  */.  if( pDbFd->
254d0 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72  pShm==0 ){.    r
254e0 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  c = unixOpenShar
254f0 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b  edMemory(pDbFd);
25500 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25510 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
25520 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70  rc;.  }..  p = p
25530 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53  DbFd->pShm;.  pS
25540 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
25550 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Node;.  sqlite3_
25560 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
25570 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
25580 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
25590 55 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20  Unlocked ){.    
255a0 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61  rc = unixLockSha
255b0 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c  redMemory(pDbFd,
255c0 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20   pShmNode);.    
255d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
255e0 4b 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65  K ) goto shmpage
255f0 5f 6f 75 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f  _out;.    pShmNo
25600 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d  de->isUnlocked =
25610 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
25620 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
25630 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
25640 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
25650 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ion==0 );.  asse
25660 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
25670 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
25680 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
25690 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
256a0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
256b0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
256c0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
256d0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
256e0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
256f0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
25700 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  ;..  /* Minimum 
25710 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e  number of region
25720 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  s required to be
25730 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52   mapped. */.  nR
25740 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65  eqRegion = ((iRe
25750 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29  gion+nShmPerMap)
25760 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a   / nShmPerMap) *
25770 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20   nShmPerMap;..  
25780 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
25790 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e  egion<nReqRegion
257a0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
257b0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
257c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
257d0 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
257e0 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
257f0 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e  yte = nReqRegion
25800 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20  *szRegion;   /* 
25810 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
25820 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
25830 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
25840 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
25850 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
25860 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
25870 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
25880 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
25890 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
258a0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
258b0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
258c0 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
258d0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
258e0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
258f0 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
25900 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
25910 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
25920 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
25930 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
25940 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
25950 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
25960 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
25970 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
25980 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
25990 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
259a0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
259b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
259c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
259d0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
259e0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
259f0 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
25a00 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
25a10 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
25a20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
25a30 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
25a40 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
25a50 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
25a60 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
25a70 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
25a80 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
25a90 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
25aa0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25ab0 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ned..        */.
25ac0 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78          if( !bEx
25ad0 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tend ){.        
25ae0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
25af0 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
25b00 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e         /* Altern
25b10 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
25b20 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74  end is true, ext
25b30 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f  end the file. Do
25b40 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
25b50 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69   ** writing a si
25b60 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65  ngle byte to the
25b70 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53   end of each (OS
25b80 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20  ) page being.   
25b90 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
25ba0 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54  d or extended. T
25bb0 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e  echnically, we n
25bc0 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  eed only write t
25bd0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
25be0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72   last page in or
25bf0 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68  der to extend th
25c00 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74  e file. But writ
25c10 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20  ing to all new. 
25c20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20         ** pages 
25c30 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f  forces the OS to
25c40 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69   allocate them i
25c50 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63  mmediately, whic
25c60 68 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20  h reduces.      
25c70 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73    ** the chances
25c80 20 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65   of SIGBUS while
25c90 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d   accessing the m
25ca0 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74  apped region lat
25cb0 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  er on..        *
25cc0 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a  /.        else{.
25cd0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
25ce0 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
25cf0 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20  = 4096;.        
25d00 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20    int iPg;..    
25d10 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
25d20 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
25d30 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c  of each newly al
25d40 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e  located or exten
25d50 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ded page */.    
25d60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e        assert( (n
25d70 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20  Byte % pgsz)==0 
25d80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
25d90 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73  (iPg=(sStat.st_s
25da0 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28  ize/pgsz); iPg<(
25db0 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67  nByte/pgsz); iPg
25dc0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
25dd0 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20   int x = 0;.    
25de0 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65 6b          if( seek
25df0 41 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e  AndWriteFd(pShmN
25e00 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a  ode->h, iPg*pgsz
25e10 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31   + pgsz-1, "", 1
25e20 2c 20 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20  , &x)!=1 ){.    
25e30 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
25e40 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53  char *zFile = pS
25e50 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
25e60 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
25e70 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
25e80 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
25e90 53 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22  SHMSIZE, "write"
25ea0 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
25eb0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
25ec0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
25ed0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25ee0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
25ef0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
25f00 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
25f10 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
25f20 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
25f30 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
25f40 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
25f50 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73  New = (char **)s
25f60 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
25f70 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
25f80 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71  ->apRegion, nReq
25f90 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68  Region*sizeof(ch
25fa0 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20  ar *).    );.   
25fb0 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
25fc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
25fd0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50  _IOERR_NOMEM_BKP
25fe0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
25ff0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
26000 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
26010 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
26020 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
26030 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
26040 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
26050 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52    int nMap = szR
26060 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70  egion*nShmPerMap
26070 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
26080 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
26090 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
260a0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
260b0 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d       pMem = osMm
260c0 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20  ap(0, nMap,.    
260d0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
260e0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
260f0 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
26100 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
26110 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
26120 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
26130 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
26140 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
26150 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
26160 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
26170 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
26180 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
26190 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
261a0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
261b0 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
261c0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
261d0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
261e0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
261f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
26200 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
26210 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
26220 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20  c64(szRegion);. 
26230 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
26240 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
26250 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
26260 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
26270 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
26280 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
26290 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65        memset(pMe
262a0 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b  m, 0, szRegion);
262b0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
262c0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50  for(i=0; i<nShmP
262d0 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  erMap; i++){.   
262e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
262f0 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
26300 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26  ->nRegion+i] = &
26310 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a  ((char*)pMem)[sz
26320 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20  Region*i];.     
26330 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
26340 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53  e->nRegion += nS
26350 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a  hmPerMap;.    }.
26360 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
26370 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
26380 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
26390 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
263a0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
263b0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
263c0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
263d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
263e0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
263f0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
26400 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
26410 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
26420 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
26430 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
26440 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26450 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
26460 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
26470 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
26480 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
26490 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
264a0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
264b0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
264c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
264d0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
264e0 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
264f0 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
26500 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
26510 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
26520 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
26530 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
26540 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
26550 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
26560 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
26570 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
26580 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
26590 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
265a0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
265b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
265c0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
265d0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
265e0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
265f0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
26600 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
26610 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
26620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26630 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
26640 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
26650 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
26660 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
26670 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26680 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
26690 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
266a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
266d0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
266e0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
266f0 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
26700 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
26710 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
26720 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
26730 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
26740 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
26750 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
26760 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
26770 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
26780 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
26790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267a0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
267b0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
267c0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
267d0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
267e0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
267f0 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
26800 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
26810 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
26820 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
26830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
26840 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
26850 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
26880 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
26890 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
268a0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
268b0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
268c0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
268d0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
268e0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
268f0 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
26900 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
26910 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
26920 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
26930 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
26940 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
26950 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
26960 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
26970 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
26980 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
26990 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
269a0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
269b0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
269c0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
269d0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
269e0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
269f0 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
26a00 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
26a10 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
26a20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
26a30 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
26a40 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
26a50 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
26a60 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
26a70 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
26a80 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
26a90 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
26aa0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
26ab0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
26ac0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
26ad0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
26ae0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
26af0 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
26b00 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
26b10 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
26b20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
26b30 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
26b40 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
26b50 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
26b60 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
26b70 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
26b80 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
26b90 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
26ba0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
26bb0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
26bc0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
26bd0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
26be0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
26bf0 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
26c00 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
26c10 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
26c20 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
26c30 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
26c40 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
26c50 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
26c60 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
26c70 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
26c80 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
26c90 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
26ca0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
26cb0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
26cc0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
26cd0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
26ce0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
26cf0 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20  pDbFd, F_UNLCK, 
26d00 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
26d10 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
26d20 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
26d30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
26d40 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
26d50 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
26d60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26d70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
26d80 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
26d90 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
26da0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
26db0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
26dc0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
26dd0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
26de0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
26df0 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
26e00 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
26e10 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
26e20 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
26e30 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
26e40 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
26e50 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
26e60 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
26e70 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
26e80 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
26e90 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
26ea0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
26eb0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
26ec0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
26ed0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
26ee0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
26ef0 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
26f00 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
26f10 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
26f20 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
26f30 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
26f40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
26f50 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
26f60 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
26f70 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
26f80 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
26f90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
26fa0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
26fb0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
26fc0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
26fd0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
26fe0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26ff0 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
27000 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
27010 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
27020 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
27030 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66  bFd, F_RDLCK, of
27040 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
27050 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
27060 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
27070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
27080 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
27090 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
270a0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
270b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
270c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
270d0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
270e0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
270f0 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
27100 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
27110 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
27120 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
27130 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
27140 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
27150 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
27160 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
27170 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
27180 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
27190 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
271a0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
271b0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
271c0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
271d0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
271e0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
271f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
27200 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
27210 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
27220 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
27230 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
27240 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
27250 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
27260 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
27270 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
27280 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
27290 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
272a0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
272b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
272c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
272d0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
272e0 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52  Lock(pDbFd, F_WR
272f0 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
27300 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
27310 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
27320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
27330 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
27340 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
27350 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
27360 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
27370 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27380 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
27390 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
273a0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
273b0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
273c0 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
273d0 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
273e0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
273f0 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28 30  ->id, osGetpid(0
27400 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ), p->sharedMask
27410 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  , p->exclMask));
27420 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
27430 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
27440 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
27450 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
27460 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
27470 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
27480 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
27490 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
274a0 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
274b0 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
274c0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
274d0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
274e0 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
274f0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
27500 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
27510 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
27520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27530 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
27540 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
27550 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
27560 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27570 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  R(fd);.  sqlite3
27580 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
27590 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70           /* comp
275a0 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d  iler-defined mem
275b0 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20  ory barrier */. 
275c0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
275d0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
275e0 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20   /* Also mutex, 
275f0 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a  for redundancy *
27600 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  /.  unixLeaveMut
27610 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
27620 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
27630 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
27640 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
27650 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
27660 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
27670 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
27680 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
27690 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
276a0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
276b0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
276c0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
276d0 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
276e0 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
276f0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
27700 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
27710 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
27720 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
27730 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
27740 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
27750 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
27760 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27770 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
27780 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
27790 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
277a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
277b0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
277c0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
277d0 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
277e0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
277f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27800 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
27810 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
27820 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
27850 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
27860 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
27870 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
27880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27890 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
278a0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
278b0 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
278c0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
278d0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
278e0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
278f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
27900 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
27910 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
27920 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
27930 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
27940 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
27950 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
27960 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
27970 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
27980 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
27990 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
279a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
279b0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
279c0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
279d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
279e0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
279f0 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
27a00 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
27a10 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
27a20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
27a30 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
27a40 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
27a50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
27a60 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
27a70 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
27a80 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
27a90 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
27aa0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
27ab0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
27ac0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
27ad0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
27ae0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
27af0 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
27b00 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
27b10 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
27b20 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
27b30 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
27b40 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
27b50 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
27b60 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
27b70 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
27b80 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65  Flag && pShmNode
27b90 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
27ba0 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
27bb0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
27bc0 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d     }.    unixShm
27bd0 50 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20  Purge(pDbFd);.  
27be0 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
27bf0 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  ex();..  return 
27c00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23  SQLITE_OK;.}...#
27c10 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e  else.# define un
27c20 69 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23  ixShmMap     0.#
27c30 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c   define unixShmL
27c40 6f 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e  ock    0.# defin
27c50 65 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  e unixShmBarrier
27c60 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
27c70 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e  ShmUnmap   0.#en
27c80 64 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53  dif /* #ifndef S
27c90 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
27ca0 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  /..#if SQLITE_MA
27cb0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
27cc0 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72  .** If it is cur
27cd0 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61  rently memory ma
27ce0 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65  pped, unmap file
27cf0 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pFd..*/.static 
27d00 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
27d10 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
27d20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  ){.  assert( pFd
27d30 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
27d40 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61  ;.  if( pFd->pMa
27d50 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f  pRegion ){.    o
27d60 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61  sMunmap(pFd->pMa
27d70 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d  pRegion, pFd->mm
27d80 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20  apSizeActual);. 
27d90 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69     pFd->pMapRegi
27da0 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  on = 0;.    pFd-
27db0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
27dc0 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
27dd0 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
27de0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
27df0 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65   to set the size
27e00 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d   of the memory m
27e10 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65  apping maintaine
27e20 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65  d by file .** de
27e30 73 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20  scriptor pFd to 
27e40 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20  nNew bytes. Any 
27e50 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
27e60 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a   is discarded..*
27e70 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
27e80 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
27e90 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f  n sets the follo
27ea0 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a  wing variables:.
27eb0 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  **.**       unix
27ec0 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a  File.pMapRegion.
27ed0 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
27ee0 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20  e.mmapSize.**   
27ef0 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
27f00 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a  pSizeActual.**.*
27f10 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75  * If unsuccessfu
27f20 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  l, an error mess
27f30 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69  age is logged vi
27f40 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  a sqlite3_log() 
27f50 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65  and.** the three
27f60 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65   variables above
27f70 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20   are zeroed. In 
27f80 74 68 69 73 20 63 61 73 65 20 53 51 4c 69 74 65  this case SQLite
27f90 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69   should.** conti
27fa0 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  nue accessing th
27fb0 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
27fc0 20 74 68 65 20 78 52 65 61 64 28 29 20 61 6e 64   the xRead() and
27fd0 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74   xWrite().** met
27fe0 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
27ff0 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69  void unixRemapfi
28000 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le(.  unixFile *
28010 70 46 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  pFd,            
28020 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
28030 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20  scriptor object 
28040 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20  */.  i64 nNew   
28050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28060 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
28070 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f   mapping size */
28080 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
28090 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b   *zErr = "mmap";
280a0 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e  .  int h = pFd->
280b0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
280c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
280d0 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
280e0 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  on db file */.  
280f0 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20  u8 *pOrig = (u8 
28100 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
28110 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  n;   /* Pointer 
28120 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  to current file 
28130 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34  mapping */.  i64
28140 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d   nOrig = pFd->mm
28150 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20  apSizeActual;   
28160 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72    /* Size of pOr
28170 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74  ig region in byt
28180 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77  es */.  u8 *pNew
28190 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
281a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
281b0 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20  Location of new 
281c0 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  mapping */.  int
281d0 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45   flags = PROT_RE
281e0 41 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  AD;             
281f0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
28200 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a  ss to mmap() */.
28210 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
28220 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
28230 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70    assert( nNew>p
28240 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
28250 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d    assert( nNew<=
28260 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
28270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
28280 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ew>0 );.  assert
28290 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  ( pFd->mmapSizeA
282a0 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70  ctual>=pFd->mmap
282b0 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
282c0 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20  ( MAP_FAILED!=0 
282d0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
282e0 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45  E_MMAP_READWRITE
282f0 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72  .  if( (pFd->ctr
28300 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
28310 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66  E_RDONLY)==0 ) f
28320 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49  lags |= PROT_WRI
28330 54 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  TE;.#endif..  if
28340 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48  ( pOrig ){.#if H
28350 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69  AVE_MREMAP.    i
28360 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d  64 nReuse = pFd-
28370 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65  >mmapSize;.#else
28380 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73  .    const int s
28390 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74  zSyspage = osGet
283a0 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20  pagesize();.    
283b0 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46  i64 nReuse = (pF
283c0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28  d->mmapSize & ~(
283d0 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23  szSyspage-1));.#
283e0 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52  endif.    u8 *pR
283f0 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75  eq = &pOrig[nReu
28400 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d  se];..    /* Unm
28410 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20  ap any pages of 
28420 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
28430 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74  ping that cannot
28440 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20   be reused. */. 
28450 20 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e     if( nReuse!=n
28460 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73  Orig ){.      os
28470 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72  Munmap(pReq, nOr
28480 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  ig-nReuse);.    
28490 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  }..#if HAVE_MREM
284a0 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  AP.    pNew = os
284b0 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Mremap(pOrig, nR
284c0 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d  euse, nNew, MREM
284d0 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20  AP_MAYMOVE);.   
284e0 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22   zErr = "mremap"
284f0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77  ;.#else.    pNew
28500 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20   = osMmap(pReq, 
28510 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61  nNew-nReuse, fla
28520 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20  gs, MAP_SHARED, 
28530 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  h, nReuse);.    
28540 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41  if( pNew!=MAP_FA
28550 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66  ILED ){.      if
28560 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a  ( pNew!=pReq ){.
28570 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
28580 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52  (pNew, nNew - nR
28590 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70  euse);.        p
285a0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  New = 0;.      }
285b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e  else{.        pN
285c0 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20  ew = pOrig;.    
285d0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
285e0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74  ..    /* The att
285f0 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74  empt to extend t
28600 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
28610 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65  ing failed. Free
28620 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
28630 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
28640 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20   || pNew==0 ){. 
28650 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f       osMunmap(pO
28660 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20  rig, nReuse);.  
28670 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
28680 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e   pNew is still N
28690 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61  ULL, try to crea
286a0 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e  te an entirely n
286b0 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20  ew mapping. */. 
286c0 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
286d0 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
286e0 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73  p(0, nNew, flags
286f0 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
28700 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   0);.  }..  if( 
28710 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew==MAP_FAILED
28720 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30   ){.    pNew = 0
28730 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a  ;.    nNew = 0;.
28740 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
28750 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72  (SQLITE_OK, zErr
28760 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a  , pFd->zPath);..
28770 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d      /* If the mm
28780 61 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65  ap() above faile
28790 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61  d, assume that a
287a0 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d  ll subsequent mm
287b0 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  ap() calls.    *
287c0 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  * will probably 
287d0 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62  fail too. Fall b
287e0 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65  ack to using xRe
287f0 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73  ad/xWrite exclus
28800 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20  ively.    ** in 
28810 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20  this case.  */. 
28820 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
28830 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Max = 0;.  }.  p
28840 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
28850 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20   (void *)pNew;. 
28860 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
28870 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
28880 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a  tual = nNew;.}..
28890 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70  /*.** Memory map
288a0 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69   or remap the fi
288b0 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c  le opened by fil
288c0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64  e-descriptor pFd
288d0 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a   (if the file.**
288e0 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70   is already mapp
288f0 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67  ed, the existing
28900 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c   mapping is repl
28910 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29  aced by the new)
28920 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65  . Or, if .** the
28930 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  re already exist
28940 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20  s a mapping for 
28950 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74  this file, and t
28960 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a  here are still .
28970 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78  ** outstanding x
28980 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63  Fetch() referenc
28990 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66  es to it, this f
289a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
289b0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72  op..**.** If par
289c0 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20  ameter nByte is 
289d0 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68  non-negative, th
289e0 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71  en it is the req
289f0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a  uested size of .
28a00 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74  ** the mapping t
28a10 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77  o create. Otherw
28a20 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73  ise, if nByte is
28a30 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
28a40 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65   then the .** re
28a50 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20  quested size is 
28a60 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
28a70 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68  file on disk. Th
28a80 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66  e actual size of
28a90 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   the.** created 
28aa0 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65  mapping is eithe
28ab0 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  r the requested 
28ac0 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75  size or the valu
28ad0 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a  e configured .**
28ae0 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43   using SQLITE_FC
28af0 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20  NTL_MMAP_LIMIT, 
28b00 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61  whichever is sma
28b10 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  ller..**.** SQLI
28b20 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
28b30 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  d if no error oc
28b40 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68  curs (even if th
28b50 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74  e mapping is not
28b60 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73  .** recreated as
28b70 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74   a result of out
28b80 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
28b90 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74  ces) or an SQLit
28ba0 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  e error.** code 
28bb0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
28bc0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70  atic int unixMap
28bd0 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  file(unixFile *p
28be0 46 64 2c 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20  Fd, i64 nMap){. 
28bf0 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30   assert( nMap>=0
28c00 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f   || pFd->nFetchO
28c10 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ut==0 );.  asser
28c20 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46  t( nMap>0 || (pF
28c30 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26  d->mmapSize==0 &
28c40 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  & pFd->pMapRegio
28c50 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70  n==0) );.  if( p
28c60 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20  Fd->nFetchOut>0 
28c70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28c80 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c  OK;..  if( nMap<
28c90 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
28ca0 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20  stat statbuf;   
28cb0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
28cc0 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
28cd0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tion */.    if( 
28ce0 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20  osFstat(pFd->h, 
28cf0 26 73 74 61 74 62 75 66 29 20 29 7b 0a 20 20 20  &statbuf) ){.   
28d00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
28d10 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
28d20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73    }.    nMap = s
28d30 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a  tatbuf.st_size;.
28d40 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
28d50 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
28d60 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
28d70 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
28d80 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e    }..  assert( n
28d90 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d  Map>0 || (pFd->m
28da0 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46  mapSize==0 && pF
28db0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
28dc0 29 20 29 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21  ) );.  if( nMap!
28dd0 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
28de0 7b 0a 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66  {.    unixRemapf
28df0 69 6c 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a  ile(pFd, nMap);.
28e00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
28e10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
28e20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
28e30 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
28e40 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
28e50 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
28e60 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
28e70 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
28e80 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
28e90 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
28ea0 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
28eb0 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
28ec0 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
28ed0 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
28ee0 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
28ef0 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
28f00 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
28f10 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
28f20 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
28f30 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
28f40 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
28f50 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
28f60 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
28f70 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
28f80 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
28f90 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
28fa0 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
28fb0 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
28fc0 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
28fd0 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
28fe0 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
28ff0 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
29000 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
29010 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
29020 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73  ually .** releas
29030 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
29040 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55  by calling unixU
29050 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61  nfetch()..*/.sta
29060 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63  tic int unixFetc
29070 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
29080 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
29090 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
290a0 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
290b0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
290c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
290d0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
290e0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
290f0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
29100 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a  le */.#endif.  *
29110 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c  pp = 0;..#if SQL
29120 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
29130 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
29140 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
29150 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
29160 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
29170 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69      int rc = uni
29180 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  xMapfile(pFd, -1
29190 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
291a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
291b0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
291c0 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
291d0 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
291e0 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
291f0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
29200 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
29210 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
29220 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
29230 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
29240 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29250 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
29260 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
29270 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
29280 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
29290 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
292a0 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
292b0 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
292c0 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e   to unixFetch().
292d0 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
292e0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
292f0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
29300 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
29310 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
29320 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
29330 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
29340 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74  d to the unixFet
29350 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
29360 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
29370 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
29380 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
29390 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
293a0 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
293b0 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
293c0 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
293d0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
293e0 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
293f0 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
29400 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
29410 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
29420 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
29430 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63  c int unixUnfetc
29440 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
29450 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
29460 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
29470 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
29480 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
29490 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
294a0 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
294b0 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
294c0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53  e file */.  UNUS
294d0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66  ED_PARAMETER(iOf
294e0 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d  f);..  /* If p==
294f0 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
29500 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
29510 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
29520 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
29530 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
29540 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
29550 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
29560 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
29570 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
29580 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
29590 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
295a0 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
295b0 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
295c0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
295d0 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
295e0 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
295f0 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
29600 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
29610 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
29620 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
29630 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69  n)[iOff] );..  i
29640 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
29650 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
29660 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55  }else{.    unixU
29670 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
29680 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
29690 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
296a0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
296b0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
296c0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
296d0 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
296e0 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
296f0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
29700 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
29710 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
29720 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
29730 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
29740 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
29750 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
29760 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
29770 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
29780 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
29790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
297b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
297f0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
29800 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
29810 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
29820 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29830 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
29840 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
29850 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
29860 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
29870 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
29880 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
29890 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
298a0 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
298b0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
298c0 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
298d0 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
298e0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
298f0 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
29900 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
29910 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
29920 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
29930 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
29940 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
29950 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
29960 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
29970 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
29980 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
29990 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
299a0 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
299b0 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
299c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
299d0 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
299e0 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
299f0 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
29a00 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
29a10 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
29a20 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
29a30 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
29a40 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
29a50 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
29a60 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
29a70 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
29a80 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
29a90 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
29aa0 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20  function F, two 
29ab0 6f 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61  objects are crea
29ac0 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31  ted:.**.**    (1
29ad0 29 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65  ) The real finde
29ae0 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  r-function named
29af0 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a   "FImpt()"..**.*
29b00 2a 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74  *    (2) A const
29b10 61 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  ant pointer to t
29b20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  his function nam
29b30 65 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a  ed just "F"..**.
29b40 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
29b50 74 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72  to the F pointer
29b60 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20   is used as the 
29b70 70 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66  pAppData value f
29b80 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74  or VFS.** object
29b90 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64  s.  We have to d
29ba0 6f 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f  o this instead o
29bb0 66 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61  f letting pAppDa
29bc0 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65  ta point.** dire
29bd0 63 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64  ctly at the find
29be0 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63  er-function sinc
29bf0 65 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76  e C90 rules prev
29c00 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66  ent a void*.** f
29c10 72 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f  rom be cast into
29c20 20 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e   a function poin
29c30 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61  ter..**.**.** Ea
29c40 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ch instance of t
29c50 68 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61  his macro genera
29c60 74 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a  tes two objects:
29c70 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f  .**.**   *  A co
29c80 6e 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69  nstant sqlite3_i
29c90 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29ca0 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61   call METHOD tha
29cb0 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  t has locking.**
29cc0 20 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c        methods CL
29cd0 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
29ce0 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a  K, CKRESLOCK..**
29cf0 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20  .**   *  An I/O 
29d00 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
29d10 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49  nction called FI
29d20 4e 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e  NDER that return
29d30 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20  s a pointer.**  
29d40 20 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f      to the METHO
29d50 44 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  D object in the 
29d60 70 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e  previous bullet.
29d70 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45  .*/.#define IOME
29d80 54 48 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54  THODS(FINDER,MET
29d90 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53  HOD,VERSION,CLOS
29da0 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b  E,LOCK,UNLOCK,CK
29db0 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20  LOCK,SHMMAP)    
29dc0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
29dd0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
29de0 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20  ds METHOD = {   
29df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e10 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20  \.   VERSION,   
29e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e30 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20   /* iVersion */ 
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
29e60 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20  .   CLOSE,      
29e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e80 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20  /* xClose */    
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
29eb0 20 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20     unixRead,    
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29ed0 2a 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20  * xRead */      
29ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29f00 20 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20    unixWrite,    
29f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29f20 20 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20   xWrite */      
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f40 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29f50 20 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20   unixTruncate,  
29f60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f70 78 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20  xTruncate */    
29f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f90 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
29fa0 75 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20  unixSync,       
29fb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29fc0 53 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20  Sync */         
29fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29fe0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
29ff0 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20  nixFileSize,    
2a000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
2a010 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  ileSize */      
2a020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a030 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f           \.   LO
2a040 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
2a050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2a060 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a080 20 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c          \.   UNL
2a090 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20  OCK,            
2a0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2a0b0 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f         \.   CKLO
2a0e0 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
2a0f0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63          /* xChec
2a100 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f  kReservedLock */
2a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a120 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46        \.   unixF
2a130 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
2a140 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43         /* xFileC
2a150 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20  ontrol */       
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a170 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65       \.   unixSe
2a180 63 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20  ctorSize,       
2a190 20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72        /* xSector
2a1a0 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20  Size */         
2a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1c0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76      \.   unixDev
2a1d0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
2a1e0 63 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43  cs,  /* xDeviceC
2a1f0 61 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20  apabilities */  
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a210 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20     \.   SHMMAP, 
2a220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a230 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a      /* xShmMap *
2a240 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f    \.   unixShmLo
2a270 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2a280 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a     /* xShmLock *
2a290 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2a2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a2b0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72   \.   unixShmBar
2a2c0 72 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  rier,           
2a2d0 20 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72    /* xShmBarrier
2a2e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a300 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61  \.   unixShmUnma
2a310 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
2a320 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f   /* xShmUnmap */
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a350 0a 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20  .   unixFetch,  
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20  /* xFetch */    
2a380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a3a0 20 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20     unixUnfetch, 
2a3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a3c0 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20  * xUnfetch */   
2a3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
2a3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a430 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74              \.st
2a440 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2a450 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46  e3_io_methods *F
2a460 49 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73  INDER##Impl(cons
2a470 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46  t char *z, unixF
2a480 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55  ile *p){   \.  U
2a490 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2a4a0 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  z); UNUSED_PARAM
2a4b0 45 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20  ETER(p);        
2a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a4d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65            \.  re
2a4e0 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20  turn &METHOD;   
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a520 20 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20           \.}    
2a530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a570 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63          \.static
2a580 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2a590 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e  o_methods *(*con
2a5a0 73 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74  st FINDER)(const
2a5b0 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20   char*,unixFile 
2a5c0 2a 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46  *p)    \.    = F
2a5d0 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a  INDER##Impl;../*
2a5e0 0a 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c  .** Here are all
2a5f0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
2a600 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2a610 74 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74  ts for each of t
2a620 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74  he.** locking st
2a630 72 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74  rategies.  Funct
2a640 69 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e  ions that return
2a650 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65   pointers to the
2a660 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72  se methods.** ar
2a670 65 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a  e also created..
2a680 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  */.IOMETHODS(.  
2a690 70 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20  posixIoFinder,  
2a6a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2a6b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2a6c0 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65  e */.  posixIoMe
2a6d0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2a6e0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2a6f0 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2a700 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2a730 72 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20  ry and mmap are 
2a740 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  enabled */.  uni
2a750 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
2a760 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2a770 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
2a780 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
2a790 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2a7a0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2a7b0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2a7c0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2a7d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
2a7e0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2a7f0 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck,    /* xCheck
2a800 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2a810 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  hod */.  unixShm
2a820 4d 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20  Map             
2a830 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2a840 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
2a850 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46  ODS(.  nolockIoF
2a860 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
2a870 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2a880 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f  ion name */.  no
2a890 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20  lockIoMethods,  
2a8a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2a8b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2a8c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33  ject name */.  3
2a8d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2a8f0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2a900 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  abled */.  noloc
2a910 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  kClose,         
2a920 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2a930 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2a940 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  kLock,          
2a950 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2a960 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b  thod */.  nolock
2a970 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2a980 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2a990 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63  ethod */.  noloc
2a9a0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
2a9b0 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ck,  /* xCheckRe
2a9c0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2a9d0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9f0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2aa00 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2aa10 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69  S(.  dotlockIoFi
2aa20 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f  nder,          /
2aa30 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2aa40 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c  n name */.  dotl
2aa50 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
2aa60 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2aa70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2aa80 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2aa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aaa0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2aab0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2aac0 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  led */.  dotlock
2aad0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2aae0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2aaf0 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2ab00 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2ab10 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2ab20 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55  od */.  dotlockU
2ab30 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2ab40 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2ab50 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  hod */.  dotlock
2ab60 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2ab70 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  k, /* xCheckRese
2ab80 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2ab90 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2abb0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2abc0 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54   */.)..#if SQLIT
2abd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2abe0 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53  _STYLE.IOMETHODS
2abf0 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65  (.  flockIoFinde
2ac00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2ac10 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2ac20 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b   name */.  flock
2ac30 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2ac40 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2ac50 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2ac60 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2ac70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac80 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2ac90 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2aca0 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f  ed */.  flockClo
2acb0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2acc0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2acd0 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63  od */.  flockLoc
2ace0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2acf0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2ad00 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f  d */.  flockUnlo
2ad10 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2ad20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2ad30 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65  od */.  flockChe
2ad40 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2ad50 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2ad60 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2ad70 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ad90 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2ada0 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
2adb0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45   OS_VXWORKS.IOME
2adc0 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69  THODS(.  semIoFi
2add0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2ade0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2adf0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2ae00 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  semIoMethods,   
2ae10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2ae20 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2ae30 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2ae40 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2ae50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2ae60 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
2ae70 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d  isabled */.  sem
2ae80 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  XClose,         
2ae90 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
2aea0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2aeb0 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  XLock,          
2aec0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
2aed0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58  method */.  semX
2aee0 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
2aef0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
2af00 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d   method */.  sem
2af10 58 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  XCheckReservedLo
2af20 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  ck,    /* xCheck
2af30 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2af40 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2af50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af60 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
2af70 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
2af80 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
2af90 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2afa0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2afb0 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
2afc0 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72  S(.  afpIoFinder
2afd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2afe0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2aff0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49  n name */.  afpI
2b000 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
2b010 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2b020 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2b030 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2b060 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2b070 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73  led */.  afpClos
2b080 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2b090 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2b0a0 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b  hod */.  afpLock
2b0b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b0c0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2b0d0 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63  od */.  afpUnloc
2b0e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2b0f0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2b100 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63  hod */.  afpChec
2b110 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
2b120 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2b130 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2b140 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b160 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2b170 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2b180 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
2b190 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
2b1a0 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
2b1b0 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
2b1c0 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
2b1d0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
2b1e0 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
2b1f0 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
2b200 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
2b210 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
2b220 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
2b230 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
2b240 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
2b250 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
2b260 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
2b270 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
2b280 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
2b290 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
2b2a0 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
2b2b0 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
2b2c0 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
2b2d0 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
2b2e0 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
2b2f0 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
2b300 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
2b310 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2b320 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
2b330 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
2b340 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
2b350 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
2b360 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
2b370 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2b380 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b390 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
2b3a0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
2b3b0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
2b3c0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2b3d0 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
2b3e0 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
2b3f0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
2b400 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2b410 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
2b420 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
2b430 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
2b440 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
2b450 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
2b460 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
2b470 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b480 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b490 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
2b4a0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2b4b0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2b4c0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2b4d0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2b500 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2b510 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20    proxyClose,   
2b520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b530 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b540 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20    proxyLock,    
2b550 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b560 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b570 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20   proxyUnlock,   
2b580 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b590 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2b5a0 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65    proxyCheckRese
2b5b0 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
2b5c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b5d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2b5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b600 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2b610 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f  endif../* nfs lo
2b620 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b  ckd on OSX 10.3+
2b630 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77   doesn't clear w
2b640 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20  rite locks when 
2b650 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73  a read lock is s
2b660 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  et */.#if define
2b670 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2b680 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2b690 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
2b6a0 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69  THODS(.  nfsIoFi
2b6b0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2b6c0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2b6d0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2b6e0 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20   nfsIoMethods,  
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2b700 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b710 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2b720 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b740 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2b750 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2b760 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
2b770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2b780 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2b790 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20   unixLock,      
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b7b0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b7c0 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   nfsUnlock,     
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b7e0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2b7f0 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
2b800 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a  rvedLock,     /*
2b810 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2b820 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b830 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2b840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2b850 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
2b860 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
2b870 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b880 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b890 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b8a0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
2b8b0 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
2b8c0 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
2b8d0 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
2b8e0 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
2b8f0 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
2b900 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
2b910 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
2b920 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
2b930 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
2b940 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
2b950 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
2b960 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
2b970 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e  is for MacOSX on
2b980 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ly..*/.static co
2b990 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2b9a0 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b  ethods *autolock
2b9b0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
2b9c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
2b9d0 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
2b9e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2b9f0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
2ba00 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
2ba10 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65      /* open file
2ba20 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20   object for the 
2ba30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2ba40 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  .){.  static con
2ba50 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e  st struct Mappin
2ba60 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  g {.    const ch
2ba70 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b  ar *zFilesystem;
2ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ba90 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65   Filesystem type
2baa0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e   name */.    con
2bab0 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2bac0 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b  thods *pMethods;
2bad0 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74     /* Appropriat
2bae0 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
2baf0 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d   */.  } aMap[] =
2bb00 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20   {.    { "hfs", 
2bb10 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
2bb20 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73  ds },.    { "ufs
2bb30 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
2bb40 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2bb50 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d  afpfs",  &afpIoM
2bb60 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
2bb70 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f  "smbfs",  &afpIo
2bb80 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
2bb90 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f   "webdav", &nolo
2bba0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ckIoMethods },. 
2bbb0 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b     { 0, 0 }.  };
2bbc0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
2bbd0 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
2bbe0 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
2bbf0 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
2bc00 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
2bc10 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
2bc20 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
2bc30 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
2bc40 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
2bc50 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
2bc60 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
2bc70 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
2bc80 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
2bc90 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
2bca0 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73    }.  if( statfs
2bcb0 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e  (filePath, &fsIn
2bcc0 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20  fo) != -1 ){.   
2bcd0 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c   if( fsInfo.f_fl
2bce0 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59  ags & MNT_RDONLY
2bcf0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bd00 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2bd10 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  s;.    }.    for
2bd20 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46  (i=0; aMap[i].zF
2bd30 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b  ilesystem; i++){
2bd40 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2bd50 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2bd60 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a  ename, aMap[i].z
2bd70 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29  Filesystem)==0 )
2bd80 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2bd90 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64   aMap[i].pMethod
2bda0 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  s;.      }.    }
2bdb0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75  .  }..  /* Defau
2bdc0 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73  lt case. Handles
2bdd0 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73  , amongst others
2bde0 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65  , "nfs"..  ** Te
2bdf0 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  st byte-range lo
2be00 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29  ck using fcntl()
2be10 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75  . If the call su
2be20 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73  cceeds, .  ** as
2be30 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66 69  sume that the fi
2be40 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
2be50 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  ts POSIX style l
2be60 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f  ocks. .  */.  lo
2be70 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2be80 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2be90 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2bea0 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2beb0 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2bec0 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2bed0 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2bee0 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2bef0 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2bf00 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66  )!=-1 ) {.    if
2bf10 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2bf20 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e  f_fstypename, "n
2bf30 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  fs")==0 ){.     
2bf40 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65   return &nfsIoMe
2bf50 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73  thods;.    } els
2bf60 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e {.      return
2bf70 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2bf80 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2bf90 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74  .    return &dot
2bfa0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2bfb0 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2bfc0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2bfd0 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2bfe0 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65   autolockIoFinde
2bff0 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
2c000 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f  nixFile*) = auto
2c010 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
2c020 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  ;..#endif /* def
2c030 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2c040 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2c050 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
2c060 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  /..#if OS_VXWORK
2c070 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69  S./*.** This "fi
2c080 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66  nder" function f
2c090 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b  or VxWorks check
2c0a0 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69  s to see if posi
2c0b0 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f  x advisory.** lo
2c0c0 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66  cking works.  If
2c0d0 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74   it does, then t
2c0e0 68 61 74 20 69 73 20 77 68 61 74 20 69 73 20 75  hat is what is u
2c0f0 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73  sed.  If it does
2c100 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68   not.** work, th
2c110 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e  en fallback to n
2c120 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
2c130 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ocking..*/.stati
2c140 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2c150 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f  io_methods *vxwo
2c160 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  rksIoFinderImpl(
2c170 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
2c180 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
2c190 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
2c1a0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
2c1b0 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
2c1c0 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70         /* the op
2c1d0 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a  en file object *
2c1e0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
2c1f0 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
2c200 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
2c210 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
2c220 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
2c230 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
2c240 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
2c250 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
2c260 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
2c270 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
2c280 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
2c290 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2c2a0 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73  s;.  }..  /* Tes
2c2b0 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20  t if fcntl() is 
2c2c0 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73  supported and us
2c2d0 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f  e POSIX style lo
2c2e0 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77  cks..  ** Otherw
2c2f0 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ise fall back to
2c300 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70   the named semap
2c310 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a  hore method..  *
2c320 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2c330 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2c340 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2c350 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2c360 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2c370 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2c380 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2c390 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2c3a0 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2c3b0 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2c3c0 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2c3d0 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65  xIoMethods;.  }e
2c3e0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
2c3f0 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &semIoMethods;. 
2c400 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73   }.}.static cons
2c410 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2c420 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74  hods .  *(*const
2c430 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72   vxworksIoFinder
2c440 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2c450 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72  ixFile*) = vxwor
2c460 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ksIoFinderImpl;.
2c470 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
2c480 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WORKS */../*.** 
2c490 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70 65  An abstract type
2c4a0 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74   for a pointer t
2c4b0 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66  o an IO method f
2c4c0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a  inder function:.
2c4d0 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74  */.typedef const
2c4e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c4f0 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79  ods *(*finder_ty
2c500 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pe)(const char*,
2c510 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a  unixFile*);.../*
2c520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2c570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c580 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33  ******** sqlite3
2c590 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  _vfs methods ***
2c5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2c5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
2c5c0 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
2c5d0 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65  ntains the imple
2c5e0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74  mentation of met
2c5f0 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73  hods on the.** s
2c600 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63  qlite3_vfs objec
2c610 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  t..*/../*.** Ini
2c620 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74  tialize the cont
2c630 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78  ents of the unix
2c640 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 70  File structure p
2c650 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64  ointed to by pId
2c660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c670 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a  fillInUnixFile(.
2c680 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
2c690 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69  Vfs,      /* Poi
2c6a0 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65  nter to vfs obje
2c6b0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20  ct */.  int h,  
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6d0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
2c6e0 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20  criptor of file 
2c6f0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
2c700 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2c710 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69  pId,      /* Wri
2c720 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69  te to the unixFi
2c730 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65 72  le structure her
2c740 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
2c750 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f  r *zFilename,  /
2c760 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
2c770 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
2c780 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
2c790 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  gs           /* 
2c7a0 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49  Zero or more UNI
2c7b0 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a  XFILE_* values *
2c7c0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c  /.){.  const sql
2c7d0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c7e0 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a  *pLockingStyle;.
2c7f0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2c800 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70   = (unixFile *)p
2c810 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Id;.  int rc = S
2c820 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
2c830 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64  ert( pNew->pInod
2c840 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a  e==NULL );..  /*
2c850 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
2c860 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
2c870 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
2c880 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
2c890 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20  || (ctrlFlags & 
2c8a0 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29  UNIXFILE_NOLOCK)
2c8b0 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  !=0 );..  OSTRAC
2c8c0 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
2c8d0 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
2c8e0 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
2c8f0 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70  h = h;.  pNew->p
2c900 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e  Vfs = pVfs;.  pN
2c910 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
2c920 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63  ename;.  pNew->c
2c930 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63  trlFlags = (u8)c
2c940 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51  trlFlags;.#if SQ
2c950 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2c960 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61  ZE>0.  pNew->mma
2c970 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
2c980 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
2c990 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20  zMmap;.#endif.  
2c9a0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
2c9b0 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c  boolean(((ctrlFl
2c9c0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55  ags & UNIXFILE_U
2c9d0 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20  RI) ? zFilename 
2c9e0 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  : 0),.          
2c9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca00 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
2ca10 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
2ca20 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  ITE) ){.    pNew
2ca30 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
2ca40 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  NIXFILE_PSOW;.  
2ca50 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70  }.  if( strcmp(p
2ca60 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
2ca70 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -excl")==0 ){.  
2ca80 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2ca90 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  s |= UNIXFILE_EX
2caa0 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  CL;.  }..#if OS_
2cab0 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
2cac0 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
2cad0 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
2cae0 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
2caf0 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74  pId==0 ){.    ct
2cb00 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2cb10 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20  ILE_NOLOCK;.    
2cb20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2cb30 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  M_BKPT;.  }.#end
2cb40 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
2cb50 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2cb60 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
2cb70 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
2cb80 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
2cb90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
2cba0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
2cbb0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
2cbc0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
2cbd0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
2cbe0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2cbf0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
2cc00 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
2cc10 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
2cc20 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
2cc30 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
2cc40 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
2cc50 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
2cc60 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
2cc70 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
2cc80 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
2cc90 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
2cca0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
2ccb0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
2ccc0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
2ccd0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
2cce0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2ccf0 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
2cd00 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
2cd10 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
2cd20 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
2cd30 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
2cd40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2cd50 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2cd60 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2cd70 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
2cd80 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
2cd90 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 29  thods.#endif.  )
2cda0 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  {.    unixEnterM
2cdb0 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d  utex();.    rc =
2cdc0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
2cdd0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
2cde0 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
2cdf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ce00 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72      /* If an err
2ce10 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66  or occurred in f
2ce20 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c 20  indInodeInfo(), 
2ce30 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 64  close the file d
2ce40 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20 20  escriptor.      
2ce50 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  ** immediately, 
2ce60 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e 67  before releasing
2ce70 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e 64   the mutex. find
2ce80 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79 20  InodeInfo() may 
2ce90 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69 6e  fail.      ** in
2cea0 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a   two scenarios:.
2ceb0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2cec0 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20 74  *   (a) A call t
2ced0 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65 64  o fstat() failed
2cee0 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62 29  ..      **   (b)
2cef0 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64   A malloc failed
2cf00 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
2cf10 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62 29   ** Scenario (b)
2cf20 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72 20   may only occur 
2cf30 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  if the process i
2cf40 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74 68  s holding no oth
2cf50 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65  er.      ** file
2cf60 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
2cf70 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2cf80 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65 72  le. If there wer
2cf90 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20 20  e other file.   
2cfa0 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
2cfb0 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c 20  s on this file, 
2cfc0 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77  then no malloc w
2cfd0 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65 64  ould be required
2cfe0 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69 6e   by.      ** fin
2cff0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49 66  dInodeInfo(). If
2d000 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
2d010 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20 73  e, it is quite s
2d020 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20 20  afe to close.   
2d030 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20 2d     ** handle h -
2d040 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61 6e   as it is guaran
2d050 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f 73  teed that no pos
2d060 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62 65  ix locks will be
2d070 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20 20   released.      
2d080 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e 0a  ** by doing so..
2d090 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
2d0a0 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28 61  * If scenario (a
2d0b0 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72 72  ) caused the err
2d0c0 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20 61  or then things a
2d0d0 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e 20  re not so safe. 
2d0e0 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  The.      ** imp
2d0f0 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f 6e  licit assumption
2d100 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69 66   here is that if
2d110 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c 20   fstat() fails, 
2d120 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20 20  things are in.  
2d130 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64 20      ** such bad 
2d140 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70 70  shape that dropp
2d150 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74 77  ing a lock or tw
2d160 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  o doesn't matter
2d170 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f 0a   much..      */.
2d180 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2d190 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2d1a0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68 20 3d  NE__);.      h =
2d1b0 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75   -1;.    }.    u
2d1c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d1d0 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  .  }..#if SQLITE
2d1e0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d1f0 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2d200 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 65 6c  (__APPLE__).  el
2d210 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53  se if( pLockingS
2d220 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f 4d 65  tyle == &afpIoMe
2d230 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2d240 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  AFP locking uses
2d250 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2d260 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2d270 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2d280 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63 6b 69   ** the afpLocki
2d290 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20 2a  ngContext..    *
2d2a0 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67  /.    afpLocking
2d2b0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 0a 20  Context *pCtx;. 
2d2c0 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2d2d0 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 20 3d  Context = pCtx =
2d2e0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
2d2f0 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74 78 29  4( sizeof(*pCtx)
2d300 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78   );.    if( pCtx
2d310 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2d320 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2d330 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2d340 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69        /* NB: zFi
2d350 6c 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e  lename exists an
2d360 64 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20  d remains valid 
2d370 75 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69  until the file i
2d380 73 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a  s closed.      *
2d390 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72  * according to r
2d3a0 65 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34  equirement F1114
2d3b0 31 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74  1.  So we do not
2d3c0 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a   need to make a.
2d3d0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
2d3e0 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a   the filename. *
2d3f0 2f 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62  /.      pCtx->db
2d400 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
2d410 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65  ;.      pCtx->re
2d420 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20  served = 0;.    
2d430 20 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a    srandomdev();.
2d440 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d        unixEnterM
2d450 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63  utex();.      rc
2d460 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
2d470 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
2d480 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28  node);.      if(
2d490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2d4a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2d4b0 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63  3_free(pNew->loc
2d4c0 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
2d4d0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
2d4e0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2d4f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68  NE__);.        h
2d500 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20   = -1;.      }. 
2d510 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2d520 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20  tex();        . 
2d530 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
2d540 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
2d550 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f  kingStyle == &do
2d560 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29  tlockIoMethods )
2d570 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65  {.    /* Dotfile
2d580 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2d590 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2d5a0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e  t needs to be in
2d5b0 63 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a  cluded in.    **
2d5c0 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   the dotlockLock
2d5d0 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20  ingContext .    
2d5e0 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f  */.    char *zLo
2d5f0 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20  ckFile;.    int 
2d600 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61  nFilename;.    a
2d610 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
2d620 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65  !=0 );.    nFile
2d630 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
2d640 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
2d650 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
2d660 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
2d670 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c  e3_malloc64(nFil
2d680 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
2d690 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a  zLockFile==0 ){.
2d6a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d6b0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2d6c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2d6d0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d6e0 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b  nFilename, zLock
2d6f0 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f  File, "%s" DOTLO
2d700 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65  CK_SUFFIX, zFile
2d710 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  name);.    }.   
2d720 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f   pNew->lockingCo
2d730 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c  ntext = zLockFil
2d740 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56  e;.  }..#if OS_V
2d750 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66  XWORKS.  else if
2d760 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d770 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73  == &semIoMethods
2d780 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64   ){.    /* Named
2d790 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
2d7a0 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2d7b0 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2d7c0 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69  s to be.    ** i
2d7d0 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73  ncluded in the s
2d7e0 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  emLockingContext
2d7f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78  .    */.    unix
2d800 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2d810 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2d820 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2d830 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2d840 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
2d850 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e  K) && (pNew->pIn
2d860 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29  ode->pSem==NULL)
2d870 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
2d880 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d  zSemName = pNew-
2d890 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
2d8a0 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a  e;.      int n;.
2d8b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2d8c0 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e  printf(MAX_PATHN
2d8d0 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22  AME, zSemName, "
2d8e0 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20  /%s.sem",.      
2d8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d900 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e   pNew->pId->zCan
2d910 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
2d920 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65     for( n=1; zSe
2d930 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a  mName[n]; n++ ).
2d940 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d          if( zSem
2d950 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a  Name[n]=='/' ) z
2d960 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27  SemName[n] = '_'
2d970 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49  ;.      pNew->pI
2d980 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d  node->pSem = sem
2d990 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20  _open(zSemName, 
2d9a0 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31  O_CREAT, 0666, 1
2d9b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65  );.      if( pNe
2d9c0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20  w->pInode->pSem 
2d9d0 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b  == SEM_FAILED ){
2d9e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2d9f0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2da00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  .        pNew->p
2da10 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b  Inode->aSemName[
2da20 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  0] = '\0';.     
2da30 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
2da40 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2da50 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73   }.#endif.  .  s
2da60 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e  toreLastErrno(pN
2da70 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56  ew, 0);.#if OS_V
2da80 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
2da90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2daa0 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62    if( h>=0 ) rob
2dab0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2dac0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2dad0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73    h = -1;.    os
2dae0 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  Unlink(zFilename
2daf0 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  );.    pNew->ctr
2db00 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
2db10 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23  LE_DELETE;.  }.#
2db20 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
2db30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2db40 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
2db50 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2db60 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d  , __LINE__);.  }
2db70 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  else{.    pNew->
2db80 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69  pMethod = pLocki
2db90 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65  ngStyle;.    Ope
2dba0 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
2dbb0 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70    verifyDbFile(p
2dbc0 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  New);.  }.  retu
2dbd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2dbe0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
2dbf0 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  of a directory i
2dc00 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74  n which to put t
2dc10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a  emporary files..
2dc20 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c  ** If no suitabl
2dc30 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
2dc40 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62   directory can b
2dc50 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20  e found, return 
2dc60 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
2dc70 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78  const char *unix
2dc80 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64  TempFileDir(void
2dc90 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
2dca0 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
2dcb0 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
2dcc0 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f    0,.     "/var/
2dcd0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
2dce0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
2dcf0 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a 20 20 7d  p",.     ".".  }
2dd00 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2dd10 20 69 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74   i = 0;.  struct
2dd20 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e   stat buf;.  con
2dd30 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20  st char *zDir = 
2dd40 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
2dd50 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66 28 20 21  ectory;..  if( !
2dd60 61 7a 44 69 72 73 5b 30 5d 20 29 20 61 7a 44 69  azDirs[0] ) azDi
2dd70 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e 76 28 22  rs[0] = getenv("
2dd80 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b  SQLITE_TMPDIR");
2dd90 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 31  .  if( !azDirs[1
2dda0 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20  ] ) azDirs[1] = 
2ddb0 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29  getenv("TMPDIR")
2ddc0 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20  ;.  while(1){.  
2ddd0 20 20 69 66 28 20 7a 44 69 72 21 3d 30 0a 20 20    if( zDir!=0.  
2dde0 20 20 20 26 26 20 6f 73 53 74 61 74 28 7a 44 69     && osStat(zDi
2ddf0 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20 20 20 20  r, &buf)==0.    
2de00 20 26 26 20 53 5f 49 53 44 49 52 28 62 75 66 2e   && S_ISDIR(buf.
2de10 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20 20 26 26  st_mode).     &&
2de20 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72 2c 20   osAccess(zDir, 
2de30 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20  03)==0.    ){.  
2de40 20 20 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b      return zDir;
2de50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2de60 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  >=sizeof(azDirs)
2de70 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
2de80 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ]) ) break;.    
2de90 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 2b  zDir = azDirs[i+
2dea0 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +];.  }.  return
2deb0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
2dec0 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ate a temporary 
2ded0 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75  file name in zBu
2dee0 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65  f.  zBuf must be
2def0 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
2df00 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f   the calling pro
2df10 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65  cess and must be
2df20 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68   big enough to h
2df30 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20  old at least.** 
2df40 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
2df50 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   bytes..*/.stati
2df60 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d  c int unixGetTem
2df70 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20  pname(int nBuf, 
2df80 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 63  char *zBuf){.  c
2df90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2dfa0 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20  .  int iLimit = 
2dfb0 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  0;..  /* It's od
2dfc0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
2dfd0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
2dfe0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
2dff0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
2e000 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
2e010 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
2e020 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
2e030 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
2e040 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
2e050 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 7a  iling. .  */.  z
2e060 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20 20 53 69  Buf[0] = 0;.  Si
2e070 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
2e080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
2e090 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20  RR );..  zDir = 
2e0a0 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2e0b0 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  );.  if( zDir==0
2e0c0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2e0d0 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
2e0e0 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 36  TH;.  do{.    u6
2e0f0 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  4 r;.    sqlite3
2e100 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
2e110 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
2e120 61 73 73 65 72 74 28 20 6e 42 75 66 3e 32 20 29  assert( nBuf>2 )
2e130 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42 75 66 2d  ;.    zBuf[nBuf-
2e140 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  2] = 0;.    sqli
2e150 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
2e160 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  f, zBuf, "%s/"SQ
2e170 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
2e180 52 45 46 49 58 22 25 6c 6c 78 25 63 22 2c 0a 20  REFIX"%llx%c",. 
2e190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1a0 20 20 20 20 7a 44 69 72 2c 20 72 2c 20 30 29 3b      zDir, r, 0);
2e1b0 0a 20 20 20 20 69 66 28 20 7a 42 75 66 5b 6e 42  .    if( zBuf[nB
2e1c0 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28 69 4c 69  uf-2]!=0 || (iLi
2e1d0 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72 65 74 75  mit++)>10 ) retu
2e1e0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2e1f0 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63  .  }while( osAcc
2e200 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29  ess(zBuf,0)==0 )
2e210 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2e220 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c  E_OK;.}..#if SQL
2e230 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2e240 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
2e250 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f  ned(__APPLE__)./
2e260 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20  *.** Routine to 
2e270 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78  transform a unix
2e280 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78  File into a prox
2e290 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69  y-locking unixFi
2e2a0 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  le..** Implement
2e2b0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f  ation in the pro
2e2c0 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e  xy-lock division
2e2d0 2c 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e  , but used by un
2e2e0 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53  ixOpen().** if S
2e2f0 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f  QLITE_PREFER_PRO
2e300 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65  XY_LOCKING is de
2e310 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
2e320 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66   int proxyTransf
2e330 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78  ormUnixFile(unix
2e340 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61  File*, const cha
2e350 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r*);.#endif../*.
2e360 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  ** Search for an
2e370 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73   unused file des
2e380 63 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73  criptor that was
2e390 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64   opened on the d
2e3a0 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65  atabase .** file
2e3b0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20   (not a journal 
2e3c0 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  or master-journa
2e3d0 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69  l file) identifi
2e3e0 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a  ed by pathname.*
2e3f0 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c  * zPath with SQL
2e400 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
2e410 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73  gs matching thos
2e420 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2e430 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
2e440 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
2e450 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20  ion..**.** Such 
2e460 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
2e470 72 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61  r may exist if a
2e480 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2e490 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a  tion was closed.
2e4a0 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63  ** but the assoc
2e4b0 69 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72  iated file descr
2e4c0 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20  iptor could not 
2e4d0 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73  be closed becaus
2e4e0 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  e some.** other 
2e4f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2e500 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
2e510 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67   file is holding
2e520 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a   a file-lock..**
2e530 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e   Refer to commen
2e540 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c  ts in the unixCl
2e550 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61  ose() function a
2e560 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63  nd the lengthy c
2e570 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69  omment.** descri
2e580 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69  bing "Posix Advi
2e590 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74  sory Locking" at
2e5a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2e5b0 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20  is file for .** 
2e5c0 66 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e  further details.
2e5d0 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34   Also, ticket #4
2e5e0 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  018..**.** If a 
2e5f0 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65  suitable file de
2e600 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e  scriptor is foun
2e610 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65  d, then it is re
2e620 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a  turned. If no.**
2e630 20 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72   such file descr
2e640 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64  iptor is located
2e650 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  , -1 is returned
2e660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78  ..*/.static Unix
2e670 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65  UnusedFd *findRe
2e680 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63  usableFd(const c
2e690 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20  har *zPath, int 
2e6a0 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e  flags){.  UnixUn
2e6b0 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
2e6c0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f  = 0;..  /* Do no
2e6d0 74 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20  t search for an 
2e6e0 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
2e6f0 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b  riptor on vxwork
2e700 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20  s. Not because. 
2e710 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c   ** vxworks woul
2e720 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72  d not benefit fr
2e730 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69  om the change (i
2e740 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e  t might, we're n
2e750 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62  ot sure),.  ** b
2e760 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61  ut because no wa
2e770 79 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20  y to test it is 
2e780 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61  currently availa
2e790 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65  ble. It is bette
2e7a0 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72  r .  ** not to r
2e7b0 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77  isk breaking vxw
2e7c0 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72  orks support for
2e7d0 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63   the sake of suc
2e7e0 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20  h an obscure .  
2e7f0 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a  ** feature.  */.
2e800 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a  #if !OS_VXWORKS.
2e810 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2e820 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
2e830 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2e840 73 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c  s of stat() call
2e850 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e 74 65 72   */..  unixEnter
2e860 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 41  Mutex();..  /* A
2e870 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
2e880 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
2e890 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
2e8a0 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
2e8b0 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
2e8c0 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
2e8d0 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
2e8e0 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
2e8f0 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
2e900 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
2e910 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
2e920 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
2e930 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
2e940 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
2e950 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
2e960 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
2e970 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
2e980 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
2e990 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
2e9a0 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
2e9b0 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
2e9c0 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
2e9d0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
2e9e0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
2e9f0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
2ea00 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
2ea10 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
2ea20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
2ea30 67 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65  g for a reusable
2ea40 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ea50 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
2ea60 2a 2f 0a 20 20 69 66 28 20 6e 55 6e 75 73 65 64  */.  if( nUnused
2ea70 46 64 3e 30 20 26 26 20 30 3d 3d 6f 73 53 74 61  Fd>0 && 0==osSta
2ea80 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
2ea90 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64   ){.    unixInod
2eaa0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a  eInfo *pInode;..
2eab0 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f      pInode = ino
2eac0 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c  deList;.    whil
2ead0 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49  e( pInode && (pI
2eae0 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76  node->fileId.dev
2eaf0 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20  !=sStat.st_dev. 
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb10 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66      || pInode->f
2eb20 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75 36 34 29  ileId.ino!=(u64)
2eb30 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
2eb40 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
2eb50 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
2eb60 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
2eb70 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
2eb80 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
2eb90 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
2eba0 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
2ebb0 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
2ebc0 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
2ebd0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
2ebe0 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
2ebf0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
2ec00 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
2ec10 20 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a     nUnusedFd--;.
2ec20 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55          *pp = pU
2ec30 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  nused->pNext;.  
2ec40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2ec50 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2ec60 28 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a  ();.#endif    /*
2ec70 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20   if !OS_VXWORKS 
2ec80 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75  */.  return pUnu
2ec90 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  sed;.}../*.** Fi
2eca0 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64  nd the mode, uid
2ecb0 20 61 6e 64 20 67 69 64 20 6f 66 20 66 69 6c 65   and gid of file
2ecc0 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73 74 61 74   zFile. .*/.stat
2ecd0 69 63 20 69 6e 74 20 67 65 74 46 69 6c 65 4d 6f  ic int getFileMo
2ece0 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
2ecf0 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *zFile,        
2ed00 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6e 61        /* File na
2ed10 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  me */.  mode_t *
2ed20 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2ed30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2ed40 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 7a  Permissions of z
2ed50 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64 5f 74 20  File */.  uid_t 
2ed60 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20  *pUid,          
2ed70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2ed80 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20  : uid of zFile. 
2ed90 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64  */.  gid_t *pGid
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edb0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64       /* OUT: gid
2edc0 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 29 7b   of zFile. */.){
2edd0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
2ede0 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2edf0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20     /* Output of 
2ee00 73 74 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61  stat() on databa
2ee10 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2ee20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2ee30 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
2ee40 28 7a 46 69 6c 65 2c 20 26 73 53 74 61 74 29 20  (zFile, &sStat) 
2ee50 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
2ee60 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
2ee70 30 37 37 37 3b 0a 20 20 20 20 2a 70 55 69 64 20  0777;.    *pUid 
2ee80 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a  = sStat.st_uid;.
2ee90 20 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61      *pGid = sSta
2eea0 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d 65 6c 73  t.st_gid;.  }els
2eeb0 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
2eec0 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
2eed0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2eee0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2eef0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2ef00 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
2ef10 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2ef20 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
2ef30 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
2ef40 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
2ef50 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
2ef60 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
2ef70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
2ef80 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
2ef90 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
2efa0 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
2efb0 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
2efc0 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
2efd0 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
2efe0 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
2eff0 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
2f000 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
2f010 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
2f020 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
2f030 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
2f040 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
2f050 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
2f060 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
2f070 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
2f080 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
2f090 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
2f0a0 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
2f0b0 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
2f0c0 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
2f0d0 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
2f0e0 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
2f0f0 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
2f100 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
2f110 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
2f120 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
2f130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
2f140 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
2f150 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
2f160 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
2f170 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
2f180 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
2f190 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
2f1a0 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
2f1b0 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
2f1c0 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
2f1d0 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
2f1e0 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
2f1f0 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
2f200 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
2f210 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
2f220 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
2f230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2f240 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
2f250 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
2f260 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
2f270 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
2f280 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
2f290 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
2f2a0 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
2f2b0 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
2f2c0 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
2f2d0 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
2f2e0 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
2f2f0 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
2f300 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
2f310 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
2f320 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
2f330 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
2f340 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
2f350 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
2f360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
2f370 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
2f380 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
2f390 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
2f3a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
2f3b0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2f3c0 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
2f3d0 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
2f3e0 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
2f3f0 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
2f400 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2f410 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
2f420 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
2f430 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f450 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
2f460 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
2f470 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
2f480 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
2f490 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
2f4a0 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
2f4b0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
2f4c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2f4d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2f4e0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
2f4f0 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
2f500 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
2f510 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
2f520 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
2f530 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
2f540 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
2f550 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
2f560 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
2f570 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
2f580 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
2f590 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
2f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f5b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
2f5c0 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
2f5d0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74   */..    /* zPat
2f5e0 68 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61  h is a path to a
2f5f0 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20   WAL or journal 
2f600 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  file. The follow
2f610 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65  ing block derive
2f620 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74  s.    ** the pat
2f630 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  h to the associa
2f640 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
2f650 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68  e from zPath. Th
2f660 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73  is block handles
2f670 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c  .    ** the foll
2f680 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e  owing naming con
2f690 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a  ventions:.    **
2f6a0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f6b0 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22   to db>-journal"
2f6c0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
2f6d0 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20   to db>-wal".   
2f6e0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
2f6f0 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20  db>-journalNN". 
2f700 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
2f710 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20  o db>-walNN".   
2f720 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65   **.    ** where
2f730 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c   NN is a decimal
2f740 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20   number. The NN 
2f750 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61  naming schemes a
2f760 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20  re .    ** used 
2f770 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74  by the test_mult
2f780 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a  iplex.c module..
2f790 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d      */.    nDb =
2f7a0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
2f7b0 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 20 20  (zPath) - 1; .  
2f7c0 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e    while( zPath[n
2f7d0 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  Db]!='-' ){.    
2f7e0 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61 6c 20 6f    /* In normal o
2f7f0 70 65 72 61 74 69 6f 6e 2c 20 74 68 65 20 6a 6f  peration, the jo
2f800 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
2f810 77 69 6c 6c 20 61 6c 77 61 79 73 20 63 6f 6e 74  will always cont
2f820 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 27  ain.      ** a '
2f830 2d 27 20 63 68 61 72 61 63 74 65 72 2e 20 20 48  -' character.  H
2f840 6f 77 65 76 65 72 20 69 6e 20 38 2b 33 20 66 69  owever in 8+3 fi
2f850 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c 20 6f 72 20  lename mode, or 
2f860 69 66 20 61 20 63 6f 72 72 75 70 74 0a 20 20 20  if a corrupt.   
2f870 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a     ** rollback j
2f880 6f 75 72 6e 61 6c 20 73 70 65 63 69 66 69 65 73  ournal specifies
2f890 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
2f8a0 6c 20 77 69 74 68 20 61 20 67 6f 6f 66 79 20 6e  l with a goofy n
2f8b0 61 6d 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20  ame, then.      
2f8c0 2a 2a 20 74 68 65 20 27 2d 27 20 6d 69 67 68 74  ** the '-' might
2f8d0 20 62 65 20 6d 69 73 73 69 6e 67 2e 20 2a 2f 0a   be missing. */.
2f8e0 20 20 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30        if( nDb==0
2f8f0 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d   || zPath[nDb]==
2f900 27 2e 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c  '.' ) return SQL
2f910 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 6e 44  ITE_OK;.      nD
2f920 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  b--;.    }.    m
2f930 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74 68  emcpy(zDb, zPath
2f940 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62 5b  , nDb);.    zDb[
2f950 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20  nDb] = '\0';..  
2f960 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d 6f    rc = getFileMo
2f970 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65 2c 20 70  de(zDb, pMode, p
2f980 55 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 7d 65  Uid, pGid);.  }e
2f990 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
2f9a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
2f9b0 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20  TEONCLOSE ){.   
2f9c0 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a   *pMode = 0600;.
2f9d0 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2f9e0 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f9f0 55 52 49 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  URI ){.    /* If
2fa00 20 74 68 69 73 20 69 73 20 61 20 6d 61 69 6e 20   this is a main 
2fa10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
2fa20 64 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f  d the file was o
2fa30 70 65 6e 65 64 20 75 73 69 6e 67 20 61 20 55 52  pened using a UR
2fa40 49 0a 20 20 20 20 2a 2a 20 66 69 6c 65 6e 61 6d  I.    ** filenam
2fa50 65 2c 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65  e, check for the
2fa60 20 22 6d 6f 64 65 6f 66 22 20 70 61 72 61 6d 65   "modeof" parame
2fa70 74 65 72 2e 20 49 66 20 70 72 65 73 65 6e 74 2c  ter. If present,
2fa80 20 69 6e 74 65 72 70 72 65 74 0a 20 20 20 20 2a   interpret.    *
2fa90 2a 20 69 74 73 20 76 61 6c 75 65 20 61 73 20 61  * its value as a
2faa0 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 74 72   filename and tr
2fab0 79 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6d 6f  y to copy the mo
2fac0 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20  de, uid and gid 
2fad0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 61 74  from.    ** that
2fae0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 63   file.  */.    c
2faf0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
2fb00 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
2fb10 65 74 65 72 28 7a 50 61 74 68 2c 20 22 6d 6f 64  eter(zPath, "mod
2fb20 65 6f 66 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  eof");.    if( z
2fb30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67   ){.      rc = g
2fb40 65 74 46 69 6c 65 4d 6f 64 65 28 7a 2c 20 70 4d  etFileMode(z, pM
2fb50 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29  ode, pUid, pGid)
2fb60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
2fb70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2fb80 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  * Open the file 
2fb90 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72  zPath..** .** Pr
2fba0 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51  eviously, the SQ
2fbb0 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73  Lite OS layer us
2fbc0 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f  ed three functio
2fbd0 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74  ns in place of t
2fbe0 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a  his.** one:.**.*
2fbf0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2fc00 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a  penReadWrite();.
2fc10 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
2fc20 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a  OpenReadOnly();.
2fc30 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
2fc40 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b  OpenExclusive();
2fc50 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c  .**.** These cal
2fc60 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f  ls correspond to
2fc70 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
2fc80 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66  ombinations of f
2fc90 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lags:.**.**     
2fca0 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20  ReadWrite() ->  
2fcb0 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20     (READWRITE | 
2fcc0 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52  CREATE).**     R
2fcd0 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20  eadOnly()  ->   
2fce0 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a    (READONLY) .**
2fcf0 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69       OpenExclusi
2fd00 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49  ve() -> (READWRI
2fd10 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58  TE | CREATE | EX
2fd20 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54  CLUSIVE).**.** T
2fd30 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75  he old OpenExclu
2fd40 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20  sive() accepted 
2fd50 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65  a boolean argume
2fd60 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20  nt - "delFlag". 
2fd70 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20  If.** true, the 
2fd80 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75  file was configu
2fd90 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61  red to be automa
2fda0 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
2fdb0 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65  when the.** file
2fdc0 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20   handle closed. 
2fdd0 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73  To achieve the s
2fde0 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67  ame effect using
2fdf0 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e   this new .** in
2fe00 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65  terface, add the
2fe10 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66   DELETEONCLOSE f
2fe20 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65  lag to those spe
2fe30 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72  cified above for
2fe40 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69   .** OpenExclusi
2fe50 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ve()..*/.static 
2fe60 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20  int unixOpen(.  
2fe70 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2fe80 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2fe90 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63  The VFS for whic
2fea0 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f  h this is the xO
2feb0 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  pen method */.  
2fec0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2fed0 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  h,           /* 
2fee0 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65  Pathname of file
2fef0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
2ff00 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2ff10 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
2ff20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
2ff30 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c  riptor to be fil
2ff40 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20  led in */.  int 
2ff50 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2ff60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
2ff70 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72  t flags to contr
2ff80 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a  ol the opening *
2ff90 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61  /.  int *pOutFla
2ffa0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
2ffb0 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73   /* Output flags
2ffc0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c   returned to SQL
2ffd0 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20  ite core */.){. 
2ffe0 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
2fff0 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65  unixFile *)pFile
30000 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b  ;.  int fd = -1;
30010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30020 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
30030 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62  iptor returned b
30040 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  y open() */.  in
30050 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b  t openFlags = 0;
30060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30070 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
30080 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
30090 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
300a0 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFFFFFF00;  /* T
300b0 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
300c0 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c  pen */.  int noL
300d0 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
300e0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
300f0 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20  to omit locking 
30100 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20  primitives */.  
30110 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
30120 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  OK;            /
30130 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72  * Function Retur
30140 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n Code */.  int 
30150 63 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20  ctrlFlags = 0;  
30160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e             /* UN
30170 49 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a  IXFILE_* flags *
30180 2f 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75  /..  int isExclu
30190 73 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26  sive  = (flags &
301a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
301b0 4c 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69  LUSIVE);.  int i
301c0 73 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66  sDelete     = (f
301d0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
301e0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
301f0 29 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74  );.  int isCreat
30200 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
30210 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
30220 41 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65  ATE);.  int isRe
30230 61 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67  adonly   = (flag
30240 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
30250 52 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74  READONLY);.  int
30260 20 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20   isReadWrite  = 
30270 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
30280 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b  OPEN_READWRITE);
30290 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
302a0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
302b0 0a 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f  .  int isAutoPro
302c0 78 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  xy  = (flags & S
302d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
302e0 52 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ROXY);.#endif.#i
302f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
30300 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  E__) || SQLITE_E
30310 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
30320 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61  YLE.  struct sta
30330 74 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64  tfs fsInfo;.#end
30340 69 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61  if..  /* If crea
30350 74 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72  ting a master or
30360 20 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e   main-file journ
30370 61 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  al, this functio
30380 6e 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a  n will open.  **
30390 20 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74   a file-descript
303a0 6f 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74  or on the direct
303b0 6f 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72  ory too. The fir
303c0 73 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63  st time unixSync
303d0 28 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65  ().  ** is calle
303e0 64 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  d the directory 
303f0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
30400 77 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65  will be fsync()e
30410 64 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a  d and close()d..
30420 20 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4e 65 77    */.  int isNew
30430 4a 72 6e 6c 20 3d 20 28 69 73 43 72 65 61 74 65  Jrnl = (isCreate
30440 20 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54   && (.        eT
30450 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
30460 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
30470 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
30480 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30490 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
304a0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
304b0 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a  OPEN_WAL.  ));..
304c0 20 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74    /* If argument
304d0 20 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c   zPath is a NULL
304e0 20 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66   pointer, this f
304f0 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69  unction is requi
30500 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  red to open.  **
30510 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
30520 65 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66  e. Use this buff
30530 65 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  er to store the 
30540 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20  file name in..  
30550 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  */.  char zTmpna
30560 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
30570 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  2];.  const char
30580 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b   *zName = zPath;
30590 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65  ..  /* Check the
305a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
305b0 6d 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20  ments are true: 
305c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29  .  **.  **   (a)
305d0 20 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20   Exactly one of 
305e0 74 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e  the READWRITE an
305f0 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73  d READONLY flags
30600 20 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e   must be set, an
30610 64 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66  d .  **   (b) if
30620 20 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20   CREATE is set, 
30630 74 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d  then READWRITE m
30640 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c  ust also be set,
30650 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20   and.  **   (c) 
30660 69 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20  if EXCLUSIVE is 
30670 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45  set, then CREATE
30680 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65   must also be se
30690 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66  t..  **   (d) if
306a0 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69   DELETEONCLOSE i
306b0 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41  s set, then CREA
306c0 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
306d0 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  set..  */.  asse
306e0 72 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d  rt((isReadonly==
306f0 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
30700 3d 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57  ==0) && (isReadW
30710 72 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e  rite || isReadon
30720 6c 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ly));.  assert(i
30730 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73  sCreate==0 || is
30740 52 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73  ReadWrite);.  as
30750 73 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65  sert(isExclusive
30760 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
30770 3b 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c  ;.  assert(isDel
30780 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ete==0 || isCrea
30790 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  te);..  /* The m
307a0 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75  ain DB, main jou
307b0 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61  rnal, WAL file a
307c0 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nd master journa
307d0 6c 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a  l are never .  *
307e0 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * automatically 
307f0 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65  deleted. Nor are
30800 20 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f   they ever tempo
30810 72 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a  rary files.  */.
30820 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
30830 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
30840 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
30850 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a  OPEN_MAIN_DB );.
30860 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
30870 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
30880 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
30890 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
308a0 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
308b0 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
308c0 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
308d0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
308e0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
308f0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
30900 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
30910 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
30920 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73  _WAL );..  /* As
30930 73 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70  sert that the up
30940 70 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65  per layer has se
30950 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69  t one of the "fi
30960 6c 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20  le-type" flags. 
30970 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  */.  assert( eTy
30980 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
30990 4d 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20  MAIN_DB      || 
309a0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
309b0 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20  EN_TEMP_DB .    
309c0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
309d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
309e0 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  URNAL || eType==
309f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
30a00 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
30a10 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30a20 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
30a30 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  L   || eType==SQ
30a40 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
30a50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20  _JOURNAL .      
30a60 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
30a70 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
30a80 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51  _DB || eType==SQ
30a90 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20  LITE_OPEN_WAL.  
30aa0 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74 20  );..  /* Detect 
30ab0 61 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e 64  a pid change and
30ac0 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
30ad0 20 20 54 68 65 72 65 20 69 73 20 61 20 72 61 63    There is a rac
30ae0 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a  e condition.  **
30af0 20 68 65 72 65 20 73 75 63 68 20 74 68 61 74 20   here such that 
30b00 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65  two or more thre
30b10 61 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20 74  ads all trying t
30b20 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 73  o open databases
30b30 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d   at.  ** the sam
30b40 65 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74 20  e instant might 
30b50 61 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50 52  all reset the PR
30b60 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70 6c  NG.  But multipl
30b70 65 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61 72  e resets.  ** ar
30b80 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f  e harmless..  */
30b90 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73  .  if( randomnes
30ba0 73 50 69 64 21 3d 6f 73 47 65 74 70 69 64 28 30  sPid!=osGetpid(0
30bb0 29 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e  ) ){.    randomn
30bc0 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69  essPid = osGetpi
30bd0 64 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  d(0);.    sqlite
30be0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
30bf0 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  );.  }.  memset(
30c00 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
30c10 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
30c20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30c30 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
30c40 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
30c50 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
30c60 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
30c70 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
30c80 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
30c90 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
30ca0 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
30cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30cc0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
30cd0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
30ce0 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
30cf0 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65       if( !pUnuse
30d00 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
30d10 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
30d20 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
30d30 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 65     }.    p->pPre
30d40 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20  allocatedUnused 
30d50 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20  = pUnused;..    
30d60 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
30d70 6e 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65  names are double
30d80 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64  -zero terminated
30d90 20 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74   if they are not
30da0 0a 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74  .    ** URIs wit
30db0 68 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48  h parameters.  H
30dc0 65 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61  ence, they can a
30dd0 6c 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20  lways be passed 
30de0 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  into.    ** sqli
30df0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
30e00 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  r(). */.    asse
30e10 72 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c  rt( (flags & SQL
30e20 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
30e30 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e   zName[strlen(zN
30e40 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20  ame)+1]==0 );.. 
30e50 20 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d   }else if( !zNam
30e60 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a  e ){.    /* If z
30e70 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Name is NULL, th
30e80 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73  e upper layer is
30e90 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65   requesting a te
30ea0 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  mp file. */.    
30eb0 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20  assert(isDelete 
30ec0 26 26 20 21 69 73 4e 65 77 4a 72 6e 6c 29 3b 0a  && !isNewJrnl);.
30ed0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74      rc = unixGet
30ee0 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d  Tempname(pVfs->m
30ef0 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e  xPathname, zTmpn
30f00 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
30f10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30f20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30f30 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
30f40 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20  = zTmpname;..   
30f50 20 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65   /* Generated te
30f60 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65  mporary filename
30f70 73 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75  s are always dou
30f80 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
30f90 74 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75  ted.    ** for u
30fa0 73 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72  se by sqlite3_ur
30fb0 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a  i_parameter(). *
30fc0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e  /.    assert( zN
30fd0 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
30fe0 29 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a  )+1]==0 );.  }..
30ff0 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74    /* Determine t
31000 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
31010 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  flags parameter 
31020 70 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20  passed to POSIX 
31030 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70  function.  ** op
31040 65 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74  en(). These must
31050 20 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65   be calculated e
31060 76 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73  ven if open() is
31070 20 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a   not called, as.
31080 20 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65    ** they may be
31090 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
310a0 6f 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  of the file hand
310b0 6c 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74  le and used by t
310c0 68 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20  he .  ** 'conch 
310d0 66 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75  file' locking fu
310e0 6e 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e  nctions later on
310f0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65  .  */.  if( isRe
31100 61 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c  adonly )  openFl
31110 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b  ags |= O_RDONLY;
31120 0a 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69  .  if( isReadWri
31130 74 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c  te ) openFlags |
31140 3d 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20  = O_RDWR;.  if( 
31150 69 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70  isCreate )    op
31160 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45  enFlags |= O_CRE
31170 41 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c  AT;.  if( isExcl
31180 75 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67  usive ) openFlag
31190 73 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e  s |= (O_EXCL|O_N
311a0 4f 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e  OFOLLOW);.  open
311b0 46 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47  Flags |= (O_LARG
311c0 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b  EFILE|O_BINARY);
311d0 0a 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ..  if( fd<0 ){.
311e0 20 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d      mode_t openM
311f0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
31200 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73    /* Permissions
31210 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20   to create file 
31220 77 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f  with */.    uid_
31230 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20  t uid;          
31240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
31250 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rid for the file
31260 20 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69   */.    gid_t gi
31270 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
31280 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64        /* Groupid
31290 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f   for the file */
312a0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72  .    rc = findCr
312b0 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61  eateFileMode(zNa
312c0 6d 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e  me, flags, &open
312d0 4d 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64  Mode, &uid, &gid
312e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
312f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31300 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 50    assert( !p->pP
31310 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
31320 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
31330 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
31340 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79  _OPEN_WAL || eTy
31350 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
31360 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
31370 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
31380 0a 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20  .    }.    fd = 
31390 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d  robust_open(zNam
313a0 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70  e, openFlags, op
313b0 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54  enMode);.    OST
313c0 52 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25  RACE(("OPENX   %
313d0 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66  -3d %s 0%o\n", f
313e0 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  d, zName, openFl
313f0 61 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65 72  ags));.    asser
31400 74 28 20 21 69 73 45 78 63 6c 75 73 69 76 65 20  t( !isExclusive 
31410 7c 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20  || (openFlags & 
31420 4f 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a 20  O_CREAT)!=0 );. 
31430 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
31440 20 20 20 20 20 69 66 28 20 69 73 4e 65 77 4a 72       if( isNewJr
31450 6e 6c 20 26 26 20 65 72 72 6e 6f 3d 3d 45 41 43  nl && errno==EAC
31460 43 45 53 20 26 26 20 6f 73 41 63 63 65 73 73 28  CES && osAccess(
31470 7a 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 7b 0a  zName, F_OK) ){.
31480 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 75 6e          /* If un
31490 61 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61  able to create a
314a0 20 6a 6f 75 72 6e 61 6c 20 62 65 63 61 75 73 65   journal because
314b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
314c0 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a  s not.        **
314d0 20 77 72 69 74 61 62 6c 65 2c 20 63 68 61 6e 67   writable, chang
314e0 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  e the error code
314f0 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
31500 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  t. */.        rc
31510 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
31520 4c 59 5f 44 49 52 45 43 54 4f 52 59 3b 0a 20 20  LY_DIRECTORY;.  
31530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 72      }else if( er
31540 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
31550 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
31560 20 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20        /* Failed 
31570 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
31580 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
31590 61 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64  access. Try read
315a0 2d 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20  -only. */.      
315b0 20 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c    flags &= ~(SQL
315c0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
315d0 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
315e0 52 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20  REATE);.        
315f0 6f 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f  openFlags &= ~(O
31600 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a  _RDWR|O_CREAT);.
31610 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d          flags |=
31620 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
31630 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 6f  DONLY;.        o
31640 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
31650 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 69 73  ONLY;.        is
31660 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
31670 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73        fd = robus
31680 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
31690 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
316a0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
316b0 7d 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  }.    if( fd<0 )
316c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20  {.      int rc2 
316d0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
316e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
316f0 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61  KPT, "open", zNa
31700 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  me);.      if( r
31710 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
31720 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 67  c = rc2;.      g
31730 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65  oto open_finishe
31740 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  d;.    }..    /*
31750 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73   If this process
31760 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72   is running as r
31770 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74  oot and if creat
31780 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61  ing a new rollba
31790 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  ck.    ** journa
317a0 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73  l or WAL file, s
317b0 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70  et the ownership
317c0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
317d0 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20  or WAL to be.   
317e0 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20   ** the same as 
317f0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
31800 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  abase..    */.  
31810 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
31820 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
31830 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
31840 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
31850 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 66    robustFchown(f
31860 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20  d, uid, gid);.  
31870 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
31880 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ( fd>=0 );.  if(
31890 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20   pOutFlags ){.  
318a0 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66    *pOutFlags = f
318b0 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  lags;.  }..  if(
318c0 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65   p->pPreallocate
318d0 64 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70  dUnused ){.    p
318e0 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
318f0 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
31900 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63      p->pPrealloc
31910 61 74 65 64 55 6e 75 73 65 64 2d 3e 66 6c 61 67  atedUnused->flag
31920 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a  s = flags;.  }..
31930 20 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29    if( isDelete )
31940 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
31950 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61  .    zPath = zNa
31960 6d 65 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  me;.#elif define
31970 64 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f  d(SQLITE_UNLINK_
31980 41 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20  AFTER_CLOSE).   
31990 20 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33   zPath = sqlite3
319a0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
319b0 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a  Name);.    if( z
319c0 50 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Path==0 ){.     
319d0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c   robust_close(p,
319e0 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a   fd, __LINE__);.
319f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31a00 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
31a10 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
31a20 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b  osUnlink(zName);
31a30 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
31a40 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
31a50 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
31a60 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
31a70 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
31a80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
31a90 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
31aa0 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
31ab0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
31ac0 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61  STYLE.  if( fsta
31ad0 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29  tfs(fd, &fsInfo)
31ae0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74   == -1 ){.    st
31af0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20  oreLastErrno(p, 
31b00 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75  errno);.    robu
31b10 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20  st_close(p, fd, 
31b20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72  __LINE__);.    r
31b30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
31b40 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  RR_ACCESS;.  }. 
31b50 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
31b60 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66  p("msdos", fsInf
31b70 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
31b80 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
31b90 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
31ba0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
31bb0 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
31bc0 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d  ;.  }.  if (0 ==
31bd0 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22   strncmp("exfat"
31be0 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  , fsInfo.f_fstyp
31bf0 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20  ename, 5)) {.   
31c00 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69   ((unixFile*)pFi
31c10 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20  le)->fsFlags |= 
31c20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
31c30 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e  S_MSDOS;.  }.#en
31c40 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70  dif..  /* Set up
31c50 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72   appropriate ctr
31c60 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20  lFlags */.  if( 
31c70 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20  isDelete )      
31c80 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
31c90 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
31ca0 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73  DELETE;.  if( is
31cb0 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20  Readonly )      
31cc0 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67          ctrlFlag
31cd0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44  s |= UNIXFILE_RD
31ce0 4f 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ONLY;.  noLock =
31cf0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
31d00 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20 20 69  PEN_MAIN_DB;.  i
31d10 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20  f( noLock )     
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
31d30 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
31d40 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28  LE_NOLOCK;.  if(
31d50 20 69 73 4e 65 77 4a 72 6e 6c 20 29 20 20 20 20   isNewJrnl )    
31d60 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
31d70 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
31d80 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20  _DIRSYNC;.  if( 
31d90 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
31da0 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c  PEN_URI ) ctrlFl
31db0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
31dc0 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  URI;..#if SQLITE
31dd0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
31de0 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45  STYLE.#if SQLITE
31df0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
31e00 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72  CKING.  isAutoPr
31e10 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  oxy = 1;.#endif.
31e20 20 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78    if( isAutoProx
31e30 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c  y && (zPath!=NUL
31e40 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20  L) && (!noLock) 
31e50 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29  && pVfs->xOpen )
31e60 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66  {.    char *envf
31e70 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53  orce = getenv("S
31e80 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
31e90 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20  Y_LOCKING");.   
31ea0 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20   int useProxy = 
31eb0 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  0;..    /* SQLIT
31ec0 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
31ed0 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66  CKING==1 means f
31ee0 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20  orce always use 
31ef0 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a  proxy, 0 means .
31f00 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65      ** never use
31f10 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61   proxy, NULL mea
31f20 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72  ns use proxy for
31f30 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73   non-local files
31f40 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69   only.  */.    i
31f50 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c  f( envforce!=NUL
31f60 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72  L ){.      usePr
31f70 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f  oxy = atoi(envfo
31f80 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73  rce)>0;.    }els
31f90 65 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78  e{.      useProx
31fa0 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66  y = !(fsInfo.f_f
31fb0 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b  lags&MNT_LOCAL);
31fc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
31fd0 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20  seProxy ){.     
31fe0 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78   rc = fillInUnix
31ff0 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70  File(pVfs, fd, p
32000 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72  File, zPath, ctr
32010 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  lFlags);.      i
32020 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32030 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
32040 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55   proxyTransformU
32050 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c  nixFile((unixFil
32060 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f  e*)pFile, ":auto
32070 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  :");.        if(
32080 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32090 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  {.          /* U
320a0 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20  se unixClose to 
320b0 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73  clean up the res
320c0 6f 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20  ources added in 
320d0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a  fillInUnixFile .
320e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64            ** and
320f0 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73   clear all the s
32100 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72  tructure's refer
32110 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63  ences.  Specific
32120 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20  ally, .         
32130 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68   ** pFile->pMeth
32140 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c  ods will be NULL
32150 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f   so sqlite3OsClo
32160 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d  se will be a no-
32170 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  op .          */
32180 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43  .          unixC
32190 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20  lose(pFile);.   
321a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
321b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
321c0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f    }.      goto o
321d0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20  pen_finished;.  
321e0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
321f0 20 0a 20 20 61 73 73 65 72 74 28 20 7a 50 61 74   .  assert( zPat
32200 68 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 30 5d  h==0 || zPath[0]
32210 3d 3d 27 2f 27 20 0a 20 20 20 20 20 20 7c 7c 20  =='/' .      || 
32220 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
32230 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
32240 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
32250 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
32260 52 4e 41 4c 20 0a 20 20 29 3b 0a 20 20 72 63 20  RNAL .  );.  rc 
32270 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
32280 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
32290 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
322a0 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73  gs);..open_finis
322b0 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  hed:.  if( rc!=S
322c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
322d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
322e0 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
322f0 73 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  sed);.  }.  retu
32300 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
32310 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   Delete the file
32320 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68   at zPath. If th
32330 65 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65  e dirSync argume
32340 6e 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e  nt is true, fsyn
32350 63 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  c().** the direc
32360 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
32370 69 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ing the file..*/
32380 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32390 44 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65  Delete(.  sqlite
323a0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
323b0 20 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61      /* VFS conta
323c0 69 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68  ining this as th
323d0 65 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64  e xDelete method
323e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
323f0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
32400 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20  /* Name of file 
32410 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f  to be deleted */
32420 0a 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20  .  int dirSync  
32430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32440 49 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  If true, fsync()
32450 20 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72   directory after
32460 20 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a   deleting file *
32470 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
32480 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55  SQLITE_OK;.  UNU
32490 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
324a0 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61  tUsed);.  Simula
324b0 74 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e  teIOError(return
324c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
324d0 4c 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55  LETE);.  if( osU
324e0 6e 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d  nlink(zPath)==(-
324f0 31 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  1) ){.    if( er
32500 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20  rno==ENOENT.#if 
32510 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20  OS_VXWORKS.     
32520 20 20 20 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a     || osAccess(z
32530 50 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69  Path,0)!=0.#endi
32540 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  f.    ){.      r
32550 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
32560 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20  _DELETE_NOENT;. 
32570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32580 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
32590 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  r(SQLITE_IOERR_D
325a0 45 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c  ELETE, "unlink",
325b0 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
325c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
325d0 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
325e0 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
325f0 0a 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20  .  if( (dirSync 
32600 26 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  & 1)!=0 ){.    i
32610 6e 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20  nt fd;.    rc = 
32620 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  osOpenDirectory(
32630 7a 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20  zPath, &fd);.   
32640 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
32650 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
32660 66 75 6c 6c 5f 66 73 79 6e 63 28 66 64 2c 30 2c  full_fsync(fd,0,
32670 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  0) ){.        rc
32680 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
32690 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52  SQLITE_IOERR_DIR
326a0 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c  _FSYNC, "fsync",
326b0 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d   zPath);.      }
326c0 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  .      robust_cl
326d0 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e  ose(0, fd, __LIN
326e0 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E__);.    }else{
326f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
32700 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  c==SQLITE_CANTOP
32710 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  EN );.      rc =
32720 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
32730 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
32740 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
32750 2a 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73  ** Test the exis
32760 74 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65  tence of or acce
32770 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  ss permissions o
32780 66 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68  f file zPath. Th
32790 65 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72  e.** test perfor
327a0 6d 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  med depends on t
327b0 68 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67  he value of flag
327c0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  s:.**.**     SQL
327d0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
327e0 53 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  S: Return 1 if t
327f0 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a  he file exists.*
32800 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
32810 45 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52  ESS_READWRITE: R
32820 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
32830 69 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20  ile is read and 
32840 77 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  writable..**    
32850 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52   SQLITE_ACCESS_R
32860 45 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20  EADONLY: Return 
32870 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  1 if the file is
32880 20 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a   readable..**.**
32890 20 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72   Otherwise retur
328a0 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 0..*/.static i
328b0 6e 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20  nt unixAccess(. 
328c0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f   sqlite3_vfs *No
328d0 74 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20  tUsed,   /* The 
328e0 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
328f0 68 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68  his xAccess meth
32900 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  od */.  const ch
32910 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
32920 2f 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66  /* Path of the f
32930 69 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a  ile to examine *
32940 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
32950 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
32960 68 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74  hat do we want t
32970 6f 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68  o learn about th
32980 65 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f  e zPath file? */
32990 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20  .  int *pResOut 
329a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
329b0 69 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65  ite result boole
329c0 61 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  an here */.){.  
329d0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
329e0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d  (NotUsed);.  Sim
329f0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
32a00 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
32a10 52 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 61  R_ACCESS; );.  a
32a20 73 73 65 72 74 28 20 70 52 65 73 4f 75 74 21 3d  ssert( pResOut!=
32a30 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 73  0 );..  /* The s
32a40 70 65 63 20 73 61 79 73 20 74 68 65 72 65 20 61  pec says there a
32a50 72 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c  re three possibl
32a60 65 20 76 61 6c 75 65 73 20 66 6f 72 20 66 6c 61  e values for fla
32a70 67 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a 20 20  gs.  But only.  
32a80 2a 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d 20 61  ** two of them a
32a90 72 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64  re actually used
32aa0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c   */.  assert( fl
32ab0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45  ags==SQLITE_ACCE
32ac0 53 53 5f 45 58 49 53 54 53 20 7c 7c 20 66 6c 61  SS_EXISTS || fla
32ad0 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
32ae0 53 5f 52 45 41 44 57 52 49 54 45 20 29 3b 0a 0a  S_READWRITE );..
32af0 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c    if( flags==SQL
32b00 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
32b10 53 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  S ){.    struct 
32b20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 2a 70  stat buf;.    *p
32b30 52 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f 73 53  ResOut = (0==osS
32b40 74 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29  tat(zPath, &buf)
32b50 20 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3e   && buf.st_size>
32b60 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
32b70 20 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73 41 63   *pResOut = osAc
32b80 63 65 73 73 28 7a 50 61 74 68 2c 20 57 5f 4f 4b  cess(zPath, W_OK
32b90 7c 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d 0a 20  |R_OK)==0;.  }. 
32ba0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
32bb0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  K;.}../*.**.*/.s
32bc0 74 61 74 69 63 20 69 6e 74 20 6d 6b 46 75 6c 6c  tatic int mkFull
32bd0 50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73  Pathname(.  cons
32be0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
32bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
32c00 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 63  nput path */.  c
32c10 68 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20 20 20  har *zOut,      
32c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32c30 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20  * Output buffer 
32c40 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20 20 20  */.  int nOut   
32c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c60 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
32c70 64 20 73 69 7a 65 20 6f 66 20 62 75 66 66 65 72  d size of buffer
32c80 20 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e   zOut */.){.  in
32c90 74 20 6e 50 61 74 68 20 3d 20 73 71 6c 69 74 65  t nPath = sqlite
32ca0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
32cb0 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  ;.  int iOff = 0
32cc0 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d  ;.  if( zPath[0]
32cd0 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 66 28  !='/' ){.    if(
32ce0 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20   osGetcwd(zOut, 
32cf0 6e 4f 75 74 2d 32 29 3d 3d 30 20 29 7b 0a 20 20  nOut-2)==0 ){.  
32d00 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
32d10 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
32d20 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67  ANTOPEN_BKPT, "g
32d30 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a  etcwd", zPath);.
32d40 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d      }.    iOff =
32d50 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
32d60 28 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f 75 74  (zOut);.    zOut
32d70 5b 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f 27 3b 0a  [iOff++] = '/';.
32d80 20 20 7d 0a 20 20 69 66 28 20 28 69 4f 66 66 2b    }.  if( (iOff+
32d90 6e 50 61 74 68 2b 31 29 3e 6e 4f 75 74 20 29 7b  nPath+1)>nOut ){
32da0 0a 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 61  .    /* SQLite a
32db0 73 73 75 6d 65 73 20 74 68 61 74 20 78 46 75 6c  ssumes that xFul
32dc0 6c 50 61 74 68 6e 61 6d 65 28 29 20 6e 75 6c 2d  lPathname() nul-
32dd0 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 6f  terminates the o
32de0 75 74 70 75 74 20 62 75 66 66 65 72 0a 20 20 20  utput buffer.   
32df0 20 2a 2a 20 65 76 65 6e 20 69 66 20 69 74 20 72   ** even if it r
32e00 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e  eturns an error.
32e10 20 20 2a 2f 0a 20 20 20 20 7a 4f 75 74 5b 69 4f    */.    zOut[iO
32e20 66 66 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ff] = '\0';.    
32e30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
32e40 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d  NTOPEN_BKPT;.  }
32e50 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
32e60 6e 74 66 28 6e 4f 75 74 2d 69 4f 66 66 2c 20 26  ntf(nOut-iOff, &
32e70 7a 4f 75 74 5b 69 4f 66 66 5d 2c 20 22 25 73 22  zOut[iOff], "%s"
32e80 2c 20 7a 50 61 74 68 29 3b 0a 20 20 72 65 74 75  , zPath);.  retu
32e90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
32ea0 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65  ./*.** Turn a re
32eb0 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20  lative pathname 
32ec0 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68  into a full path
32ed0 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69  name. The relati
32ee0 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74  ve path.** is st
32ef0 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65  ored as a nul-te
32f00 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
32f10 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  in the buffer po
32f20 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a  inted to by.** z
32f30 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75  Path. .**.** zOu
32f40 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  t points to a bu
32f50 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74  ffer of at least
32f60 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50   sqlite3_vfs.mxP
32f70 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a  athname bytes .*
32f80 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c  * (in this case,
32f90 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79   MAX_PATHNAME by
32fa0 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70  tes). The full-p
32fb0 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74  ath is written t
32fc0 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72  o.** this buffer
32fd0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
32fe0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
32ff0 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d   unixFullPathnam
33000 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  e(.  sqlite3_vfs
33010 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
33020 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
33030 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
33040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
33050 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  th,            /
33060 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74  * Possibly relat
33070 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a  ive input path *
33080 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20  /.  int nOut,   
33090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74    /* Size of out
330b0 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
330c0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  tes */.  char *z
330d0 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20  Out             
330e0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
330f0 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 69   buffer */.){.#i
33100 66 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f  f !defined(HAVE_
33110 52 45 41 44 4c 49 4e 4b 29 20 7c 7c 20 21 64 65  READLINK) || !de
33120 66 69 6e 65 64 28 48 41 56 45 5f 4c 53 54 41 54  fined(HAVE_LSTAT
33130 29 0a 20 20 72 65 74 75 72 6e 20 6d 6b 46 75 6c  ).  return mkFul
33140 6c 50 61 74 68 6e 61 6d 65 28 7a 50 61 74 68 2c  lPathname(zPath,
33150 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 23 65   zOut, nOut);.#e
33160 6c 73 65 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  lse.  int rc = S
33170 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
33180 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e 4c 69  nByte;.  int nLi
33190 6e 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  nk = 1;         
331a0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
331b0 20 6f 66 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e   of symbolic lin
331c0 6b 73 20 66 6f 6c 6c 6f 77 65 64 20 73 6f 20 66  ks followed so f
331d0 61 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ar */.  const ch
331e0 61 72 20 2a 7a 49 6e 20 3d 20 7a 50 61 74 68 3b  ar *zIn = zPath;
331f0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 70        /* Input p
33200 61 74 68 20 66 6f 72 20 65 61 63 68 20 69 74 65  ath for each ite
33210 72 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a  ration of loop *
33220 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 20 3d  /.  char *zDel =
33230 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
33240 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d  Vfs->mxPathname=
33250 3d 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b  =MAX_PATHNAME );
33260 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
33270 54 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a  TER(pVfs);..  /*
33280 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d   It's odd to sim
33290 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f  ulate an io-erro
332a0 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c  r here, but real
332b0 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a  ly this is just.
332c0 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69    ** using the i
332d0 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72  o-error infrastr
332e0 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74  ucture to test t
332f0 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c  hat SQLite handl
33300 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  es this.  ** fun
33310 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54  ction failing. T
33320 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75  his function cou
33330 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20  ld fail if, for 
33340 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a  example, the.  *
33350 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e  * current workin
33360 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20  g directory has 
33370 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20  been unlinked.. 
33380 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
33390 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
333a0 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20  LITE_ERROR );.. 
333b0 20 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a 20 43 61   do {..    /* Ca
333c0 6c 6c 20 73 74 61 74 28 29 20 6f 6e 20 70 61 74  ll stat() on pat
333d0 68 20 7a 49 6e 2e 20 53 65 74 20 62 4c 69 6e 6b  h zIn. Set bLink
333e0 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
333f0 70 61 74 68 20 69 73 20 61 20 73 79 6d 62 6f 6c  path is a symbol
33400 69 63 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 2c 20  ic.    ** link, 
33410 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
33420 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  se.  */.    int 
33430 62 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 73  bLink = 0;.    s
33440 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
33450 20 20 20 20 69 66 28 20 6f 73 4c 73 74 61 74 28      if( osLstat(
33460 7a 49 6e 2c 20 26 62 75 66 29 21 3d 30 20 29 7b  zIn, &buf)!=0 ){
33470 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
33480 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20  !=ENOENT ){.    
33490 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
334a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
334b0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6c 73 74  TOPEN_BKPT, "lst
334c0 61 74 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20  at", zIn);.     
334d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
334e0 20 20 20 20 62 4c 69 6e 6b 20 3d 20 53 5f 49 53      bLink = S_IS
334f0 4c 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29  LNK(buf.st_mode)
33500 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
33510 20 62 4c 69 6e 6b 20 29 7b 0a 20 20 20 20 20 20   bLink ){.      
33520 69 66 28 20 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20  if( zDel==0 ){. 
33530 20 20 20 20 20 20 20 7a 44 65 6c 20 3d 20 73 71         zDel = sq
33540 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75  lite3_malloc(nOu
33550 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
33560 7a 44 65 6c 3d 3d 30 20 29 20 72 63 20 3d 20 53  zDel==0 ) rc = S
33570 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
33580 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
33590 28 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c 49 54 45  ( ++nLink>SQLITE
335a0 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 29 7b  _MAX_SYMLINKS ){
335b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
335c0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
335d0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  PT;.      }..   
335e0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
335f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
33600 6e 42 79 74 65 20 3d 20 6f 73 52 65 61 64 6c 69  nByte = osReadli
33610 6e 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c 20 6e 4f  nk(zIn, zDel, nO
33620 75 74 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ut-1);.        i
33630 66 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20  f( nByte<0 ){.  
33640 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
33650 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
33660 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
33670 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 49 6e 29  "readlink", zIn)
33680 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
33690 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
336a0 44 65 6c 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20  Del[0]!='/' ){. 
336b0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e             int n
336c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
336d0 72 28 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  r(n = sqlite3Str
336e0 6c 65 6e 33 30 28 7a 49 6e 29 3b 20 6e 3e 30 20  len30(zIn); n>0 
336f0 26 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d 27 2f 27  && zIn[n-1]!='/'
33700 3b 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20 20 20  ; n--);.        
33710 20 20 20 20 69 66 28 20 6e 42 79 74 65 2b 6e 2b      if( nByte+n+
33720 31 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20  1>nOut ){.      
33730 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
33740 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
33750 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
33760 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
33770 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 44 65      memmove(&zDe
33780 6c 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e 42 79 74  l[n], zDel, nByt
33790 65 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e+1);.          
337a0 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c 2c      memcpy(zDel,
337b0 20 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20 20 20 20   zIn, n);.      
337c0 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d          nByte +=
337d0 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   n;.            
337e0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
337f0 20 20 20 20 20 20 20 20 7a 44 65 6c 5b 6e 42 79          zDel[nBy
33800 74 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  te] = '\0';.    
33810 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
33820 20 20 20 20 20 7a 49 6e 20 3d 20 7a 44 65 6c 3b       zIn = zDel;
33830 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65  .    }..    asse
33840 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
33850 4b 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75 74 20 7c  K || zIn!=zOut |
33860 7c 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27 20 29 3b  | zIn[0]=='/' );
33870 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
33880 49 54 45 5f 4f 4b 20 26 26 20 7a 49 6e 21 3d 7a  ITE_OK && zIn!=z
33890 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Out ){.      rc 
338a0 3d 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65  = mkFullPathname
338b0 28 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74  (zIn, zOut, nOut
338c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
338d0 20 62 4c 69 6e 6b 3d 3d 30 20 29 20 62 72 65 61   bLink==0 ) brea
338e0 6b 3b 0a 20 20 20 20 7a 49 6e 20 3d 20 7a 4f 75  k;.    zIn = zOu
338f0 74 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  t;.  }while( rc=
33900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
33910 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44   sqlite3_free(zD
33920 65 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  el);.  return rc
33930 3b 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 48 41  ;.#endif   /* HA
33940 56 45 5f 52 45 41 44 4c 49 4e 4b 20 26 26 20 48  VE_READLINK && H
33950 41 56 45 5f 4c 53 54 41 54 20 2a 2f 0a 7d 0a 0a  AVE_LSTAT */.}..
33960 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33970 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
33980 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66  ION./*.** Interf
33990 61 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67  aces for opening
339a0 20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72   a shared librar
339b0 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79  y, finding entry
339c0 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69   points.** withi
339d0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  n the shared lib
339e0 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e  rary, and closin
339f0 67 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62  g the shared lib
33a00 72 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64  rary..*/.#includ
33a10 65 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74  e <dlfcn.h>.stat
33a20 69 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f  ic void *unixDlO
33a30 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20  pen(sqlite3_vfs 
33a40 2a 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20  *NotUsed, const 
33a50 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
33a60 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
33a70 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33a80 20 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a   return dlopen(z
33a90 46 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e  Filename, RTLD_N
33aa0 4f 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c  OW | RTLD_GLOBAL
33ab0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69  );.}../*.** SQLi
33ac0 74 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75  te calls this fu
33ad0 6e 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65  nction immediate
33ae0 6c 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20  ly after a call 
33af0 74 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f  to unixDlSym() o
33b00 72 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28  r.** unixDlOpen(
33b10 29 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73  ) fails (returns
33b20 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29   a null pointer)
33b30 2e 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61  . If a more deta
33b40 69 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65  iled error.** me
33b50 73 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62  ssage is availab
33b60 6c 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65  le, it is writte
33b70 6e 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66  n to zBufOut. If
33b80 20 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67   no error messag
33b90 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
33ba0 65 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65  e, zBufOut is le
33bb0 66 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e  ft unmodified an
33bc0 64 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20  d SQLite uses a 
33bd0 64 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72  default.** error
33be0 20 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61   message..*/.sta
33bf0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45  tic void unixDlE
33c00 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
33c10 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e   *NotUsed, int n
33c20 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f  Buf, char *zBufO
33c30 75 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ut){.  const cha
33c40 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45  r *zErr;.  UNUSE
33c50 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33c60 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  sed);.  unixEnte
33c70 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72  rMutex();.  zErr
33c80 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20   = dlerror();.  
33c90 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20  if( zErr ){.    
33ca0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
33cb0 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20  (nBuf, zBufOut, 
33cc0 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d  "%s", zErr);.  }
33cd0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
33ce0 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  x();.}.static vo
33cf0 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73  id (*unixDlSym(s
33d00 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
33d10 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f  sed, void *p, co
33d20 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28  nst char*zSym))(
33d30 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a  void){.  /* .  *
33d40 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61  * GCC with -peda
33d50 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73  ntic-errors says
33d60 20 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e   that C90 does n
33d70 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a  ot allow a void*
33d80 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74   to be.  ** cast
33d90 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
33da0 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20  to a function.  
33db0 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72  And yet the libr
33dc0 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74  ary dlsym() rout
33dd0 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73  ine.  ** returns
33de0 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69   a void* which i
33df0 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74  s really a point
33e00 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
33e10 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a  .  So how do we.
33e20 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29    ** use dlsym()
33e30 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
33e40 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a  errors?.  **.  *
33e50 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c  * Variable x bel
33e60 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f  ow is defined to
33e70 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
33e80 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69   a function taki
33e90 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65  ng.  ** paramete
33ea0 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e  rs void* and con
33eb0 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74  st char* and ret
33ec0 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72  urning a pointer
33ed0 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a   to a function..
33ee0 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69    ** We initiali
33ef0 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e  ze x by assignin
33f00 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74  g it a pointer t
33f10 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75  o the dlsym() fu
33f20 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68  nction..  ** (Th
33f30 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65  at assignment re
33f40 71 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20  quires a cast.) 
33f50 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68   Then we call th
33f60 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  e function that.
33f70 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f    ** x points to
33f80 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  .  .  **.  ** Th
33f90 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69  is work-around i
33fa0 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f  s unlikely to wo
33fb0 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20  rk correctly on 
33fc0 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65  any system where
33fd0 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79  .  ** you really
33fe0 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66   cannot cast a f
33ff0 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
34000 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74  into void*.  But
34010 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20   then, on the.  
34020 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64  ** other hand, d
34030 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20  lsym() will not 
34040 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73  work on such a s
34050 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f  ystem either, so
34060 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f   we have.  ** no
34070 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e  t really lost an
34080 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76  ything..  */.  v
34090 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a  oid (*(*x)(void*
340a0 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76  ,const char*))(v
340b0 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  oid);.  UNUSED_P
340c0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
340d0 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a  );.  x = (void(*
340e0 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  (*)(void*,const 
340f0 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c  char*))(void))dl
34100 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a  sym;.  return (*
34110 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73  x)(p, zSym);.}.s
34120 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44  tatic void unixD
34130 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
34140 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
34150 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55  d *pHandle){.  U
34160 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34170 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c  NotUsed);.  dlcl
34180 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  ose(pHandle);.}.
34190 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49  #else /* if SQLI
341a0 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
341b0 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65  ENSION is define
341c0 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20  d: */.  #define 
341d0 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20  unixDlOpen  0.  
341e0 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72  #define unixDlEr
341f0 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
34200 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20  unixDlSym   0.  
34210 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c  #define unixDlCl
34220 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ose 0.#endif../*
34230 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62  .** Write nBuf b
34240 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64  ytes of random d
34250 61 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ata to the suppl
34260 69 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e  ied buffer zBuf.
34270 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
34280 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71  nixRandomness(sq
34290 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
342a0 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
342b0 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55  ar *zBuf){.  UNU
342c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
342d0 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74  tUsed);.  assert
342e0 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28  ((size_t)nBuf>=(
342f0 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73  sizeof(time_t)+s
34300 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20  izeof(int)));.. 
34310 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
34320 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
34330 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
34340 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
34350 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
34360 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
34370 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
34380 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
34390 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
343a0 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
343b0 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
343c0 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
343d0 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
343e0 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
343f0 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
34400 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
34410 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
34420 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
34430 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
34440 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
34450 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
34460 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
34470 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
34480 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
34490 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
344a0 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
344b0 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
344c0 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
344d0 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
344e0 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
344f0 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
34500 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
34510 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
34520 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
34530 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
34540 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
34550 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  nce.  This makes
34560 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
34570 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
34580 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
34590 30 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61 6e 64  0, nBuf);.  rand
345a0 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65  omnessPid = osGe
345b0 74 70 69 64 28 30 29 3b 20 20 0a 23 69 66 20 21  tpid(0);  .#if !
345c0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
345d0 45 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64  EST) && !defined
345e0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e  (SQLITE_OMIT_RAN
345f0 44 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20 20 20  DOMNESS).  {.   
34600 20 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20   int fd, got;.  
34610 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
34620 65 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d  en("/dev/urandom
34630 22 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b  ", O_RDONLY, 0);
34640 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
34650 0a 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b  .      time_t t;
34660 0a 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b  .      time(&t);
34670 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
34680 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74  uf, &t, sizeof(t
34690 29 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  ));.      memcpy
346a0 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29  (&zBuf[sizeof(t)
346b0 5d 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69  ], &randomnessPi
346c0 64 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  d, sizeof(random
346d0 6e 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20 20  nessPid));.     
346e0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
346f0 74 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d  t)+sizeof(random
34700 6e 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f  nessPid)<=(size_
34710 74 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20  t)nBuf );.      
34720 6e 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29  nBuf = sizeof(t)
34730 20 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d   + sizeof(random
34740 6e 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d 65  nessPid);.    }e
34750 6c 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67  lse{.      do{ g
34760 6f 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20  ot = osRead(fd, 
34770 7a 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68  zBuf, nBuf); }wh
34780 69 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72  ile( got<0 && er
34790 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
347a0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
347b0 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f  (0, fd, __LINE__
347c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
347d0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75  dif.  return nBu
347e0 66 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  f;.}.../*.** Sle
347f0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
34800 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
34810 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
34820 65 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20  e slept..** The 
34830 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
34840 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
34850 65 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74  econds we want t
34860 6f 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20  o sleep..** The 
34870 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
34880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  the number of mi
34890 63 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c  croseconds of sl
348a0 65 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20  eep actually.** 
348b0 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
348c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70  he underlying op
348d0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20  erating system, 
348e0 61 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a  a number which.*
348f0 2a 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74  * might be great
34900 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
34910 20 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74   to the argument
34920 2c 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a  , but not less.*
34930 2a 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d  * than the argum
34940 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
34950 6e 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c  nt unixSleep(sql
34960 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
34970 64 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f  d, int microseco
34980 6e 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  nds){.#if OS_VXW
34990 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
349a0 6d 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70  mespec sp;..  sp
349b0 2e 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73  .tv_sec = micros
349c0 65 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30  econds / 1000000
349d0 3b 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d  ;.  sp.tv_nsec =
349e0 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25   (microseconds %
349f0 20 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30   1000000) * 1000
34a00 3b 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73  ;.  nanosleep(&s
34a10 70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53  p, NULL);.  UNUS
34a20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34a30 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
34a40 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65  microseconds;.#e
34a50 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  lif defined(HAVE
34a60 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45  _USLEEP) && HAVE
34a70 5f 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70  _USLEEP.  usleep
34a80 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a  (microseconds);.
34a90 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
34aa0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
34ab0 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e  eturn microsecon
34ac0 64 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  ds;.#else.  int 
34ad0 73 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f  seconds = (micro
34ae0 73 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f  seconds+999999)/
34af0 31 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70  1000000;.  sleep
34b00 28 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  (seconds);.  UNU
34b10 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
34b20 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
34b30 20 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30   seconds*1000000
34b40 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
34b50 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
34b60 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
34b70 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
34b80 61 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72  alue, is interpr
34b90 65 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e  eted as.** the n
34ba0 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73  umber of seconds
34bb0 20 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20   since 1970 and 
34bc0 69 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74  is used to set t
34bd0 68 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20  he result of.** 
34be0 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
34bf0 54 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65  Time() during te
34c00 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66  sting..*/.#ifdef
34c10 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
34c20 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
34c30 5f 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46  _time = 0;  /* F
34c40 61 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20  ake system time 
34c50 69 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  in seconds since
34c60 20 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66   1970. */.#endif
34c70 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65  ../*.** Find the
34c80 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69   current time (i
34c90 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72  n Universal Coor
34ca0 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20  dinated Time).  
34cb0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f  Write into *piNo
34cc0 77 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  w.** the current
34cd0 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61   time and date a
34ce0 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e  s a Julian Day n
34cf0 75 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34  umber times 86_4
34d00 30 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f  00_000.  In.** o
34d10 74 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74  ther words, writ
34d20 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68  e into *piNow th
34d30 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  e number of mill
34d40 69 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74  iseconds since t
34d50 68 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f  he Julian.** epo
34d60 63 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72  ch of noon in Gr
34d70 65 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d  eenwich on Novem
34d80 62 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43  ber 24, 4714 B.C
34d90 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
34da0 65 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47  e.** proleptic G
34db0 72 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61  regorian calenda
34dc0 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  r..**.** On succ
34dd0 65 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ess, return SQLI
34de0 54 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53  TE_OK.  Return S
34df0 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74  QLITE_ERROR if t
34e00 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  he time and date
34e10 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66   .** cannot be f
34e20 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
34e30 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
34e40 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
34e50 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73  _vfs *NotUsed, s
34e60 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
34e70 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Now){.  static c
34e80 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
34e90 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
34ea0 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
34eb0 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
34ec0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34ed0 45 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  E_OK;.#if define
34ee0 64 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74  d(NO_GETTOD).  t
34ef0 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28  ime_t t;.  time(
34f00 26 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  &t);.  *piNow = 
34f10 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
34f20 74 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70  t)*1000 + unixEp
34f30 6f 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58  och;.#elif OS_VX
34f40 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74  WORKS.  struct t
34f50 69 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20  imespec sNow;.  
34f60 63 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c  clock_gettime(CL
34f70 4f 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73  OCK_REALTIME, &s
34f80 4e 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  Now);.  *piNow =
34f90 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
34fa0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
34fb0 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
34fc0 4e 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30  Now.tv_nsec/1000
34fd0 30 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  000;.#else.  str
34fe0 75 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77  uct timeval sNow
34ff0 3b 0a 20 20 28 76 6f 69 64 29 67 65 74 74 69 6d  ;.  (void)gettim
35000 65 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29  eofday(&sNow, 0)
35010 3b 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66 61 69  ;  /* Cannot fai
35020 6c 20 67 69 76 65 6e 20 76 61 6c 69 64 20 61 72  l given valid ar
35030 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a 70 69  guments */.  *pi
35040 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20  Now = unixEpoch 
35050 2b 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f  + 1000*(sqlite3_
35060 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65  int64)sNow.tv_se
35070 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63  c + sNow.tv_usec
35080 2f 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  /1000;.#endif..#
35090 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
350a0 54 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  T.  if( sqlite3_
350b0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a  current_time ){.
350c0 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30      *piNow = 100
350d0 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
350e0 29 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74  )sqlite3_current
350f0 5f 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63  _time + unixEpoc
35100 68 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  h;.  }.#endif.  
35110 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
35120 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
35130 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
35140 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
35150 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
35160 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
35170 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
35180 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
35190 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68  Time).  Write th
351a0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d  e.** current tim
351b0 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
351c0 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
351d0 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e  r into *prNow an
351e0 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20  d.** return 0.  
351f0 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
35200 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61  time and date ca
35210 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
35220 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
35230 78 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  xCurrentTime(sql
35240 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
35250 64 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77  d, double *prNow
35260 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ){.  sqlite3_int
35270 36 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  64 i = 0;.  int 
35280 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rc;.  UNUSED_PAR
35290 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
352a0 0a 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72  .  rc = unixCurr
352b0 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20  entTimeInt64(0, 
352c0 26 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  &i);.  *prNow = 
352d0 69 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20  i/86400000.0;.  
352e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c  return rc;.}.#el
352f0 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
35300 43 75 72 72 65 6e 74 54 69 6d 65 20 30 0a 23 65  CurrentTime 0.#e
35310 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
35320 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20  xGetLastError() 
35330 6d 65 74 68 6f 64 20 69 73 20 64 65 73 69 67 6e  method is design
35340 65 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20 62  ed to return a b
35350 65 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d 6c 65 76  etter.** low-lev
35360 65 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  el error message
35370 20 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d   when operating-
35380 73 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20  system problems 
35390 63 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e  come up.** durin
353a0 67 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69  g SQLite operati
353b0 6f 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 20 69 6e  on.  Only the in
353c0 74 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64  teger return cod
353d0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
353e0 2a 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  * used..*/.stati
353f0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73  c int unixGetLas
35400 74 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  tError(sqlite3_v
35410 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
35420 20 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20   NotUsed2, char 
35430 2a 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e  *NotUsed3){.  UN
35440 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
35450 6f 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45  otUsed);.  UNUSE
35460 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
35470 73 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  sed2);.  UNUSED_
35480 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
35490 64 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72  d3);.  return er
354a0 72 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a  rno;.}.../*.****
354b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
354c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69  **** End of sqli
354d0 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20  te3_vfs methods 
354e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
354f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
35500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
35550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
355a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355b0 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72  ******* Begin Pr
355c0 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  oxy Locking ****
355d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
355e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
355f0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
35600 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b   is a "uber-lock
35610 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74  ing-method" in t
35620 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75  his sense:  It u
35630 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72  ses the.** other
35640 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
35650 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f   on secondary lo
35660 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79  ck files.  Proxy
35670 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a   locking is a.**
35680 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72   meta-layer over
35690 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d   top of the prim
356a0 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  itive locking im
356b0 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e  plemented above.
356c0 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65    For.** this re
356d0 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69  ason, the divisi
356e0 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  on that implemen
356f0 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b  ts of proxy lock
35700 69 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a  ing is deferred.
35710 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e  ** until late in
35720 20 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29   the file (here)
35730 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68   after all of th
35740 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68  e other I/O meth
35750 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  ods have.** been
35760 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68   defined - so th
35770 61 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65  at the primitive
35780 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
35790 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a   are available.*
357a0 2a 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f  * as services to
357b0 20 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69   help with the i
357c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
357d0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a   proxy locking..
357e0 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  **.****.**.** Th
357f0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
35800 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c  g schemes in SQL
35810 69 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e  ite use byte-ran
35820 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a  ge locks on the.
35830 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
35840 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73   to coordinate s
35850 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  afe, concurrent 
35860 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
35870 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e  le readers.** an
35880 64 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a  d writers [http:
35890 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63  //sqlite.org/loc
358a0 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54  kingv3.html].  T
358b0 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63  he five file loc
358c0 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28  king.** states (
358d0 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e  UNLOCKED, PENDIN
358e0 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  G, SHARED, RESER
358f0 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20  VED, EXCLUSIVE) 
35900 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a  are implemented.
35910 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64  ** as POSIX read
35920 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f   & write locks o
35930 76 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66  ver fixed set of
35940 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20   locations (via 
35950 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46  fsctl),.** on AF
35960 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65  P and SMB only e
35970 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61  xclusive byte-ra
35980 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76  nge locks are av
35990 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74  ailable via fsct
359a0 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28  l.** with _IOWR(
359b0 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20  'z', 23, struct 
359c0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
359d0 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73  ) to track the s
359e0 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a  ame 5 states..**
359f0 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46   To simulate a F
35a00 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68  _RDLCK on the sh
35a10 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41  ared range, on A
35a20 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65  FP a randomly se
35a30 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73  lected.** addres
35a40 73 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  s in the shared 
35a50 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
35a60 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  or a SHARED lock
35a70 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20  , the entire.** 
35a80 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
35a90 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43  taken for an EXC
35aa0 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a  LUSIVE lock):.**
35ab0 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47  .**      PENDING
35ac0 5f 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34  _BYTE        0x4
35ad0 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20  0000000.**      
35ae0 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20  RESERVED_BYTE   
35af0 20 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a      0x40000001.*
35b00 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41  *      SHARED_RA
35b10 4e 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30  NGE        0x400
35b20 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30  00002 -> 0x40000
35b30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77  200.**.** This w
35b40 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65  orks well on the
35b50 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
35b60 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20  em, but shows a 
35b70 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73  nearly 100x.** s
35b80 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20  lowdown in read 
35b90 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41  performance on A
35ba0 46 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41  FP because the A
35bb0 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c  FP client disabl
35bc0 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63  es.** the read c
35bd0 61 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72  ache when byte-r
35be0 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70  ange locks are p
35bf0 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e  resent.  Enablin
35c00 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61  g the read.** ca
35c10 63 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61  che exposes a ca
35c20 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72  che coherency pr
35c30 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72  oblem that is pr
35c40 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20  esent on all OS 
35c50 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e  X.** supported n
35c60 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74  etwork file syst
35c70 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46  ems.  NFS and AF
35c80 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74  P both observe t
35c90 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f  he.** close-to-o
35ca0 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f  pen semantics fo
35cb0 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65  r ensuring cache
35cc0 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68   coherency.** [h
35cd0 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65  ttp://nfs.source
35ce0 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61  forge.net/#faq_a
35cf0 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e  8], which does n
35d00 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a  ot effectively.*
35d10 2a 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65  * address the re
35d20 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63  quirements for c
35d30 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61  oncurrent databa
35d40 73 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c  se access by mul
35d50 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73  tiple.** readers
35d60 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20   and writers.** 
35d70 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62  [http://www.nabb
35d80 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e  le.com/SQLite-on
35d90 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72  -NFS-cache-coher
35da0 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e  ency-td15655701.
35db0 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  html]..**.** To 
35dc0 61 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66  address the perf
35dd0 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68  ormance and cach
35de0 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75  e coherency issu
35df0 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c  es, proxy file l
35e00 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  ocking.** change
35e10 73 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61  s the way databa
35e20 73 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e  se access is con
35e30 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74  trolled by limit
35e40 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a  ing access to a.
35e50 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61  ** single host a
35e60 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76  t a time and mov
35e70 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f  ing file locks o
35e80 66 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ff of the databa
35e90 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f  se file.** and o
35ea0 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65  nto a proxy file
35eb0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69   on the local fi
35ec0 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a  le system.  .**.
35ed0 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78  **.** Using prox
35ee0 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  y locks.** -----
35ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
35f00 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20  ** C APIs.**.** 
35f10 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
35f20 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65  ntrol(db, dbname
35f30 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53  , SQLITE_FCNTL_S
35f40 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
35f50 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
35f60 20 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78             <prox
35f70 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f  y_path> | ":auto
35f80 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33  :");.**  sqlite3
35f90 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
35fa0 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45  , dbname, SQLITE
35fb0 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50  _FCNTL_GET_LOCKP
35fc0 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20  ROXYFILE,.**    
35fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35fe0 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e     &<proxy_path>
35ff0 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20  );.**.**.** SQL 
36000 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50  pragmas.**.**  P
36010 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e  RAGMA [database.
36020 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65  ]lock_proxy_file
36030 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20  =<proxy_path> | 
36040 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d  :auto:.**  PRAGM
36050 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
36060 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a  k_proxy_file.**.
36070 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a  ** Specifying ":
36080 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61  auto:" means tha
36090 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  t if there is a 
360a0 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20  conch file with 
360b0 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f  a matching.** ho
360c0 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65  st ID in it, the
360d0 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74   proxy path in t
360e0 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69  he conch file wi
360f0 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65  ll be used, othe
36100 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79  rwise.** a proxy
36110 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74   path based on t
36120 68 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64  he user's temp d
36130 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73  ir.** (via confs
36140 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53  tr(_CS_DARWIN_US
36150 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29  ER_TEMP_DIR,...)
36160 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61  ) will be used a
36170 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c  nd the.** actual
36180 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65   proxy file name
36190 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72   is generated fr
361a0 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20  om the name and 
361b0 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64  path of the.** d
361c0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46  atabase file.  F
361d0 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a  or example:.**.*
361e0 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61  *       For data
361f0 62 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72  base path "/User
36200 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a  s/me/foo.db" .**
36210 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20         The lock 
36220 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74  path will be "<t
36230 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f  mpdir>/sqliteplo
36240 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f  cks/_Users_me_fo
36250 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a  o.db:auto:").**.
36260 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70  ** Once a lock p
36270 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72  roxy is configur
36280 65 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  ed for a databas
36290 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74  e connection, it
362a0 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72   can not.** be r
362b0 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20  emoved, however 
362c0 69 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68  it may be switch
362d0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
362e0 74 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61  t proxy path via
362f0 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50  .** the above AP
36300 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  Is (assuming the
36310 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e   conch file is n
36320 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79  ot being held by
36330 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e   another.** conn
36340 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73  ection or proces
36350 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f  s). .**.**.** Ho
36360 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  w proxy locking 
36370 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  works.** -------
36380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36390 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c  .**.** Proxy fil
363a0 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73  e locking relies
363b0 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77   primarily on tw
363c0 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67  o new supporting
363d0 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20   files: .**.**  
363e0 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74   *  conch file t
363f0 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74  o limit access t
36400 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
36410 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ile to a single 
36420 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20  host.**      at 
36430 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a  a time.**.**   *
36440 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20    proxy file to 
36450 61 63 74 20 61 73 20 61 20 70 72 6f 78 79 20 66  act as a proxy f
36460 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72 79 20  or the advisory 
36470 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  locks normally.*
36480 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f 6e 20  *      taken on 
36490 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a  the database.**.
364a0 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c  ** The conch fil
364b0 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70 72 6f  e - to use a pro
364c0 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74 65 20  xy file, sqlite 
364d0 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f 6c 64  must first "hold
364e0 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a 20 62   the conch".** b
364f0 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71 6c 69  y taking an sqli
36500 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65 64 20  te-style shared 
36510 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
36520 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e 67 20  h file, reading 
36530 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
36540 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20 74 68  and comparing th
36550 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75 65 20  e host's unique 
36560 68 6f 73 74 20 49 44 20 28 73 65 65 20 62 65 6c  host ID (see bel
36570 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20  ow) and lock.** 
36580 70 72 6f 78 79 20 70 61 74 68 20 61 67 61 69 6e  proxy path again
36590 73 74 20 74 68 65 20 76 61 6c 75 65 73 20 73 74  st the values st
365a0 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f 6e 63  ored in the conc
365b0 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20 66 69  h.  The conch fi
365c0 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65 64 20  le is.** stored 
365d0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
365e0 63 74 6f 72 79 20 61 73 20 74 68 65 20 64 61 74  ctory as the dat
365f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
36600 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20  he file name.** 
36610 69 73 20 70 61 74 74 65 72 6e 65 64 20 61 66 74  is patterned aft
36620 65 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  er the database 
36630 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22 2e 3c  file name as ".<
36640 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d 63 6f  databasename>-co
36650 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68 65 20  nch"..** If the 
36660 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65 73 20  conch file does 
36670 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20 69 74  not exist, or it
36680 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20 6e 6f  s contents do no
36690 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a 20 68  t match the.** h
366a0 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20 70 72  ost ID and/or pr
366b0 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e 20 74  oxy path, then t
366c0 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63 61 6c  he lock is escal
366d0 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63 6c 75  ated to an exclu
366e0 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64  sive.** lock and
366f0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
36700 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70 64 61  contents is upda
36710 74 65 64 20 77 69 74 68 20 74 68 65 20 68 6f 73  ted with the hos
36720 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79 0a 2a  t ID and proxy.*
36730 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65 20 6c  * path and the l
36740 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61 64 65  ock is downgrade
36750 64 20 74 6f 20 61 20 73 68 61 72 65 64 20 6c 6f  d to a shared lo
36760 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20 74 68  ck again.  If th
36770 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20 68 65  e conch.** is he
36780 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20 70 72  ld by another pr
36790 6f 63 65 73 73 20 28 77 69 74 68 20 61 20 73 68  ocess (with a sh
367a0 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68 65 20  ared lock), the 
367b0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a  exclusive lock.*
367c0 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e 64 20  * will fail and 
367d0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
367e0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
367f0 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20 2d 20  he proxy file - 
36800 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20 66 69  a single-byte fi
36810 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c 6c 20  le used for all 
36820 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20 6c 6f  advisory file lo
36830 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  cks.** normally 
36840 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
36850 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20 54 68  abase file.   Th
36860 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20 73 61  is allows for sa
36870 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 6f 66  fe sharing.** of
36880 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36890 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c 65 20  le for multiple 
368a0 72 65 61 64 65 72 73 20 61 6e 64 20 77 72 69 74  readers and writ
368b0 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a  ers on the same.
368c0 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63 6f 6e  ** host (the con
368d0 63 68 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ch ensures that 
368e0 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74 68 65  they all use the
368f0 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b   same local lock
36900 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65   file)..**.** Re
36910 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c 6f 63  questing the loc
36920 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e 6f 74  k proxy does not
36930 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74 61 6b   immediately tak
36940 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69 74 20  e the conch, it 
36950 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e  is.** only taken
36960 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
36970 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63 6b 20  request to lock 
36980 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
36990 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68 69 73   made.  .** This
369a0 20 6d 61 74 63 68 65 73 20 74 68 65 20 73 65 6d   matches the sem
369b0 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20 74 72  antics of the tr
369c0 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e  aditional lockin
369d0 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68 65 72  g behavior, wher
369e0 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61 20 63  e.** opening a c
369f0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 64  onnection to a d
36a00 61 74 61 62 61 73 65 20 66 69 6c 65 20 64 6f 65  atabase file doe
36a10 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c 6f 63  s not take a loc
36a20 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68 65 20  k on it..** The 
36a30 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20  shared lock and 
36a40 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64 65 73  an open file des
36a50 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61 69 6e  criptor are main
36a60 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a 2a 2a  tained until .**
36a70 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
36a80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
36a90 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a  is closed. .**.*
36aa0 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65  * The proxy file
36ab0 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 66 69   and the lock fi
36ac0 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64 65 6c  le are never del
36ad0 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f 6e 6c  eted so they onl
36ae0 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
36af0 63 72 65 61 74 65 64 20 74 68 65 20 66 69 72 73  created the firs
36b00 74 20 74 69 6d 65 20 74 68 65 79 20 61 72 65 20  t time they are 
36b10 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66  used..**.** Conf
36b20 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
36b30 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
36b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a  ----------.**.**
36b50 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f    SQLITE_PREFER_
36b60 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a  PROXY_LOCKING.**
36b70 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61 62 61  .**       Databa
36b80 73 65 20 66 69 6c 65 73 20 61 63 63 65 73 73 65  se files accesse
36b90 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66  d on non-local f
36ba0 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72 65 0a  ile systems are.
36bb0 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d 61 74  **       automat
36bc0 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65  ically configure
36bd0 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  d for proxy lock
36be0 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65 73 20  ing, lock files 
36bf0 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d  are.**       nam
36c00 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
36c10 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
36c20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20 20 20  logic as.**     
36c30 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f 70 72    PRAGMA lock_pr
36c40 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74 6f 3a  oxy_file=":auto:
36c50 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53 51 4c  ".**    .**  SQL
36c60 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55 47 0a  ITE_PROXY_DEBUG.
36c70 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e 61 62  **.**       Enab
36c80 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e 67 20  les the logging 
36c90 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  of error message
36ca0 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20 69 64  s during host id
36cb0 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20 20 72   file.**       r
36cc0 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63 72 65  etrieval and cre
36cd0 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43  ation.**.**  LOC
36ce0 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20  KPROXYDIR.**.** 
36cf0 20 20 20 20 20 20 4f 76 65 72 72 69 64 65 73 20        Overrides 
36d00 74 68 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  the default dire
36d10 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72 20 6c  ctory used for l
36d20 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 20  ock proxy files 
36d30 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 61 72  that.**       ar
36d40 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61 74 69  e named automati
36d50 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20 22 3a  cally via the ":
36d60 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67 0a 2a  auto:" setting.*
36d70 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44 45 46  *.**  SQLITE_DEF
36d80 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
36d90 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20  RMISSIONS.**.** 
36da0 20 20 20 20 20 20 50 65 72 6d 69 73 73 69 6f 6e        Permission
36db0 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20 63 72  s to use when cr
36dc0 65 61 74 69 6e 67 20 61 20 64 69 72 65 63 74 6f  eating a directo
36dd0 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 74  ry for storing t
36de0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f 63 6b  he.**       lock
36df0 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20 6f 6e   proxy files, on
36e00 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c 4f 43  ly used when LOC
36e10 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e 6f 74  KPROXYDIR is not
36e20 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20   set..**    .** 
36e30 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74 69 6f     .** As mentio
36e40 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65 6e 20  ned above, when 
36e50 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51  compiled with SQ
36e60 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
36e70 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65  Y_LOCKING,.** se
36e80 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69 72 6f  tting the enviro
36e90 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65 20 53  nment variable S
36ea0 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58  QLITE_FORCE_PROX
36eb0 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31 20 77  Y_LOCKING to 1 w
36ec0 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70 72 6f  ill.** force pro
36ed0 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
36ee0 20 75 73 65 64 20 66 6f 72 20 65 76 65 72 79 20   used for every 
36ef0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 70  database file op
36f00 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a 20 77  ened, and 0.** w
36f10 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f 6d 61  ill force automa
36f20 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  tic proxy lockin
36f30 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  g to be disabled
36f40 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62 61 73   for all databas
36f50 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78 70 6c  e.** files (expl
36f60 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67 20 74  icitly calling t
36f70 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
36f80 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
36f90 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a 20 73  E pragma or.** s
36fa0 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e 74 72  qlite_file_contr
36fb0 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20 61 66  ol API is not af
36fc0 66 65 63 74 65 64 20 62 79 20 53 51 4c 49 54 45  fected by SQLITE
36fd0 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
36fe0 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  KING)..*/../*.**
36ff0 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   Proxy locking i
37000 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
37010 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23   on MacOSX .*/.#
37020 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
37030 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
37040 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
37050 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  TYLE../*.** The 
37060 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
37070 65 78 74 20 68 61 73 20 74 68 65 20 70 61 74 68  ext has the path
37080 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75 63 74   and file struct
37090 75 72 65 73 20 66 6f 72 20 74 68 65 20 72 65 6d  ures for the rem
370a0 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61  ote .** and loca
370b0 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20 69 6e  l proxy files in
370c0 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73   it.*/.typedef s
370d0 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
370e0 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78 79 4c  ngContext proxyL
370f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73  ockingContext;.s
37100 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63 6b 69  truct proxyLocki
37110 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 75 6e  ngContext {.  un
37120 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
37130 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  e;         /* Op
37140 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f  en conch file */
37150 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68 46 69  .  char *conchFi
37160 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  lePath;         
37170 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
37180 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 75  onch file */.  u
37190 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f  nixFile *lockPro
371a0 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  xy;         /* O
371b0 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66  pen proxy lock f
371c0 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 6c  ile */.  char *l
371d0 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20 20 20  ockProxyPath;   
371e0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
371f0 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   the proxy lock 
37200 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
37210 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
37220 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
37230 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  f the open file 
37240 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68 48 65  */.  int conchHe
37250 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
37260 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20 63 6f    /* 1 if the co
37270 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d 31 20  nch is held, -1 
37280 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20  if lockless */. 
37290 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20 20 20   int nFails;    
372a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
372b0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 63 68   Number of conch
372c0 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72 65 73   taking failures
372d0 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c   */.  void *oldL
372e0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
372f0 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c     /* Original l
37300 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f  ockingcontext to
37310 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73   restore on clos
37320 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  e */.  sqlite3_i
37330 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
37340 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20  *pOldMethod;    
37350 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f   /* Original I/O
37360 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f   methods for clo
37370 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a  se */.};../* .**
37380 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20   The proxy lock 
37390 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20 74 68  file path for th
373a0 65 20 64 61 74 61 62 61 73 65 20 61 74 20 64 62  e database at db
373b0 50 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  Path is written 
373c0 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20  into lPath, .** 
373d0 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69 6e 74  which must point
373e0 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69 74 61   to valid, writa
373f0 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65  ble memory large
37400 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20 6d 61   enough for a ma
37410 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66  xLen length.** f
37420 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74  ile path. .*/.st
37430 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65  atic int proxyGe
37440 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73 74 20  tLockPath(const 
37450 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20 63 68  char *dbPath, ch
37460 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f  ar *lPath, size_
37470 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74  t maxLen){.  int
37480 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65   len;.  int dbLe
37490 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66  n;.  int i;..#if
374a0 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52  def LOCKPROXYDIR
374b0 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79  .  len = strlcpy
374c0 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58  (lPath, LOCKPROX
374d0 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23  YDIR, maxLen);.#
374e0 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f 43 53  else.# ifdef _CS
374f0 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
37500 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20 69 66  P_DIR.  {.    if
37510 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ( !confstr(_CS_D
37520 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
37530 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c  DIR, lPath, maxL
37540 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  en) ){.      OST
37550 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41  RACE(("GETLOCKPA
37560 54 48 20 20 66 61 69 6c 65 64 20 25 73 20 65 72  TH  failed %s er
37570 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22  rno=%d pid=%d\n"
37580 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37590 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c 20 6f   lPath, errno, o
375a0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
375b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
375c0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20  E_IOERR_LOCK;.  
375d0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74    }.    len = st
375e0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 73 71  rlcat(lPath, "sq
375f0 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d 61 78  liteplocks", max
37600 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a 23 20  Len);    .  }.# 
37610 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73 74 72  else.  len = str
37620 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f 74 6d  lcpy(lPath, "/tm
37630 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 20  p/", maxLen);.# 
37640 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
37650 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d 31 5d  if( lPath[len-1]
37660 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c 65 6e  !='/' ){.    len
37670 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61 74 68   = strlcat(lPath
37680 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  , "/", maxLen);.
37690 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72 61 6e    }.  .  /* tran
376a0 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70 61 74  sform the db pat
376b0 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20 63 61  h to a unique ca
376c0 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 62  che name */.  db
376d0 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  Len = (int)strle
376e0 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66 6f 72  n(dbPath);.  for
376f0 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e 20 26  ( i=0; i<dbLen &
37700 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69 6e 74  & (i+len+7)<(int
37710 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  )maxLen; i++){. 
37720 20 20 20 63 68 61 72 20 63 20 3d 20 64 62 50 61     char c = dbPa
37730 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61 74 68  th[i];.    lPath
37740 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d 27 2f  [i+len] = (c=='/
37750 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a 20 20  ')?'_':c;.  }.  
37760 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27 5c 30  lPath[i+len]='\0
37770 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c 50 61  ';.  strlcat(lPa
37780 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20 6d 61  th, ":auto:", ma
37790 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41 43 45  xLen);.  OSTRACE
377a0 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20 20  (("GETLOCKPATH  
377b0 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
377c0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 50  %s pid=%d\n", lP
377d0 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ath, osGetpid(0)
377e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
377f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 0a 20  ITE_OK;.}../* . 
37800 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 6c  ** Creates the l
37810 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61 6e 79  ock file and any
37820 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63 74 6f   missing directo
37830 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61 74 68  ries in lockPath
37840 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
37850 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
37860 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ath(const char *
37870 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69 6e 74  lockPath){.  int
37880 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61 72 20   i, len;.  char 
37890 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  buf[MAXPATHLEN];
378a0 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d 20 30  .  int start = 0
378b0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 6c 6f  ;.  .  assert(lo
378c0 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b 0a 20  ckPath!=NULL);. 
378d0 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65 61 74   /* try to creat
378e0 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65 72 6d  e all the interm
378f0 65 64 69 61 74 65 20 64 69 72 65 63 74 6f 72 69  ediate directori
37900 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20 28 69  es */.  len = (i
37910 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b 50 61  nt)strlen(lockPa
37920 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20 3d 20  th);.  buf[0] = 
37930 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20 20 66  lockPath[0];.  f
37940 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e 3b 20  or( i=1; i<len; 
37950 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c  i++ ){.    if( l
37960 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20 27 2f  ockPath[i] == '/
37970 27 20 26 26 20 28 69 20 2d 20 73 74 61 72 74 20  ' && (i - start 
37980 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  > 0) ){.      /*
37990 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66 20 6c   only mkdir if l
379a0 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22 20 6f  eaf dir != "." o
379b0 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20 2a 2f  r "/" or ".." */
379c0 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73 74 61  .      if( i-sta
379d0 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61 72 74  rt>2 || (i-start
379e0 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61 72 74  ==1 && buf[start
379f0 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75 66 5b  ] != '.' && buf[
37a00 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29 20 0a  start] != '/') .
37a10 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 2d 73           || (i-s
37a20 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66 5b 73  tart==2 && buf[s
37a30 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20  tart] != '.' && 
37a40 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21 3d 20  buf[start+1] != 
37a50 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20  '.') ){.        
37a60 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20 20 20  buf[i]='\0';.   
37a70 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64 69 72       if( osMkdir
37a80 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46  (buf, SQLITE_DEF
37a90 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
37aa0 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20  RMISSIONS) ){.  
37ab0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
37ac0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
37ad0 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
37ae0 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   ) {.           
37af0 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
37b00 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45  ELOCKPATH  FAILE
37b10 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22  D creating %s, "
37b20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37b30 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78        "'%s' prox
37b40 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
37b50 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  id=%d\n",.      
37b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
37b70 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  uf, strerror(err
37b80 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f 73 47  ), lockPath, osG
37b90 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 20 20  etpid(0)));.    
37ba0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 65          return e
37bb0 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rr;.          }.
37bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
37bd0 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d 69 2b  }.      start=i+
37be0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 75 66  1;.    }.    buf
37bf0 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69  [i] = lockPath[i
37c00 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  ];.  }.  OSTRACE
37c10 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41 54  (("CREATELOCKPAT
37c20 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61  H  proxy lock pa
37c30 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c  th=%s pid=%d\n",
37c40 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74 70 69  lockPath,osGetpi
37c50 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  d(0)));.  return
37c60 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
37c70 61 74 65 20 61 20 6e 65 77 20 56 46 53 20 66 69  ate a new VFS fi
37c80 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 73  le descriptor (s
37c90 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
37ca0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a  obtained from.**
37cb0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
37cc0 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 66 69   and open the fi
37cd0 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68 22 20  le named "path" 
37ce0 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
37cf0 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  riptor..**.** Th
37d00 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
37d10 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79  onsible not only
37d20 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74 68 65   for closing the
37d30 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37d40 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66 6f 72  .** but also for
37d50 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d 65 6d   freeing the mem
37d60 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
37d70 69 74 68 20 74 68 65 20 66 69 6c 65 20 64 65 73  ith the file des
37d80 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74  criptor..*/.stat
37d90 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72 65 61  ic int proxyCrea
37da0 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20 20 20  teUnixFile(.    
37db0 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
37dc0 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61 74 68  ,        /* path
37dd0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69   for the new uni
37de0 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75 6e 69  xFile */.    uni
37df0 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65 2c 20  xFile **ppFile, 
37e00 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46 69 6c        /* unixFil
37e10 65 20 63 72 65 61 74 65 64 20 61 6e 64 20 72 65  e created and re
37e20 74 75 72 6e 65 64 20 62 79 20 72 65 66 20 2a 2f  turned by ref */
37e30 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63 6b 66  .    int islockf
37e40 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ile           /*
37e50 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73   if non zero mis
37e60 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c 20 62  sing dirs will b
37e70 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29 20 7b  e created */.) {
37e80 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
37e90 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
37ea0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
37eb0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70  ITE_OK;.  int op
37ec0 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
37ed0 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71   | O_CREAT;.  sq
37ee0 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56  lite3_vfs dummyV
37ef0 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f  fs;.  int terrno
37f00 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73   = 0;.  UnixUnus
37f10 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20  edFd *pUnused = 
37f20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66  NULL;..  /* 1. f
37f30 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e  irst try to open
37f40 2f 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65  /create the file
37f50 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74  .  ** 2. if that
37f60 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73   fails, and this
37f70 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   is a lock file 
37f80 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79  (not-conch), try
37f90 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74   creating.  ** t
37fa0 68 65 20 70 61 72 65 6e 74 20 64 69 72 65 63 74  he parent direct
37fb0 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74  ories and then t
37fc0 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33  ry again..  ** 3
37fd0 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c  . if that fails,
37fe0 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65   try to open the
37ff0 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a   file read-only.
38000 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72    ** otherwise r
38010 65 74 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c  eturn BUSY (if l
38020 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e  ock file) or CAN
38030 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f  TOPEN for the co
38040 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20  nch file.  */.  
38050 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65  pUnused = findRe
38060 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f  usableFd(path, o
38070 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28  penFlags);.  if(
38080 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
38090 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
380a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
380b0 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
380c0 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66  _malloc64(sizeof
380d0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
380e0 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
380f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
38100 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
38110 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
38120 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 66 64 20   fd<0 ){.    fd 
38130 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61  = robust_open(pa
38140 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30  th, openFlags, 0
38150 29 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20  );.    terrno = 
38160 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66  errno;.    if( f
38170 64 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e  d<0 && errno==EN
38180 4f 45 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69  OENT && islockfi
38190 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
381a0 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50  proxyCreateLockP
381b0 61 74 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c  ath(path) == SQL
381c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
381d0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
381e0 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61  en(path, openFla
381f0 67 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  gs, 0);.      }.
38200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
38210 66 64 3c 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  fd<0 ){.    open
38220 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59  Flags = O_RDONLY
38230 3b 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73  ;.    fd = robus
38240 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65  t_open(path, ope
38250 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20  nFlags, 0);.    
38260 74 65 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  terrno = errno;.
38270 20 20 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29    }.  if( fd<0 )
38280 7b 0a 20 20 20 20 69 66 28 20 69 73 6c 6f 63 6b  {.    if( islock
38290 66 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 72 65  file ){.      re
382a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
382b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74  ;.    }.    swit
382c0 63 68 20 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20  ch (terrno) {.  
382d0 20 20 20 20 63 61 73 65 20 45 41 43 43 45 53 3a      case EACCES:
382e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
382f0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
38300 20 20 20 63 61 73 65 20 45 49 4f 3a 20 0a 20 20     case EIO: .  
38310 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
38320 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20  ITE_IOERR_LOCK; 
38330 2f 2a 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  /* even though i
38340 74 20 69 73 20 74 68 65 20 63 6f 6e 63 68 20 2a  t is the conch *
38350 2f 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  /.      default:
38360 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
38370 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
38380 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BKPT;.    }.  }.
38390 20 20 0a 20 20 70 4e 65 77 20 3d 20 28 75 6e 69    .  pNew = (uni
383a0 78 46 69 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f  xFile *)sqlite3_
383b0 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28  malloc64(sizeof(
383c0 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
383d0 4e 65 77 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  New==NULL ){.   
383e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
383f0 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 67 6f 74  EM_BKPT;.    got
38400 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72 6f  o end_create_pro
38410 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  xy;.  }.  memset
38420 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (pNew, 0, sizeof
38430 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 70  (unixFile));.  p
38440 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d  New->openFlags =
38450 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d 65   openFlags;.  me
38460 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c 20  mset(&dummyVfs, 
38470 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79 56  0, sizeof(dummyV
38480 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66 73  fs));.  dummyVfs
38490 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f 69  .pAppData = (voi
384a0 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  d*)&autolockIoFi
384b0 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66 73  nder;.  dummyVfs
384c0 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79 22  .zName = "dummy"
384d0 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20  ;.  pUnused->fd 
384e0 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d  = fd;.  pUnused-
384f0 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  >flags = openFla
38500 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72 65  gs;.  pNew->pPre
38510 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20  allocatedUnused 
38520 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20 0a 20 20  = pUnused;.  .  
38530 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
38540 69 6c 65 28 26 64 75 6d 6d 79 56 66 73 2c 20 66  ile(&dummyVfs, f
38550 64 2c 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  d, (sqlite3_file
38560 2a 29 70 4e 65 77 2c 20 70 61 74 68 2c 20 30 29  *)pNew, path, 0)
38570 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
38580 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70  TE_OK ){.    *pp
38590 46 69 6c 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  File = pNew;.   
385a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
385b0 4b 3b 0a 20 20 7d 0a 65 6e 64 5f 63 72 6