/ Hex Artifact Content
Login

Artifact d6ee0c3b3f221dd5f3cec95f0400a581c516d04ea16a2916bba17c55127d8e06:


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 64 65 66  */.#endif.#ifdef
1f30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1f40: 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 75  ETLK_TIMEOUT.  u
1f50: 6e 73 69 67 6e 65 64 20 69 42 75 73 79 54 69 6d  nsigned iBusyTim
1f60: 65 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 20  eout;           
1f70: 20 20 20 2f 2a 20 57 61 69 74 20 74 68 69 73 20     /* Wait this 
1f80: 6d 61 6e 79 20 6d 69 6c 6c 69 73 65 63 20 6f 6e  many millisec on
1f90: 20 6c 6f 63 6b 73 20 2a 2f 0a 23 65 6e 64 69 66   locks */.#endif
1fa0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fb0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1fc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1fd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1fe0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1ff0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2000: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2010: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2020: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2030: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2040: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2050: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2060: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
2070: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
2080: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
2090: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
20a0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
20b0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
20c0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
20d0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
20e0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
20f0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2100: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2110: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2120: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2130: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2140: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2150: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
2160: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
2170: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
2180: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
2190: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21a0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
21b0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
21c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
21d0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
21e0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21f0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2200: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2210: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2220: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2230: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2240: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2250: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2260: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2270: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2280: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2290: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
22a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
22b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
22c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
22d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
22e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
22f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2300: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2310: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2320: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2330: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2340: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2350: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2360: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2370: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2380: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2390: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
23a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
23b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
23c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
23d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
23e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
23f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2400: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2410: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2420: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2430: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2440: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2450: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2460: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2470: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2480: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2490: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
24a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
24b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
24c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
24d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
24e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
24f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2500: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2510: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2520: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2530: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2540: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2550: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2560: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2570: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2580: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2590: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
25a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
25b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
25c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
25d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
25e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
25f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2600: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2610: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2620: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2630: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2640: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2650: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2660: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2670: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2680: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2690: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
26a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
26b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
26d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
26e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
26f0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2700: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2710: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2720: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2730: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2740: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2750: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2760: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
2770: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
2780: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
2790: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27a0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27b0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
27c0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
27d0: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
27e0: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
27f0: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2800: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2810: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2820: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2830: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2840: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2850: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2860: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
2870: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
2880: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
2890: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
28a0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
28b0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
28c0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
28d0: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
28e0: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
28f0: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2900: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2910: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2920: 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d 41  /*.** HAVE_MREMA
2930: 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74 72  P defaults to tr
2940: 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64 20  ue on Linux and 
2950: 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72 65  false everywhere
2960: 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21 64   else..*/.#if !d
2970: 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45 4d  efined(HAVE_MREM
2980: 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65 64  AP).# if defined
2990: 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64  (__linux__) && d
29a0: 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55 52  efined(_GNU_SOUR
29b0: 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48 41  CE).#  define HA
29c0: 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65 6c  VE_MREMAP 1.# el
29d0: 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41 56  se.#  define HAV
29e0: 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e 64  E_MREMAP 0.# end
29f0: 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  if.#endif../*.**
2a00: 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c   Explicitly call
2a10: 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72 73   the 64-bit vers
2a20: 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20 6f  ion of lseek() o
2a30: 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65 72  n Android. Other
2a40: 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a  wise, lseek().**
2a50: 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20 76   is the 32-bit v
2a60: 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66 20  ersion, even if 
2a70: 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54  _FILE_OFFSET_BIT
2a80: 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e  S=64 is defined.
2a90: 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  .*/.#ifdef __AND
2aa0: 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65 20  ROID__.# define 
2ab0: 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23 65  lseek lseek64.#e
2ac0: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f 5f 6c  ndif..#ifdef __l
2ad0: 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 4c 69 6e  inux__./*.** Lin
2ae0: 75 78 2d 73 70 65 63 69 66 69 63 20 49 4f 43 54  ux-specific IOCT
2af0: 4c 20 6d 61 67 69 63 20 6e 75 6d 62 65 72 73 20  L magic numbers 
2b00: 75 73 65 64 20 66 6f 72 20 63 6f 6e 74 72 6f 6c  used for control
2b10: 6c 69 6e 67 20 46 32 46 53 0a 2a 2f 0a 23 64 65  ling F2FS.*/.#de
2b20: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 54 4c 5f  fine F2FS_IOCTL_
2b30: 4d 41 47 49 43 20 20 20 20 20 20 20 20 30 78 66  MAGIC        0xf
2b40: 35 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49  5.#define F2FS_I
2b50: 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d 49 43 5f  OC_START_ATOMIC_
2b60: 57 52 49 54 45 20 20 20 20 20 5f 49 4f 28 46 32  WRITE     _IO(F2
2b70: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20  FS_IOCTL_MAGIC, 
2b80: 31 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f  1).#define F2FS_
2b90: 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  IOC_COMMIT_ATOMI
2ba0: 43 5f 57 52 49 54 45 20 20 20 20 5f 49 4f 28 46  C_WRITE    _IO(F
2bb0: 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c  2FS_IOCTL_MAGIC,
2bc0: 20 32 29 0a 23 64 65 66 69 6e 65 20 46 32 46 53   2).#define F2FS
2bd0: 5f 49 4f 43 5f 53 54 41 52 54 5f 56 4f 4c 41 54  _IOC_START_VOLAT
2be0: 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f 28  ILE_WRITE   _IO(
2bf0: 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43  F2FS_IOCTL_MAGIC
2c00: 2c 20 33 29 0a 23 64 65 66 69 6e 65 20 46 32 46  , 3).#define F2F
2c10: 53 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41  S_IOC_ABORT_VOLA
2c20: 54 49 4c 45 5f 57 52 49 54 45 20 20 20 5f 49 4f  TILE_WRITE   _IO
2c30: 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49  (F2FS_IOCTL_MAGI
2c40: 43 2c 20 35 29 0a 23 64 65 66 69 6e 65 20 46 32  C, 5).#define F2
2c50: 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55  FS_IOC_GET_FEATU
2c60: 52 45 53 20 20 20 20 20 20 20 20 20 20 20 5f 49  RES           _I
2c70: 4f 52 28 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41  OR(F2FS_IOCTL_MA
2c80: 47 49 43 2c 20 31 32 2c 20 75 33 32 29 0a 23 64  GIC, 12, u32).#d
2c90: 65 66 69 6e 65 20 46 32 46 53 5f 46 45 41 54 55  efine F2FS_FEATU
2ca0: 52 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20  RE_ATOMIC_WRITE 
2cb0: 30 78 30 30 30 34 0a 23 65 6e 64 69 66 20 2f 2a  0x0004.#endif /*
2cc0: 20 5f 5f 6c 69 6e 75 78 5f 5f 20 2a 2f 0a 0a 0a   __linux__ */...
2cd0: 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e 74 20  /*.** Different 
2ce0: 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64 65 63  Unix systems dec
2cf0: 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e 20 64  lare open() in d
2d00: 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e 20 20  ifferent ways.  
2d10: 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70 65 6e  Same use.** open
2d20: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
2d30: 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68 65 72  ,mode_t).  Other
2d40: 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e 73 74  s use open(const
2d50: 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e   char*,int,...).
2d60: 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
2d70: 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  ce is important 
2d80: 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70 6f 69  when using a poi
2d90: 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75 6e 63  nter to the func
2da0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
2db0: 73 61 66 65 73 74 20 77 61 79 20 74 6f 20 64 65  safest way to de
2dc0: 61 6c 20 77 69 74 68 20 74 68 65 20 70 72 6f 62  al with the prob
2dd0: 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61 79 73  lem is to always
2de0: 20 75 73 65 20 74 68 69 73 20 77 72 61 70 70 65   use this wrappe
2df0: 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77 61 79  r.** which alway
2e00: 73 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 77  s has the same w
2e10: 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e 74 65  ell-defined inte
2e20: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
2e30: 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e 28 63   int posixOpen(c
2e40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2e50: 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74  , int flags, int
2e60: 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75 72 6e   mode){.  return
2e70: 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66 6c 61   open(zFile, fla
2e80: 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a  gs, mode);.}../*
2e90: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2ea0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2eb0: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2ec0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ed0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2ee0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2ef0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2f00: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2f10: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2f20: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2f30: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2f40: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2f50: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2f60: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2f70: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2f80: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2f90: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2fa0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2fb0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2fc0: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2fd0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2fe0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2ff0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
3000: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
3010: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
3020: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
3030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3040: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
3050: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
3060: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
3070: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
3080: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
3090: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
30a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
30b0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
30c0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
30d0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
30e0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
30f0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
3100: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
3110: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
3120: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
3130: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
3140: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
3150: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
3160: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
3170: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
3180: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3190: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
31a0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
31b0: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
31c0: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
31d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
31e0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
31f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3200: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
3210: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3220: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3230: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3240: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3250: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3260: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3270: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3280: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3290: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
32a0: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
32b0: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
32c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
32d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
32e0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
32f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3300: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
3310: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
3320: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3330: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3340: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3350: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3360: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3370: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3380: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3390: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
33a0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
33b0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
33c0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
33d0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
33e0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
33f0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
3400: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
3410: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
3420: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3430: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3440: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3450: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3460: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3470: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3480: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3490: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
34a0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
34b0: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
34c0: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
34d0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
34e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
34f0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
3500: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
3510: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
3520: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3530: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3540: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3550: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3560: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3570: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3580: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3590: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
35a0: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
35b0: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
35c0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
35d0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
35e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
35f0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
3600: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
3610: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
3620: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3630: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3640: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3650: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3660: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3670: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3680: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3690: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
36a0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
36b0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
36c0: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
36d0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
36e0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
36f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
3700: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
3710: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
3720: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3730: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3740: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3750: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3760: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3770: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3780: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3790: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
37a0: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
37b0: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
37c0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
37d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
37e0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
37f0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
3800: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
3810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3820: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3830: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3840: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3850: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3860: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3870: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3880: 6f 73 50 72 65 61 64 36 34 20 28 28 73 73 69 7a  osPread64 ((ssiz
3890: 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a  e_t(*)(int,void*
38a0: 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f 74 29  ,size_t,off64_t)
38b0: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
38c0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
38d0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
38e0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
38f0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
3900: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
3910: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
3920: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3930: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3940: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3950: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3960: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3980: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3990: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
39a0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
39b0: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
39c0: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
39d0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
39e0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
39f0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
3a00: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
3a10: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
3a20: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3a30: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3a40: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a60: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3a70: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3a80: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3a90: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3aa0: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3ab0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3ac0: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
3ad0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
3ae0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
3af0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
3b00: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3b10: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3b20: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3b30: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3b40: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3b50: 66 66 36 34 5f 74 29 29 5c 0a 20 20 20 20 20 20  ff64_t))\.      
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
3b70: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
3b80: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
3b90: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
3ba0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
3bb0: 63 68 6d 6f 64 2c 20 20 20 20 20 20 20 20 20 20  chmod,          
3bc0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
3bd0: 46 63 68 6d 6f 64 20 20 20 20 28 28 69 6e 74 28  Fchmod    ((int(
3be0: 2a 29 28 69 6e 74 2c 6d 6f 64 65 5f 74 29 29 61  *)(int,mode_t))a
3bf0: 53 79 73 63 61 6c 6c 5b 31 34 5d 2e 70 43 75 72  Syscall[14].pCur
3c00: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
3c10: 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
3c20: 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
3c30: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
3c40: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
3c50: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
3c60: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 5f  scall_ptr)posix_
3c70: 66 61 6c 6c 6f 63 61 74 65 2c 20 20 30 20 7d 2c  fallocate,  0 },
3c80: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 61 6c 6c  .#else.  { "fall
3c90: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
3ca0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3cb0: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3cc0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
3cd0: 65 66 69 6e 65 20 6f 73 46 61 6c 6c 6f 63 61 74  efine osFallocat
3ce0: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
3cf0: 66 66 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79 73  ff_t,off_t))aSys
3d00: 63 61 6c 6c 5b 31 35 5d 2e 70 43 75 72 72 65 6e  call[15].pCurren
3d10: 74 29 0a 0a 20 20 7b 20 22 75 6e 6c 69 6e 6b 22  t)..  { "unlink"
3d20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3d30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 75 6e 6c  _syscall_ptr)unl
3d40: 69 6e 6b 2c 20 20 20 20 20 20 20 20 20 20 20 30  ink,           0
3d50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 55 6e   },.#define osUn
3d60: 6c 69 6e 6b 20 20 20 20 28 28 69 6e 74 28 2a 29  link    ((int(*)
3d70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
3d80: 79 73 63 61 6c 6c 5b 31 36 5d 2e 70 43 75 72 72  yscall[16].pCurr
3d90: 65 6e 74 29 0a 0a 20 20 7b 20 22 6f 70 65 6e 44  ent)..  { "openD
3da0: 69 72 65 63 74 6f 72 79 22 2c 20 20 20 20 28 73  irectory",    (s
3db0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3dc0: 74 72 29 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  tr)openDirectory
3dd0: 2c 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  ,      0 },.#def
3de0: 69 6e 65 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  ine osOpenDirect
3df0: 6f 72 79 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e  ory ((int(*)(con
3e00: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2a 29 29 61  st char*,int*))a
3e10: 53 79 73 63 61 6c 6c 5b 31 37 5d 2e 70 43 75 72  Syscall[17].pCur
3e20: 72 65 6e 74 29 0a 0a 20 20 7b 20 22 6d 6b 64 69  rent)..  { "mkdi
3e30: 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69  r",        (sqli
3e40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
3e50: 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 20 20  mkdir,          
3e60: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3e70: 4d 6b 64 69 72 20 20 20 20 20 28 28 69 6e 74 28  Mkdir     ((int(
3e80: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 6d  *)(const char*,m
3e90: 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ode_t))aSyscall[
3ea0: 31 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  18].pCurrent).. 
3eb0: 20 7b 20 22 72 6d 64 69 72 22 2c 20 20 20 20 20   { "rmdir",     
3ec0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ed0: 61 6c 6c 5f 70 74 72 29 72 6d 64 69 72 2c 20 20  all_ptr)rmdir,  
3ee0: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3ef0: 65 66 69 6e 65 20 6f 73 52 6d 64 69 72 20 20 20  efine osRmdir   
3f00: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
3f10: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
3f20: 5b 31 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [19].pCurrent)..
3f30: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
3f40: 5f 46 43 48 4f 57 4e 29 0a 20 20 7b 20 22 66 63  _FCHOWN).  { "fc
3f50: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3f60: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3f70: 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20 20  r)fchown,       
3f80: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
3f90: 7b 20 22 66 63 68 6f 77 6e 22 2c 20 20 20 20 20  { "fchown",     
3fa0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3fb0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
3fc0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
3fd0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  dif.#define osFc
3fe0: 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a 29  hown    ((int(*)
3ff0: 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f 74  (int,uid_t,gid_t
4000: 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e 70  ))aSyscall[20].p
4010: 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65  Current)..#if de
4020: 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57  fined(HAVE_FCHOW
4030: 4e 29 0a 20 20 7b 20 22 67 65 74 65 75 69 64 22  N).  { "geteuid"
4040: 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ,      (sqlite3_
4050: 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65 74 65  syscall_ptr)gete
4060: 75 69 64 2c 20 20 20 20 20 20 20 20 20 30 20 7d  uid,         0 }
4070: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 67 65 74  ,.#else.  { "get
4080: 65 75 69 64 22 2c 20 20 20 20 20 20 28 73 71 6c  euid",      (sql
4090: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
40a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
40b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
40c0: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
40d0: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
40e0: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
40f0: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
4100: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
4110: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
4120: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
4130: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
4140: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
4150: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70  syscall_ptr)mmap
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d  ,            0 }
4170: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 6d 61  ,.#else.  { "mma
4180: 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  p",         (sql
4190: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
41a0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
41b0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
41c0: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
41d0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
41e0: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
41f0: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
4200: 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [22].pCurrent)..
4210: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
4220: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
4230: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
4240: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 75 6e  _SIZE>0.  { "mun
4250: 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c  map",       (sql
4260: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4270: 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  )munmap,        
4280: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4290: 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20   "munmap",      
42a0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
42b0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
42c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
42d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 75 6e  if.#define osMun
42e0: 6d 61 70 20 28 28 69 6e 74 28 2a 29 28 76 6f 69  map ((int(*)(voi
42f0: 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63  d*,size_t))aSysc
4300: 61 6c 6c 5b 32 33 5d 2e 70 43 75 72 72 65 6e 74  all[23].pCurrent
4310: 29 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  )..#if HAVE_MREM
4320: 41 50 20 26 26 20 28 21 64 65 66 69 6e 65 64 28  AP && (!defined(
4330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
4340: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
4350: 4d 41 50 5f 53 49 5a 45 3e 30 29 0a 20 20 7b 20  MAP_SIZE>0).  { 
4360: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
4370: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
4380: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
4390: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
43a0: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
43b0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
43c0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
43d0: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
43e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
43f0: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
4400: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
4410: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
4420: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
4430: 72 72 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66  rrent)..#if !def
4440: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
4450: 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f  _WAL) || SQLITE_
4460: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
4470: 20 20 7b 20 22 67 65 74 70 61 67 65 73 69 7a 65    { "getpagesize
4480: 22 2c 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73  ",  (sqlite3_sys
4490: 63 61 6c 6c 5f 70 74 72 29 75 6e 69 78 47 65 74  call_ptr)unixGet
44a0: 70 61 67 65 73 69 7a 65 2c 20 30 20 7d 2c 0a 23  pagesize, 0 },.#
44b0: 65 6c 73 65 0a 20 20 7b 20 22 67 65 74 70 61 67  else.  { "getpag
44c0: 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69 74 65  esize",  (sqlite
44d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
44e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
44f0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
4500: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
4510: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
4520: 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75  aSyscall[25].pCu
4530: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
4540: 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
4550: 4b 29 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b  K).  { "readlink
4560: 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f  ",     (sqlite3_
4570: 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61 64  syscall_ptr)read
4580: 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20 7d  link,        0 }
4590: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 72 65 61  ,.#else.  { "rea
45a0: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
45b0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
45c0: 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  )0,             
45d0: 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64    0 },.#endif.#d
45e0: 65 66 69 6e 65 20 6f 73 52 65 61 64 6c 69 6e 6b  efine osReadlink
45f0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 63 6f   ((ssize_t(*)(co
4600: 6e 73 74 20 63 68 61 72 2a 2c 63 68 61 72 2a 2c  nst char*,char*,
4610: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
4620: 5b 32 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [26].pCurrent)..
4630: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
4640: 5f 4c 53 54 41 54 29 0a 20 20 7b 20 22 6c 73 74  _LSTAT).  { "lst
4650: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
4660: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
4670: 72 29 6c 73 74 61 74 2c 20 20 20 20 20 20 20 20  r)lstat,        
4680: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
4690: 20 22 6c 73 74 61 74 22 2c 20 20 20 20 20 20 20   "lstat",       
46a0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
46b0: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
46c0: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
46d0: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4c 73 74  if.#define osLst
46e0: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
46f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
4700: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
4710: 61 6c 6c 5b 32 37 5d 2e 70 43 75 72 72 65 6e 74  all[27].pCurrent
4720: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
4730: 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66  _linux__) && def
4740: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
4750: 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
4760: 57 52 49 54 45 29 0a 20 20 7b 20 22 69 6f 63 74  WRITE).  { "ioct
4770: 6c 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  l",         (sql
4780: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
4790: 29 69 6f 63 74 6c 2c 20 20 20 20 20 20 20 20 20  )ioctl,         
47a0: 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20   0 },.#else.  { 
47b0: 22 69 6f 63 74 6c 22 2c 20 20 20 20 20 20 20 20  "ioctl",        
47c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
47d0: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
47e0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69        0 },.#endi
47f0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 49 6f 63 74  f.#define osIoct
4800: 6c 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69  l ((int(*)(int,i
4810: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
4820: 5b 32 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [28].pCurrent)..
4830: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
4840: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
4850: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a  stem calls */...
4860: 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79  /*.** On some sy
4870: 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20  stems, calls to 
4880: 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72  fchown() will tr
4890: 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20  igger a message 
48a0: 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a  in a security.**
48b0: 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d   log if they com
48c0: 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20  e from non-root 
48d0: 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61  processes.  So a
48e0: 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68  void calling fch
48f0: 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61  own() if.** we a
4900: 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61  re not running a
4910: 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  s root..*/.stati
4920: 63 20 69 6e 74 20 72 6f 62 75 73 74 46 63 68 6f  c int robustFcho
4930: 77 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74  wn(int fd, uid_t
4940: 20 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29   uid, gid_t gid)
4950: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  {.#if defined(HA
4960: 56 45 5f 46 43 48 4f 57 4e 29 0a 20 20 72 65 74  VE_FCHOWN).  ret
4970: 75 72 6e 20 6f 73 47 65 74 65 75 69 64 28 29 20  urn osGeteuid() 
4980: 3f 20 30 20 3a 20 6f 73 46 63 68 6f 77 6e 28 66  ? 0 : osFchown(f
4990: 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23 65 6c 73  d,uid,gid);.#els
49a0: 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
49b0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
49c0: 69 73 20 69 73 20 74 68 65 20 78 53 65 74 53 79  is is the xSetSy
49d0: 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74 68 6f  stemCall() metho
49e0: 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
49f0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 0a   for all of the.
4a00: 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65 73 2e  ** "unix" VFSes.
4a10: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4a20: 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73 73 66  OK opon successf
4a30: 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20 74 68  ully updating th
4a40: 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c  e.** system call
4a50: 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53 51 4c   pointer, or SQL
4a60: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69 66 20  ITE_NOTFOUND if 
4a70: 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f 6e 66  there is no conf
4a80: 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79 73 74  igurable.** syst
4a90: 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20 7a 4e  em call named zN
4aa0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
4ab0: 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74 65 6d  nt unixSetSystem
4ac0: 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f  Call(.  sqlite3_
4ad0: 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c 20 20  vfs *pNotUsed,  
4ae0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
4af0: 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74 20 75   pointer.  Not u
4b00: 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  sed */.  const c
4b10: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20  har *zName,     
4b20: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4b30: 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  f system call to
4b40: 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20 20 73   override */.  s
4b50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
4b60: 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f 2a 20  tr pNewFunc  /* 
4b70: 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20 73  Pointer to new s
4b80: 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c 75 65  ystem call value
4b90: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
4ba0: 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72  d int i;.  int r
4bb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  c = SQLITE_NOTFO
4bc0: 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  UND;..  UNUSED_P
4bd0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
4be0: 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d  d);.  if( zName=
4bf0: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  =0 ){.    /* If 
4c00: 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69 76 65  no zName is give
4c10: 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c 20 73  n, restore all s
4c20: 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f 20 74  ystem calls to t
4c30: 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20 20 20  heir default.   
4c40: 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61 6e 64   ** settings and
4c50: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20 20 20   return NULL.   
4c60: 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
4c70: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f 72 28  ITE_OK;.    for(
4c80: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53  i=0; i<sizeof(aS
4c90: 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66 28 61  yscall)/sizeof(a
4ca0: 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b  Syscall[0]); i++
4cb0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 53 79  ){.      if( aSy
4cc0: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4cd0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 53 79  t ){.        aSy
4ce0: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4cf0: 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  t = aSyscall[i].
4d00: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
4d10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
4d20: 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
4d30: 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 6f   is specified, o
4d40: 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79 20 74  perate on only t
4d50: 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20 63 61  he one system ca
4d60: 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63 69 66  ll.    ** specif
4d70: 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ied..    */.    
4d80: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4d90: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
4da0: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
4db0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
4dc0: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
4dd0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4de0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
4df0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
4e00: 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b 0a 20  pDefault==0 ){. 
4e10: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
4e20: 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20 3d 20  l[i].pDefault = 
4e30: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4e40: 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rent;.        }.
4e50: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
4e60: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
4e70: 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d 30 20  if( pNewFunc==0 
4e80: 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61 53 79  ) pNewFunc = aSy
4e90: 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c  scall[i].pDefaul
4ea0: 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79 73 63  t;.        aSysc
4eb0: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 20  all[i].pCurrent 
4ec0: 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20 20 20  = pNewFunc;.    
4ed0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4ee0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
4ef0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
4f00: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61  ** Return the va
4f10: 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65 6d 20  lue of a system 
4f20: 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55  call.  Return NU
4f30: 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73 20 6e  LL if zName is n
4f40: 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a  ot a.** recogniz
4f50: 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ed system call n
4f60: 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20 61 6c  ame.  NULL is al
4f70: 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66 20 74  so returned if t
4f80: 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 0a 2a  he system call.*
4f90: 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  * is currently u
4fa0: 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61  ndefined..*/.sta
4fb0: 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79 73 63  tic sqlite3_sysc
4fc0: 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65 74 53  all_ptr unixGetS
4fd0: 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c  ystemCall(.  sql
4fe0: 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73  ite3_vfs *pNotUs
4ff0: 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ed,.  const char
5000: 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75 6e 73   *zName.){.  uns
5010: 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a 20 20  igned int i;..  
5020: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5030: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 66 6f  (pNotUsed);.  fo
5040: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
5050: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
5060: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
5070: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
5080: 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79 73 63  cmp(zName, aSysc
5090: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  all[i].zName)==0
50a0: 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61   ) return aSysca
50b0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a  ll[i].pCurrent;.
50c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
50d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
50e0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
50f0: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
5100: 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e 20 20  l after zName.  
5110: 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c 0a 2a  If zName==NULL.*
5120: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  * then return th
5130: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  e name of the fi
5140: 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  rst system call.
5150: 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
5160: 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74 68 65   zName.** is the
5170: 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63 61 6c   last system cal
5180: 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20 69 73  l or if zName is
5190: 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
51a0: 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79 73 74   a valid.** syst
51b0: 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74  em call..*/.stat
51c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
51d0: 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43 61 6c  nixNextSystemCal
51e0: 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  l(sqlite3_vfs *p
51f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
5200: 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20  ame){.  int i = 
5210: 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  -1;..  UNUSED_PA
5220: 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 69 66  RAMETER(p);.  if
5230: 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66  ( zName ){.    f
5240: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
5250: 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d 31 3b  ize(aSyscall)-1;
5260: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
5270: 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61   strcmp(zName, a
5280: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
5290: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
52a0: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 2b    }.  }.  for(i+
52b0: 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  +; i<ArraySize(a
52c0: 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29 7b 0a  Syscall); i++){.
52d0: 20 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c      if( aSyscall
52e0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d 30 20  [i].pCurrent!=0 
52f0: 29 20 72 65 74 75 72 6e 20 61 53 79 73 63 61 6c  ) return aSyscal
5300: 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 7d 0a  l[i].zName;.  }.
5310: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5320: 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63 63 65  *.** Do not acce
5330: 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65 73 63  pt any file desc
5340: 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68 61 6e  riptor less than
5350: 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69 6e 20   this value, in 
5360: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 0a 2a  order to avoid.*
5370: 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61 62 61  * opening databa
5380: 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20 66 69  se file using fi
5390: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
53a0: 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 6c 79  hat are commonly
53b0: 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20 73 74   used for .** st
53c0: 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 6f 75  andard input, ou
53d0: 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f 72 2e  tput, and error.
53e0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
53f0: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
5400: 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64 65 66  DESCRIPTOR.# def
5410: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  ine SQLITE_MINIM
5420: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5430: 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  OR 3.#endif../*.
5440: 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e 28 29  ** Invoke open()
5450: 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69 70 6c  .  Do so multipl
5460: 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c 20 69  e times, until i
5470: 74 20 65 69 74 68 65 72 20 73 75 63 63 65 65 64  t either succeed
5480: 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20 66 6f  s or.** fails fo
5490: 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20 6f 74  r some reason ot
54a0: 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52 2e 0a  her than EINTR..
54b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
54c0: 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20  e creation mode 
54d0: 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20 73 65  "m" is 0 then se
54e0: 74 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61  t it to the defa
54f0: 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c 69 74  ult for.** SQLit
5500: 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  e.  The default 
5510: 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  is SQLITE_DEFAUL
5520: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
5530: 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20  NS (normally.** 
5540: 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66 69 65  0644) as modifie
5550: 64 20 62 79 20 74 68 65 20 73 79 73 74 65 6d 20  d by the system 
5560: 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69 73 20  umask.  If m is 
5570: 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a 20 6d  not 0, then.** m
5580: 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63 72 65  ake the file cre
5590: 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20 65 78  ation mode be ex
55a0: 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69 6e 67  actly m ignoring
55b0: 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 0a 2a   the umask..**.*
55c0: 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65 74 65  * The m paramete
55d0: 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d 7a 65  r will be non-ze
55e0: 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63 72 65  ro only when cre
55f0: 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a 6f 75  ating -wal, -jou
5600: 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d 73 68  rnal,.** and -sh
5610: 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77 61 6e  m files.  We wan
5620: 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20 74 6f  t those files to
5630: 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79 2a 20   have *exactly* 
5640: 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65 72 6d  the same.** perm
5650: 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65 69 72  issions as their
5660: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
5670: 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61 74 65  se, unadulterate
5680: 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
5690: 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79 2c 20  ** In that way, 
56a0: 69 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69  if a database fi
56b0: 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72 77 20  le is -rw-rw-rw 
56c0: 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20 61 6e  or -rw-rw-r-, an
56d0: 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  d a.** transacti
56e0: 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64 20 6c  on crashes and l
56f0: 65 61 76 65 73 20 62 65 68 69 6e 64 20 68 6f 74  eaves behind hot
5700: 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 6e 20   journals, then 
5710: 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74  any.** process t
5720: 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f 20 77  hat is able to w
5730: 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74 61  rite to the data
5740: 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f 20 62  base will also b
5750: 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72 65 63  e able to.** rec
5760: 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a 6f 75  over the hot jou
5770: 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rnals..*/.static
5780: 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70 65 6e   int robust_open
5790: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
57a0: 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20 6d 29  int f, mode_t m)
57b0: 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 6d 6f  {.  int fd;.  mo
57c0: 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20 6d 20  de_t m2 = m ? m 
57d0: 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  : SQLITE_DEFAULT
57e0: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
57f0: 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 23  S;.  while(1){.#
5800: 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f  if defined(O_CLO
5810: 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d 20 6f  EXEC).    fd = o
5820: 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c 4f 45  sOpen(z,f|O_CLOE
5830: 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65 0a 20  XEC,m2);.#else. 
5840: 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a     fd = osOpen(z
5850: 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66 0a 20  ,f,m2);.#endif. 
5860: 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20     if( fd<0 ){. 
5870: 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
5880: 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e 75 65  EINTR ) continue
5890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
58a0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 64 3e     }.    if( fd>
58b0: 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f  =SQLITE_MINIMUM_
58c0: 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 20  FILE_DESCRIPTOR 
58d0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f 73 43  ) break;.    osC
58e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 73 71  lose(fd);.    sq
58f0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
5900: 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20 20 20  _WARNING, .     
5910: 20 20 20 20 20 20 20 20 20 20 20 22 61 74 74 65             "atte
5920: 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22 25 73  mpt to open \"%s
5930: 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73 63 72  \" as file descr
5940: 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20 66 64  iptor %d", z, fd
5950: 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31 3b 0a  );.    fd = -1;.
5960: 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e 28 22      if( osOpen("
5970: 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c 20 6d  /dev/null", f, m
5980: 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  )<0 ) break;.  }
5990: 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a  .  if( fd>=0 ){.
59a0: 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29 7b 0a      if( m!=0 ){.
59b0: 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
59c0: 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20 20 20  t statbuf;.     
59d0: 20 69 66 28 20 6f 73 46 73 74 61 74 28 66 64 2c   if( osFstat(fd,
59e0: 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20 0a 20   &statbuf)==0 . 
59f0: 20 20 20 20 20 20 26 26 20 73 74 61 74 62 75 66        && statbuf
5a00: 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20 20 20  .st_size==0.    
5a10: 20 20 20 26 26 20 28 73 74 61 74 62 75 66 2e 73     && (statbuf.s
5a20: 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d 6d 20  t_mode&0777)!=m 
5a30: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
5a40: 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c 20 6d    osFchmod(fd, m
5a50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5a60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46 44 5f  .#if defined(FD_
5a70: 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21 64 65  CLOEXEC) && (!de
5a80: 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29  fined(O_CLOEXEC)
5a90: 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d 3d 30   || O_CLOEXEC==0
5aa0: 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64  ).    osFcntl(fd
5ab0: 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46 63 6e  , F_SETFD, osFcn
5ac0: 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44 2c 20  tl(fd, F_GETFD, 
5ad0: 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45 43 29  0) | FD_CLOEXEC)
5ae0: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
5af0: 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f 2a 0a  eturn fd;.}../*.
5b00: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
5b10: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
5b20: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
5b30: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
5b40: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
5b50: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
5b60: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
5b70: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
5b80: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
5b90: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
5ba0: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
5bb0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
5bc0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
5bd0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
5be0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
5bf0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
5c00: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
5c10: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
5c20: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
5c30: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
5c40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
5c50: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
5c60: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
5c70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
5c80: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
5c90: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
5ca0: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
5cb0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
5cc0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
5cd0: 76 65 28 29 0a 2a 2a 0a 2a 2a 20 54 6f 20 70 72  ve().**.** To pr
5ce0: 65 76 65 6e 74 20 64 65 61 64 6c 6f 63 6b 2c 20  event deadlock, 
5cf0: 74 68 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42  the global unixB
5d00: 69 67 4c 6f 63 6b 20 6d 75 73 74 20 6d 75 73 74  igLock must must
5d10: 20 62 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20   be acquired.** 
5d20: 62 65 66 6f 72 65 20 74 68 65 20 75 6e 69 78 49  before the unixI
5d30: 6e 6f 64 65 49 6e 66 6f 2e 70 4c 6f 63 6b 4d 75  nodeInfo.pLockMu
5d40: 74 65 78 20 6d 75 74 65 78 2c 20 69 66 20 62 6f  tex mutex, if bo
5d50: 74 68 20 61 72 65 20 68 65 6c 64 2e 20 20 49 74  th are held.  It
5d60: 20 69 73 0a 2a 2a 20 4f 4b 20 74 6f 20 67 65 74   is.** OK to get
5d70: 20 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20   the pLockMutex 
5d80: 77 69 74 68 6f 75 74 20 68 6f 6c 64 69 6e 67 20  without holding 
5d90: 75 6e 69 78 42 69 67 4c 6f 63 6b 20 66 69 72 73  unixBigLock firs
5da0: 74 2c 20 62 75 74 20 69 66 0a 2a 2a 20 74 68 61  t, but if.** tha
5db0: 74 20 68 61 70 70 65 6e 73 2c 20 74 68 65 20 75  t happens, the u
5dc0: 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78  nixBigLock mutex
5dd0: 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 61 63 71   must not be acq
5de0: 75 69 72 65 64 20 75 6e 74 69 6c 20 61 66 74 65  uired until afte
5df0: 72 0a 2a 2a 20 70 4c 6f 63 6b 4d 75 74 65 78 20  r.** pLockMutex 
5e00: 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
5e10: 2a 2a 20 20 20 20 20 20 4f 4b 3a 20 20 20 20 20  **      OK:     
5e20: 65 6e 74 65 72 28 75 6e 69 78 42 69 67 4c 6f 63  enter(unixBigLoc
5e30: 6b 29 2c 20 20 65 6e 74 65 72 28 70 4c 6f 63 6b  k),  enter(pLock
5e40: 49 6e 66 6f 29 0a 2a 2a 20 20 20 20 20 20 4f 4b  Info).**      OK
5e50: 3a 20 20 20 20 20 65 6e 74 65 72 28 75 6e 69 78  :     enter(unix
5e60: 42 69 67 4c 6f 63 6b 29 0a 2a 2a 20 20 20 20 20  BigLock).**     
5e70: 20 4f 4b 3a 20 20 20 20 20 65 6e 74 65 72 28 70   OK:     enter(p
5e80: 4c 6f 63 6b 49 6e 66 6f 29 0a 2a 2a 20 20 20 45  LockInfo).**   E
5e90: 52 52 4f 52 3a 20 20 20 20 20 65 6e 74 65 72 28  RROR:     enter(
5ea0: 70 4c 6f 63 6b 49 6e 66 6f 29 2c 20 65 6e 74 65  pLockInfo), ente
5eb0: 72 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 0a 2a  r(unixBigLock).*
5ec0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
5ed0: 5f 6d 75 74 65 78 20 2a 75 6e 69 78 42 69 67 4c  _mutex *unixBigL
5ee0: 6f 63 6b 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ock = 0;.static 
5ef0: 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75  void unixEnterMu
5f00: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 61 73 73  tex(void){.  ass
5f10: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5f20: 65 78 5f 6e 6f 74 68 65 6c 64 28 75 6e 69 78 42  ex_notheld(unixB
5f30: 69 67 4c 6f 63 6b 29 20 29 3b 20 20 2f 2a 20 4e  igLock) );  /* N
5f40: 6f 74 20 61 20 72 65 63 75 72 73 69 76 65 20 6d  ot a recursive m
5f50: 75 74 65 78 20 2a 2f 0a 20 20 73 71 6c 69 74 65  utex */.  sqlite
5f60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 75 6e  3_mutex_enter(un
5f70: 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 73 74  ixBigLock);.}.st
5f80: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 4c 65  atic void unixLe
5f90: 61 76 65 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  aveMutex(void){.
5fa0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5fb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 75 6e 69  3_mutex_held(uni
5fc0: 78 42 69 67 4c 6f 63 6b 29 20 29 3b 0a 20 20 73  xBigLock) );.  s
5fd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
5fe0: 76 65 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b  ve(unixBigLock);
5ff0: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
6000: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
6010: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
6020: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
6030: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6040: 65 6c 64 28 75 6e 69 78 42 69 67 4c 6f 63 6b 29  eld(unixBigLock)
6050: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
6060: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
6070: 4f 53 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48  OS_TRACE./*.** H
6080: 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  elper function f
6090: 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f 75 74 20  or printing out 
60a0: 74 72 61 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  trace informatio
60b0: 6e 20 66 72 6f 6d 20 64 65 62 75 67 67 69 6e 67  n from debugging
60c0: 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e 20 54 68  .** binaries. Th
60d0: 69 73 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  is returns the s
60e0: 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
60f0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75 70 70  tion of the supp
6100: 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20  lied.** integer 
6110: 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74  lock-type..*/.st
6120: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
6130: 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20  *azFileLock(int 
6140: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77  eFileLock){.  sw
6150: 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20  itch( eFileLock 
6160: 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c  ){.    case NO_L
6170: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e  OCK: return "NON
6180: 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53 48 41  E";.    case SHA
6190: 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  RED_LOCK: return
61a0: 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20 20 63   "SHARED";.    c
61b0: 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  ase RESERVED_LOC
61c0: 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53 45 52  K: return "RESER
61d0: 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 50  VED";.    case P
61e0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74  ENDING_LOCK: ret
61f0: 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20  urn "PENDING";. 
6200: 20 20 20 63 61 73 65 20 45 58 43 4c 55 53 49 56     case EXCLUSIV
6210: 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  E_LOCK: return "
6220: 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a  EXCLUSIVE";.  }.
6230: 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f 52 22    return "ERROR"
6240: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  ;.}.#endif..#ifd
6250: 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54  ef SQLITE_LOCK_T
6260: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  RACE./*.** Print
6270: 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   out information
6280: 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69   about all locki
6290: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a  ng operations..*
62a0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
62b0: 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 72  e is used for tr
62c0: 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f  oubleshooting lo
62d0: 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65  cks on multithre
62e0: 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  aded.** platform
62f0: 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20 63 6f  s.  Enable by co
6300: 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74 68 65  mpiling with the
6310: 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54   -DSQLITE_LOCK_T
6320: 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d  RACE.** command-
6330: 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74  line option on t
6340: 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68  he compiler.  Th
6350: 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61  is code is norma
6360: 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66  lly.** turned of
6370: 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
6380: 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74 20 66   lockTrace(int f
6390: 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72 75 63  d, int op, struc
63a0: 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63  t flock *p){.  c
63b0: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a  har *zOpName, *z
63c0: 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20  Type;.  int s;. 
63d0: 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e 6f 3b   int savedErrno;
63e0: 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54  .  if( op==F_GET
63f0: 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d  LK ){.    zOpNam
6400: 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d  e = "GETLK";.  }
6410: 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53  else if( op==F_S
6420: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
6430: 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20  ame = "SETLK";. 
6440: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20   }else{.    s = 
6450: 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  osFcntl(fd, op, 
6460: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
6470: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
6480: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
6490: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
64a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
64b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
64c0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
64d0: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
64e0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
64f0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
6500: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
6510: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
6520: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
6530: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
6540: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
6550: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
6560: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
6570: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
6580: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
6590: 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e  T );.  s = osFcn
65a0: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
65b0: 20 73 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72   savedErrno = er
65c0: 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  rno;.  sqlite3De
65d0: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
65e0: 20 25 64 20 25 64 20 25 73 20 25 73 20 25 64 20   %d %d %s %s %d 
65f0: 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20  %d %d %d\n",.   
6600: 20 20 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20    threadid, fd, 
6610: 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20  zOpName, zType, 
6620: 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c  (int)p->l_start,
6630: 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a   (int)p->l_len,.
6640: 20 20 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70       (int)p->l_p
6650: 69 64 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d  id, s);.  if( s=
6660: 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53  =(-1) && op==F_S
6670: 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79  ETLK && (p->l_ty
6680: 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70  pe==F_RDLCK || p
6690: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
66a0: 4b 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  K) ){.    struct
66b0: 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c   flock l2;.    l
66c0: 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63  2 = *p;.    osFc
66d0: 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c  ntl(fd, F_GETLK,
66e0: 20 26 6c 32 29 3b 0a 20 20 20 20 69 66 28 20 6c   &l2);.    if( l
66f0: 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43  2.l_type==F_RDLC
6700: 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65  K ){.      zType
6710: 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20   = "RDLCK";.    
6720: 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74  }else if( l2.l_t
6730: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
6740: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57        zType = "W
6750: 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  RLCK";.    }else
6760: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
6770: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
6780: 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22   zType = "UNLCK"
6790: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
67a0: 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a     assert( 0 );.
67b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
67c0: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
67d0: 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72 65 61 73  ntl-failure-reas
67e0: 6f 6e 3a 20 25 73 20 25 64 20 25 64 20 25 64 5c  on: %s %d %d %d\
67f0: 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54 79 70 65  n",.       zType
6800: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72  , (int)l2.l_star
6810: 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e  t, (int)l2.l_len
6820: 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29  , (int)l2.l_pid)
6830: 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20  ;.  }.  errno = 
6840: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65  savedErrno;.  re
6850: 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66  turn s;.}.#undef
6860: 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65   osFcntl.#define
6870: 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61   osFcntl lockTra
6880: 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  ce.#endif /* SQL
6890: 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a  ITE_LOCK_TRACE *
68a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66  /../*.** Retry f
68b0: 74 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 73  truncate() calls
68c0: 20 74 68 61 74 20 66 61 69 6c 20 64 75 65 20 74   that fail due t
68d0: 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c  o EINTR.**.** Al
68e0: 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e  l calls to ftrun
68f0: 63 61 74 65 28 29 20 77 69 74 68 69 6e 20 74 68  cate() within th
6900: 69 73 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  is file should b
6910: 65 20 6d 61 64 65 20 74 68 72 6f 75 67 68 0a 2a  e made through.*
6920: 2a 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 20  * this wrapper. 
6930: 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69 64 20   On the Android 
6940: 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61 73 73  platform, bypass
6950: 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20 62 65  ing the logic be
6960: 6c 6f 77 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61  low.** could lea
6970: 64 20 74 6f 20 61 20 63 6f 72 72 75 70 74 20 64  d to a corrupt d
6980: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
6990: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66 74  ic int robust_ft
69a0: 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c 20 73  runcate(int h, s
69b0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 29  qlite3_int64 sz)
69c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64  {.  int rc;.#ifd
69d0: 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20  ef __ANDROID__. 
69e0: 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20   /* On Android, 
69f0: 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c 77 61  ftruncate() alwa
6a00: 79 73 20 75 73 65 73 20 33 32 2d 62 69 74 20 6f  ys uses 32-bit o
6a10: 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69 66 20  ffsets, even if 
6a20: 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53  .  ** _FILE_OFFS
6a30: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
6a40: 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  fined. This mean
6a50: 73 20 69 74 20 69 73 20 75 6e 73 61 66 65 20 74  s it is unsafe t
6a60: 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a  o attempt to.  *
6a70: 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66 69 6c  * truncate a fil
6a80: 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61  e to any size la
6a90: 72 67 65 72 20 74 68 61 6e 20 32 47 69 42 2e 20  rger than 2GiB. 
6aa0: 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20  Silently ignore 
6ab0: 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20 61 74  any.  ** such at
6ac0: 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66  tempts.  */.  if
6ad0: 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e  ( sz>(sqlite3_in
6ae0: 74 36 34 29 30 78 37 46 46 46 46 46 46 46 20 29  t64)0x7FFFFFFF )
6af0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
6b00: 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  E_OK;.  }else.#e
6b10: 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20  ndif.  do{ rc = 
6b20: 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c 73 7a  osFtruncate(h,sz
6b30: 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
6b40: 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
6b50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
6b60: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
6b70: 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74 65 73  utine translates
6b80: 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f 53 49   a standard POSI
6b90: 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74  X errno code int
6ba0: 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75  o something.** u
6bb0: 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63 6c 69  seful to the cli
6bc0: 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71 6c 69  ents of the sqli
6bd0: 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  te3 functions.  
6be0: 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 69 74  Specifically, it
6bf0: 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20   is.** intended 
6c00: 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61 20 76  to translate a v
6c10: 61 72 69 65 74 79 20 6f 66 20 22 74 72 79 20 61  ariety of "try a
6c20: 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69 6e 74  gain" errors int
6c30: 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a  o SQLITE_BUSY.**
6c40: 20 61 6e 64 20 61 20 76 61 72 69 65 74 79 20 6f   and a variety o
6c50: 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73 65 20  f "please close 
6c60: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
6c70: 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72 73 20  tor NOW" errors 
6c80: 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  into .** SQLITE_
6c90: 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72  IOERR.** .** Err
6ca0: 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69 74 69  ors during initi
6cb0: 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63  alization of loc
6cc0: 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79 73 74  ks, or file syst
6cd0: 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c  em support for l
6ce0: 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20  ocks,.** should 
6cf0: 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45  handle ENOLCK, E
6d00: 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55  NOTSUP, EOPNOTSU
6d10: 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  PP separately..*
6d20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
6d30: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
6d40: 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73 69 78  xError(int posix
6d50: 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74  Error, int sqlit
6d60: 65 49 4f 45 72 72 29 20 7b 0a 20 20 61 73 73 65  eIOErr) {.  asse
6d70: 72 74 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72  rt( (sqliteIOErr
6d80: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6d90: 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  _LOCK) || .     
6da0: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
6db0: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
6dc0: 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20  R_UNLOCK) || .  
6dd0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
6de0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
6df0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
6e00: 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
6e10: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
6e20: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
6e30: 52 56 45 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73  RVEDLOCK) );.  s
6e40: 77 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f  witch (posixErro
6e50: 72 29 20 7b 0a 20 20 63 61 73 65 20 45 41 43 43  r) {.  case EACC
6e60: 45 53 3a 20 0a 20 20 63 61 73 65 20 45 41 47 41  ES: .  case EAGA
6e70: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
6e80: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
6e90: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
6ea0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
6eb0: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
6ec0: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
6ed0: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
6ee0: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
6ef0: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
6f00: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
6f10: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
6f20: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
6f30: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
6f40: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
6f50: 20 20 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a    .  case EPERM:
6f60: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c   .    return SQL
6f70: 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20  ITE_PERM;.    . 
6f80: 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20 72   default: .    r
6f90: 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45 72  eturn sqliteIOEr
6fa0: 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a  r;.  }.}.../****
6fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
7000: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
7010: 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65 20  gin Unique File 
7020: 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20  ID Utility Used 
7030: 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a  By VxWorks *****
7040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
7050: 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e   On most version
7060: 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63 61  s of unix, we ca
7070: 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20 49  n get a unique I
7080: 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79 20  D for a file by 
7090: 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a  concatenating.**
70a0: 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d 62   the device numb
70b0: 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64 65  er and the inode
70c0: 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74 68   number.  But th
70d0: 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  is does not work
70e0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
70f0: 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e  On VxWorks, a un
7100: 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75 73  ique file id mus
7110: 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74 68  t be based on th
7120: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
7130: 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  name..**.** A po
7140: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
7150: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
7160: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
7170: 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 61  can be used as a
7180: 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65 20  .** unique file 
7190: 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20  ID in VxWorks.  
71a0: 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f 66  Each instance of
71b0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
71c0: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f  contains.** a co
71d0: 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69  py of the canoni
71e0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54  cal filename.  T
71f0: 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20 72  here is also a r
7200: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20  eference count. 
7210: 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74 75   .** The structu
7220: 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64 20  re is reclaimed 
7230: 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  when the number 
7240: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 69  of pointers to i
7250: 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65  t drops to.** ze
7260: 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  ro..**.** There 
7270: 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20 6d  are never very m
7280: 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20 61  any files open a
7290: 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c  t one time and l
72a0: 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a  ookups are not.*
72b0: 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d  * a performance-
72c0: 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20 73  critical path, s
72d0: 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69 65  o it is sufficie
72e0: 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65 0a  nt to put these.
72f0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f 6e  ** structures on
7300: 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a   a linked list..
7310: 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72 6b  */.struct vxwork
7320: 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72 75  sFileId {.  stru
7330: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7340: 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78   *pNext;  /* Nex
7350: 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 74  t in a list of t
7360: 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74  hem all */.  int
7370: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
7380: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
7390: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
73a0: 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a  es to this one *
73b0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20  /.  int nName;  
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74    /* Length of t
73e0: 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  he zCanonicalNam
73f0: 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20  e[] string */.  
7400: 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c  char *zCanonical
7410: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  Name;         /*
7420: 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   Canonical filen
7430: 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f  ame */.};..#if O
7440: 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a  S_VXWORKS./* .**
7450: 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c 65   All unique file
7460: 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20 6f  names are held o
7470: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
7480: 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a 2a  headed by this.*
7490: 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73  * variable:.*/.s
74a0: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
74b0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
74c0: 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b  rksFileList = 0;
74d0: 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79  ../*.** Simplify
74e0: 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f   a filename into
74f0: 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66   its canonical f
7500: 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67  orm.** by making
7510: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
7520: 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a  hanges:.**.**  *
7530: 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72   removing any tr
7540: 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c 69  ailing and dupli
7550: 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e  cate /.**  * con
7560: 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75  vert /./ into ju
7570: 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65  st /.**  * conve
7580: 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20  rt /A/../ where 
7590: 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65 20  A is any simple 
75a0: 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f  name into just /
75b0: 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61  .**.** Changes a
75c0: 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65  re made in-place
75d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
75e0: 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a  w name length..*
75f0: 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61  *.** The origina
7600: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e  l filename is in
7610: 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74   z[0..n-1].  Ret
7620: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7630: 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  f.** characters 
7640: 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69 65  in the simplifie
7650: 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  d name..*/.stati
7660: 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d  c int vxworksSim
7670: 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20 2a  plifyName(char *
7680: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
7690: 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20   i, j;.  while( 
76a0: 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>1 && z[n-1]=='
76b0: 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66  /' ){ n--; }.  f
76c0: 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69  or(i=j=0; i<n; i
76d0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
76e0: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
76f0: 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20  if( z[i+1]=='/' 
7700: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
7710: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
7720: 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b  ' && i+2<n && z[
7730: 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i+2]=='/' ){.   
7740: 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20       i += 1;.   
7750: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7760: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7770: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
7780: 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+3<n && z[i+2]=
7790: 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d  ='.' && z[i+3]==
77a0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '/' ){.        w
77b0: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a  hile( j>0 && z[j
77c0: 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b  -1]!='/' ){ j--;
77d0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
77e0: 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  >0 ){ j--; }.   
77f0: 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20       i += 2;.   
7800: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
7810: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7820: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
7830: 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a    }.  z[j] = 0;.
7840: 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f    return j;.}../
7850: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69 71  *.** Find a uniq
7860: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 74  ue file ID for t
7870: 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75 74  he given absolut
7880: 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  e pathname.  Ret
7890: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
78a0: 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73 46   to the vxworksF
78b0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 54  ileId object.  T
78c0: 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20 74  his pointer is t
78d0: 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c  he unique.** fil
78e0: 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e ID..**.** The 
78f0: 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74 68  nRef field of th
7900: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
7910: 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65 6d  object is increm
7920: 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  ented before.** 
7930: 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72 65  the object is re
7940: 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20 76  turned.  A new v
7950: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
7960: 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a 2a  ect is created.*
7970: 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20 74  * and added to t
7980: 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69  he global list i
7990: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  f necessary..**.
79a0: 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  ** If a memory a
79b0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20  llocation error 
79c0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 4e  occurs, return N
79d0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ULL..*/.static s
79e0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
79f0: 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64  eId *vxworksFind
7a00: 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68 61  FileId(const cha
7a10: 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  r *zAbsoluteName
7a20: 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  ){.  struct vxwo
7a30: 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b  rksFileId *pNew;
7a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61 72           /* sear
7a50: 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20 66  ch key and new f
7a60: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72 75  ile ID */.  stru
7a70: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
7a80: 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20 20   *pCandidate;   
7a90: 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
7aa0: 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69 6c  ver existing fil
7ab0: 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  e IDs */.  int n
7ac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
7ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ae0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62 73  * Length of zAbs
7af0: 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e 67  oluteName string
7b00: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 7a   */..  assert( z
7b10: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d  AbsoluteName[0]=
7b20: 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69  ='/' );.  n = (i
7b30: 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c  nt)strlen(zAbsol
7b40: 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77  uteName);.  pNew
7b50: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
7b60: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
7b70: 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20  w) + (n+1) );.  
7b80: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
7b90: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
7ba0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d  zCanonicalName =
7bb0: 20 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d   (char*)&pNew[1]
7bc0: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d  ;.  memcpy(pNew-
7bd0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
7be0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20   zAbsoluteName, 
7bf0: 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f  n+1);.  n = vxwo
7c00: 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28  rksSimplifyName(
7c10: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
7c20: 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20  Name, n);..  /* 
7c30: 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78  Search for an ex
7c40: 69 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61  isting entry tha
7c50: 74 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63  t matching the c
7c60: 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20  anonical name.. 
7c70: 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e   ** If found, in
7c80: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
7c90: 72 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20  rence count and 
7ca0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
7cb0: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69   to.  ** the exi
7cc0: 73 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20  sting file ID.. 
7cd0: 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
7ce0: 75 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43  utex();.  for(pC
7cf0: 61 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73  andidate=vxworks
7d00: 46 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69  FileList; pCandi
7d10: 64 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65  date; pCandidate
7d20: 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65  =pCandidate->pNe
7d30: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61  xt){.    if( pCa
7d40: 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d  ndidate->nName==
7d50: 6e 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d  n .     && memcm
7d60: 70 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43  p(pCandidate->zC
7d70: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e  anonicalName, pN
7d80: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
7d90: 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b  me, n)==0.    ){
7da0: 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  .       sqlite3_
7db0: 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
7dc0: 20 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e     pCandidate->n
7dd0: 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e  Ref++;.       un
7de0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
7df0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43         return pC
7e00: 61 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a  andidate;.    }.
7e10: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74    }..  /* No mat
7e20: 63 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57  ch was found.  W
7e30: 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65  e will make a ne
7e40: 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70  w file ID */.  p
7e50: 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
7e60: 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e   pNew->nName = n
7e70: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20  ;.  pNew->pNext 
7e80: 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  = vxworksFileLis
7e90: 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65  t;.  vxworksFile
7ea0: 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75  List = pNew;.  u
7eb0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
7ec0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
7ed0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
7ee0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
7ef0: 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f   count on a vxwo
7f00: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
7f10: 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f  .  Free.** the o
7f20: 62 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72  bject when the r
7f30: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72  eference count r
7f40: 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a  eaches zero..*/.
7f50: 73 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f  static void vxwo
7f60: 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
7f70: 28 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46  (struct vxworksF
7f80: 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75  ileId *pId){.  u
7f90: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
7fa0: 0a 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e  .  assert( pId->
7fb0: 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d  nRef>0 );.  pId-
7fc0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70  >nRef--;.  if( p
7fd0: 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Id->nRef==0 ){. 
7fe0: 20 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b     struct vxwork
7ff0: 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20  sFileId **pp;.  
8000: 20 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b    for(pp=&vxwork
8010: 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26  sFileList; *pp &
8020: 26 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d  & *pp!=pId; pp =
8030: 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29   &((*pp)->pNext)
8040: 29 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20  ){}.    assert( 
8050: 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20  *pp==pId );.    
8060: 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74  *pp = pId->pNext
8070: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
8080: 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75  ee(pId);.  }.  u
8090: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
80a0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  .}.#endif /* OS_
80b0: 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a  VXWORKS */./****
80c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
80d0: 6f 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49  of Unique File I
80e0: 44 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42  D Utility Used B
80f0: 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a  y VxWorks ******
8100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
8110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a  *********/.../**
8160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
81b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81c0: 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41  ******** Posix A
81d0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20  dvisory Locking 
81e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
81f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
8200: 2a 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  ** POSIX advisor
8210: 79 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b  y locks are brok
8220: 65 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41  en by design.  A
8230: 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28  NSI STD 1003.1 (
8240: 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e  1996).** section
8250: 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34   6.5.2.2 lines 4
8260: 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73  83 through 490 s
8270: 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e  pecify that when
8280: 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65   a process.** se
8290: 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c  ts or clears a l
82a0: 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74  ock, that operat
82b0: 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e  ion overrides an
82c0: 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65  y prior locks se
82d0: 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65  t.** by the same
82e0: 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f   process.  It do
82f0: 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c  es not explicitl
8300: 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68  y say so, but th
8310: 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68  is implies.** th
8320: 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20  at it overrides 
8330: 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65  locks set by the
8340: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73   same process us
8350: 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a  ing a different.
8360: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
8370: 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68  or.  Consider th
8380: 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a  is test case:.**
8390: 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64  .**       int fd
83a0: 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65  1 = open("./file
83b0: 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45  1", O_RDWR|O_CRE
83c0: 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20  AT, 0644);.**   
83d0: 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70      int fd2 = op
83e0: 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f  en("./file2", O_
83f0: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
8400: 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f  44);.**.** Suppo
8410: 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e  se ./file1 and .
8420: 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c  /file2 are reall
8430: 79 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  y the same file 
8440: 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20  (because.** one 
8450: 69 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d  is a hard or sym
8460: 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68  bolic link to th
8470: 65 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66  e other) then if
8480: 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65   you set.** an e
8490: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
84a0: 20 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74   fd1, then try t
84b0: 6f 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69  o get an exclusi
84c0: 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64  ve lock.** on fd
84d0: 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20  2, it works.  I 
84e0: 77 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63  would have expec
84f0: 74 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c  ted the second l
8500: 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73  ock to.** fail s
8510: 69 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61  ince there was a
8520: 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e  lready a lock on
8530: 20 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f   the file due to
8540: 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74   fd1..** But not
8550: 20 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68   so.  Since both
8560: 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d   locks came from
8570: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
8580: 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  s, the.** second
8590: 20 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66   overrides the f
85a0: 69 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67  irst, even thoug
85b0: 68 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64  h they were on d
85c0: 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65  ifferent.** file
85d0: 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65   descriptors ope
85e0: 6e 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ned on different
85f0: 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a   file names..**.
8600: 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  ** This means th
8610: 61 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65  at we cannot use
8620: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20   POSIX locks to 
8630: 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65  synchronize file
8640: 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67   access.** among
8650: 20 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61   competing threa
8660: 64 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70  ds of the same p
8670: 72 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c  rocess.  POSIX l
8680: 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66  ocks will work f
8690: 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72  ine.** to synchr
86a0: 6f 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72  onize access for
86b0: 20 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61   threads in sepa
86c0: 72 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20  rate processes, 
86d0: 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61  but not.** threa
86e0: 64 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61  ds within the sa
86f0: 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  me process..**.*
8700: 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  * To work around
8710: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51   the problem, SQ
8720: 4c 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61  Lite has to mana
8730: 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e  ge file locks in
8740: 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69  ternally.** on i
8750: 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65  ts own.  Wheneve
8760: 72 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  r a new database
8770: 20 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68   is opened, we h
8780: 61 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a  ave to find the.
8790: 2a 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64  ** specific inod
87a0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
87b0: 65 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64  e file (the inod
87c0: 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
87d0: 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76  by the.** st_dev
87e0: 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c   and st_ino fiel
87f0: 64 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73  ds of the stat s
8800: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73  tructure that fs
8810: 74 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a  tat() fills in).
8820: 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72  ** and check for
8830: 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65   locks already e
8840: 78 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20  xisting on that 
8850: 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63  inode.  When loc
8860: 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65  ks are.** create
8870: 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65  d or removed, we
8880: 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74   have to look at
8890: 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61   our own interna
88a0: 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a  l record of the.
88b0: 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20  ** locks to see 
88c0: 69 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  if another threa
88d0: 64 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79  d has previously
88e0: 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74   set a lock on t
88f0: 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64  hat same.** inod
8900: 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a  e..**.** (Aside:
8910: 20 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64   The use of inod
8920: 65 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69  e numbers as uni
8930: 71 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74  que IDs does not
8940: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
8950: 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73  ..** For VxWorks
8960: 2c 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65  , we have to use
8970: 20 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65   the alternative
8980: 20 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65   unique ID syste
8990: 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61  m based on.** ca
89a0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
89b0: 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64   and implemented
89c0: 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
89d0: 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a   division.).**.*
89e0: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69  * The sqlite3_fi
89f0: 6c 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  le structure for
8a00: 20 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e   POSIX is no lon
8a10: 67 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65  ger just an inte
8a20: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
8a30: 72 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e  riptor.  It is n
8a40: 6f 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74  ow a structure t
8a50: 68 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e  hat holds the in
8a60: 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65  teger file.** de
8a70: 73 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70  scriptor and a p
8a80: 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75  ointer to a stru
8a90: 63 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72  cture that descr
8aa0: 69 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61  ibes the interna
8ab0: 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  l.** locks on th
8ac0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
8ad0: 69 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73  inode.  There is
8ae0: 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72   one locking str
8af0: 75 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e  ucture.** per in
8b00: 6f 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73  ode, so if the s
8b10: 61 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65  ame inode is ope
8b20: 6e 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20  ned twice, both 
8b30: 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
8b40: 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20  res.** point to 
8b50: 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67  the same locking
8b60: 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65   structure.  The
8b70: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8b80: 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65  re keeps.** a re
8b90: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73  ference count (s
8ba0: 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77  o we will know w
8bb0: 68 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74  hen to delete it
8bc0: 29 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a  ) and a "cnt".**
8bd0: 20 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c   field that tell
8be0: 73 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61  s us its interna
8bf0: 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20  l lock status.  
8c00: 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65  cnt==0 means the
8c10: 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  .** file is unlo
8c20: 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d  cked.  cnt==-1 m
8c30: 65 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61  eans the file ha
8c40: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
8c50: 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65  ock..** cnt>0 me
8c60: 61 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e  ans there are cn
8c70: 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f  t shared locks o
8c80: 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
8c90: 2a 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f  * Any attempt to
8ca0: 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20   lock or unlock 
8cb0: 61 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65  a file first che
8cc0: 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a  cks the locking.
8cd0: 2a 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54  ** structure.  T
8ce0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
8cf0: 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69  m call is only i
8d00: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20  nvoked to set a 
8d10: 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69  .** POSIX lock i
8d20: 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c  f the internal l
8d30: 6f 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72  ock structure tr
8d40: 61 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65  ansitions betwee
8d50: 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e  n.** a locked an
8d60: 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74  d an unlocked st
8d70: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77  ate..**.** But w
8d80: 61 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20  ait:  there are 
8d90: 79 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d  yet more problem
8da0: 73 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76  s with POSIX adv
8db0: 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  isory locks..**.
8dc0: 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20  ** If you close 
8dd0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
8de0: 72 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f  r that points to
8df0: 20 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73   a file that has
8e00: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c   locks,.** all l
8e10: 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c  ocks on that fil
8e20: 65 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64  e that are owned
8e30: 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
8e40: 70 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72  process are.** r
8e50: 65 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72  eleased.  To wor
8e60: 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  k around this pr
8e70: 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78  oblem, each unix
8e80: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
8e90: 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20  .** maintains a 
8ea0: 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d  count of the num
8eb0: 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c  ber of pending l
8ec0: 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64  ocks on tha inod
8ed0: 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74  e..** When an at
8ee0: 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
8ef0: 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69   close an unixFi
8f00: 6c 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  le, if there are
8f10: 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69  .** other unixFi
8f20: 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  le open on the s
8f30: 61 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61  ame inode that a
8f40: 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73  re holding locks
8f50: 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f  , the call.** to
8f60: 20 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c   close() the fil
8f70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
8f80: 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61  deferred until a
8f90: 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20  ll of the locks 
8fa0: 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e  clear..** The un
8fb0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
8fc0: 63 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69  cture keeps a li
8fd0: 73 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72  st of file descr
8fe0: 69 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64  iptors that need
8ff0: 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64   to.** be closed
9000: 20 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69   and that list i
9010: 73 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c  s walked (and cl
9020: 65 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20  eared) when the 
9030: 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65  last lock.** cle
9040: 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61  ars..**.** Yet a
9050: 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20  nother problem: 
9060: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f   LinuxThreads do
9070: 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77   not play well w
9080: 69 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e  ith posix locks.
9090: 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65  .**.** Many olde
90a0: 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69  r versions of li
90b0: 6e 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75  nux use the Linu
90c0: 78 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79  xThreads library
90d0: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74   which is.** not
90e0: 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74   posix compliant
90f0: 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68  .  Under LinuxTh
9100: 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72  reads, a lock cr
9110: 65 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a  eated by thread.
9120: 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d  ** A cannot be m
9130: 6f 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72  odified or overr
9140: 69 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65  idden by a diffe
9150: 72 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a  rent thread B..*
9160: 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20  * Only thread A 
9170: 63 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c  can modify the l
9180: 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65  ock.  Locking be
9190: 68 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63  havior is correc
91a0: 74 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c  t.** if the appl
91b0: 69 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  iation uses the 
91c0: 6e 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73  newer Native Pos
91d0: 69 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72  ix Thread Librar
91e0: 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c  y (NPTL).** on l
91f0: 69 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c  inux - with NPTL
9200: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
9210: 62 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  by thread A can 
9220: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a  override locks.*
9230: 2a 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20  * in thread B.  
9240: 42 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  But there is no 
9250: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63  way to know at c
9260: 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63  ompile-time whic
9270: 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c  h.** threading l
9280: 69 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20  ibrary is being 
9290: 75 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20  used.  So there 
92a0: 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f  is no way to kno
92b0: 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d  w at.** compile-
92c0: 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20  time whether or 
92d0: 6e 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e  not thread A can
92e0: 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20   override locks 
92f0: 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20  on thread B..** 
9300: 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20  One has to do a 
9310: 72 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74  run-time check t
9320: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62  o discover the b
9330: 65 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a  ehavior of the.*
9340: 2a 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  * current proces
9350: 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
9360: 75 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20  used to support 
9370: 4c 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42  LinuxThreads.  B
9380: 75 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c  ut support for L
9390: 69 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77  inuxThreads.** w
93a0: 61 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e  as dropped begin
93b0: 6e 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f  ning with versio
93c0: 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65  n 3.7.0.  SQLite
93d0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b   will still work
93e0: 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68   with.** LinuxTh
93f0: 72 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74  reads provided t
9400: 68 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73  hat (1) there is
9410: 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
9420: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  e connection .**
9430: 20 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69   per database fi
9440: 6c 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  le in the same p
9450: 72 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64  rocess and (2) d
9460: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
9470: 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f  ons.** do not mo
9480: 76 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ve across thread
9490: 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  s..*/../*.** An 
94a0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
94b0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
94c0: 75 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68  ure serves as th
94d0: 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f  e key used.** to
94e0: 20 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63   locate a partic
94f0: 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ular unixInodeIn
9500: 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74  fo object..*/.st
9510: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9520: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
9530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9540: 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72  /* Device number
9550: 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   */.#if OS_VXWOR
9560: 4b 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f  KS.  struct vxwo
9570: 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20  rksFileId *pId; 
9580: 20 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20   /* Unique file 
9590: 49 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20  ID for vxworks. 
95a0: 2a 2f 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65  */.#else.  /* We
95b0: 20 61 72 65 20 74 6f 6c 64 20 74 68 61 74 20 73   are told that s
95c0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
95d0: 41 6e 64 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20  Android contain 
95e0: 61 20 62 75 67 20 74 68 61 74 0a 20 20 2a 2a 20  a bug that.  ** 
95f0: 73 69 7a 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f  sizes ino_t at o
9600: 6e 6c 79 20 33 32 2d 62 69 74 73 20 69 6e 73 74  nly 32-bits inst
9610: 65 61 64 20 6f 66 20 36 34 2d 62 69 74 73 2e 20  ead of 64-bits. 
9620: 28 53 65 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a  (See.  ** https:
9630: 2f 2f 61 6e 64 72 6f 69 64 2d 72 65 76 69 65 77  //android-review
9640: 2e 67 6f 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f  .googlesource.co
9650: 6d 2f 23 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64  m/#/c/115351/3/d
9660: 69 73 74 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20  ist/sqlite3.c). 
9670: 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75   ** To work arou
9680: 6e 64 20 74 68 69 73 2c 20 61 6c 77 61 79 73 20  nd this, always 
9690: 61 6c 6c 6f 63 61 74 65 20 36 34 2d 62 69 74 73  allocate 64-bits
96a0: 20 66 6f 72 20 74 68 65 20 69 6e 6f 64 65 20 6e   for the inode n
96b0: 75 6d 62 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e  umber.  .  ** On
96c0: 20 73 6d 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20   small machines 
96d0: 74 68 61 74 20 6f 6e 6c 79 20 68 61 76 65 20 33  that only have 3
96e0: 32 2d 62 69 74 20 69 6e 6f 64 65 73 2c 20 74 68  2-bit inodes, th
96f0: 69 73 20 77 61 73 74 65 73 20 34 20 62 79 74 65  is wastes 4 byte
9700: 73 2c 0a 20 20 2a 2a 20 62 75 74 20 74 68 61 74  s,.  ** but that
9710: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61   should not be a
9720: 20 62 69 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20   big deal. */.  
9730: 2f 2a 20 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69  /* WAS:  ino_t i
9740: 6e 6f 3b 20 20 20 2a 2f 0a 20 20 75 36 34 20 69  no;   */.  u64 i
9750: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
9760: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
9770: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
9780: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
9790: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
97a0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
97b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
97c0: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
97d0: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
97e0: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
97f0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
9800: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
9810: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
9820: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
9830: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
9840: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
9850: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
9860: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
9870: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
9880: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
9890: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
98a0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
98b0: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
98c0: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
98d0: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
98e0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
98f0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
9900: 67 20 74 6f 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4d  g to it..**.** M
9910: 75 74 65 78 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a  utex rules:.**.*
9920: 2a 20 20 28 31 29 20 4f 6e 6c 79 20 74 68 65 20  *  (1) Only the 
9930: 70 4c 6f 63 6b 4d 75 74 65 78 20 6d 75 74 65 78  pLockMutex mutex
9940: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 69 6e   must be held in
9950: 20 6f 72 64 65 72 20 74 6f 20 72 65 61 64 20 6f   order to read o
9960: 72 20 77 72 69 74 65 0a 2a 2a 20 20 20 20 20 20  r write.**      
9970: 61 6e 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69  any of the locki
9980: 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 20 20 20  ng fields:.**   
9990: 20 20 20 20 20 20 20 6e 53 68 61 72 65 64 2c 20         nShared, 
99a0: 6e 4c 6f 63 6b 2c 20 65 46 69 6c 65 4c 6f 63 6b  nLock, eFileLock
99b0: 2c 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 2c 20  , bProcessLock, 
99c0: 70 55 6e 75 73 65 64 0a 2a 2a 0a 2a 2a 20 20 28  pUnused.**.**  (
99d0: 32 29 20 57 68 65 6e 20 6e 52 65 66 3e 30 2c 20  2) When nRef>0, 
99e0: 74 68 65 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  then the followi
99f0: 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 75 6e  ng fields are un
9a00: 63 68 61 6e 67 69 6e 67 20 61 6e 64 20 63 61 6e  changing and can
9a10: 0a 2a 2a 20 20 20 20 20 20 62 65 20 72 65 61 64  .**      be read
9a20: 20 28 62 75 74 20 6e 6f 74 20 77 72 69 74 74 65   (but not writte
9a30: 6e 29 20 77 69 74 68 6f 75 74 20 68 6f 6c 64 69  n) without holdi
9a40: 6e 67 20 61 6e 79 20 6d 75 74 65 78 3a 0a 2a 2a  ng any mutex:.**
9a50: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 49 64            fileId
9a60: 2c 20 70 4c 6f 63 6b 4d 75 74 65 78 0a 2a 2a 0a  , pLockMutex.**.
9a70: 2a 2a 20 20 28 33 29 20 57 69 74 68 20 74 68 65  **  (3) With the
9a80: 20 65 78 63 65 70 74 69 6f 6e 73 20 61 62 6f 76   exceptions abov
9a90: 65 2c 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64  e, all the field
9aa0: 73 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 72 65  s may only be re
9ab0: 61 64 0a 2a 2a 20 20 20 20 20 20 6f 72 20 77 72  ad.**      or wr
9ac0: 69 74 74 65 6e 20 77 68 69 6c 65 20 68 6f 6c 64  itten while hold
9ad0: 69 6e 67 20 74 68 65 20 67 6c 6f 62 61 6c 20 75  ing the global u
9ae0: 6e 69 78 42 69 67 4c 6f 63 6b 20 6d 75 74 65 78  nixBigLock mutex
9af0: 2e 0a 2a 2a 0a 2a 2a 20 44 65 61 64 6c 6f 63 6b  ..**.** Deadlock
9b00: 20 70 72 65 76 65 6e 74 69 6f 6e 3a 20 20 54 68   prevention:  Th
9b10: 65 20 67 6c 6f 62 61 6c 20 75 6e 69 78 42 69 67  e global unixBig
9b20: 4c 6f 63 6b 20 6d 75 74 65 78 20 6d 61 79 20 6e  Lock mutex may n
9b30: 6f 74 0a 2a 2a 20 62 65 20 61 63 71 75 69 72 65  ot.** be acquire
9b40: 64 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  d while holding 
9b50: 74 68 65 20 70 4c 6f 63 6b 4d 75 74 65 78 20 6d  the pLockMutex m
9b60: 75 74 65 78 2e 20 20 49 66 20 62 6f 74 68 20 75  utex.  If both u
9b70: 6e 69 78 42 69 67 4c 6f 63 6b 0a 2a 2a 20 61 6e  nixBigLock.** an
9b80: 64 20 70 4c 6f 63 6b 4d 75 74 65 78 20 61 72 65  d pLockMutex are
9b90: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 75 6e   needed, then un
9ba0: 69 78 42 69 67 4c 6f 63 6b 20 6d 75 73 74 20 62  ixBigLock must b
9bb0: 65 20 61 63 71 75 69 72 65 64 20 66 69 72 73 74  e acquired first
9bc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
9bd0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
9be0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
9bf0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
9c00: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
9c10: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
9c20: 65 78 20 2a 70 4c 6f 63 6b 4d 75 74 65 78 3b 20  ex *pLockMutex; 
9c30: 20 20 20 20 20 2f 2a 20 48 6f 6c 64 20 74 68 69       /* Hold thi
9c40: 73 20 6d 75 74 65 78 20 66 6f 72 2e 2e 2e 20 2a  s mutex for... *
9c50: 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b  /.  int nShared;
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c70: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9c80: 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  of SHARED locks 
9c90: 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  held */.  int nL
9ca0: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
9cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
9cc0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
9cd0: 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20  ding file locks 
9ce0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
9cf0: 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20  ar eFileLock;   
9d00: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
9d10: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
9d20: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e  SERVED_LOCK etc.
9d30: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
9d40: 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b  har bProcessLock
9d50: 3b 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ;       /* An ex
9d60: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
9d70: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
9d80: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
9d90: 70 55 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20  pUnused;        
9da0: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 66 69      /* Unused fi
9db0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
9dc0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
9dd0: 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9df0: 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  Number of pointe
9e00: 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75 63  rs to this struc
9e10: 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68  ture */.  unixSh
9e20: 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
9e30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
9e40: 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red memory assoc
9e50: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
9e60: 69 6e 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49  inode */.  unixI
9e70: 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b  nodeInfo *pNext;
9e80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
9e90: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
9ea0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
9eb0: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9ec0: 66 6f 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20  fo *pPrev;      
9ed0: 20 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20       /*    .... 
9ee0: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
9ef0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
9f00: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
9f10: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
9f20: 20 6c 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65   long sharedByte
9f30: 3b 20 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69  ;  /* for AFP si
9f40: 6d 75 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c  mulated shared l
9f50: 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69  ock */.#endif.#i
9f60: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
9f70: 65 6d 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20  em_t *pSem;     
9f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9f90: 2a 20 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65  * Named POSIX se
9fa0: 6d 61 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61  maphore */.  cha
9fb0: 72 20 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50  r aSemName[MAX_P
9fc0: 41 54 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20  ATHNAME+2];  /* 
9fd0: 4e 61 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d  Name of that sem
9fe0: 61 70 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66  aphore */.#endif
9ff0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  .};../*.** A lis
a000: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  ts of all unixIn
a010: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e  odeInfo objects.
a020: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49  .*/.static unixI
a030: 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c  nodeInfo *inodeL
a040: 69 73 74 20 3d 20 30 3b 20 20 2f 2a 20 41 6c 6c  ist = 0;  /* All
a050: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a060: 62 6a 65 63 74 73 20 2a 2f 0a 0a 23 69 66 64 65  bjects */..#ifde
a070: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
a080: 2a 0a 2a 2a 20 54 72 75 65 20 69 66 20 74 68 65  *.** True if the
a090: 20 69 6e 6f 64 65 20 6d 75 74 65 78 20 69 73 20   inode mutex is 
a0a0: 68 65 6c 64 2c 20 6f 72 20 6e 6f 74 2e 20 20 55  held, or not.  U
a0b0: 73 65 64 20 6f 6e 6c 79 20 77 69 74 68 69 6e 20  sed only within 
a0c0: 61 73 73 65 72 74 28 29 0a 2a 2a 20 74 6f 20 68  assert().** to h
a0d0: 65 6c 70 20 76 65 72 69 66 79 20 63 6f 72 72 65  elp verify corre
a0e0: 63 74 20 6d 75 74 65 78 20 75 73 61 67 65 2e 0a  ct mutex usage..
a0f0: 2a 2f 0a 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d  */.int unixFileM
a100: 75 74 65 78 48 65 6c 64 28 75 6e 69 78 46 69 6c  utexHeld(unixFil
a110: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
a120: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
a130: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  de );.  return s
a140: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
a150: 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  d(pFile->pInode-
a160: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 7d 0a  >pLockMutex);.}.
a170: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  int unixFileMute
a180: 78 4e 6f 74 68 65 6c 64 28 75 6e 69 78 46 69 6c  xNotheld(unixFil
a190: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 61 73 73  e *pFile){.  ass
a1a0: 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
a1b0: 64 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  de );.  return s
a1c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f 74  qlite3_mutex_not
a1d0: 68 65 6c 64 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  held(pFile->pIno
a1e0: 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b  de->pLockMutex);
a1f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
a200: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
a210: 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  n - unixLogError
a220: 41 74 4c 69 6e 65 28 29 2c 20 69 73 20 6f 6e 6c  AtLine(), is onl
a230: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69  y ever called vi
a240: 61 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75  a the macro.** u
a250: 6e 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a  nixLogError()..*
a260: 2a 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b  *.** It is invok
a270: 65 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f  ed after an erro
a280: 72 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f  r occurs in an O
a290: 53 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65  S function and e
a2a0: 72 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a  rrno has been.**
a2b0: 20 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20   set. It logs a 
a2c0: 6d 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71  message using sq
a2d0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74  lite3_log() cont
a2e0: 61 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65  aining the curre
a2f0: 6e 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65  nt value of.** e
a300: 72 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73  rrno and, if pos
a310: 73 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e  sible, the human
a320: 2d 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61  -readable equiva
a330: 6c 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72  lent from strerr
a340: 6f 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72  or() or.** strer
a350: 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  ror_r()..**.** T
a360: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
a370: 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20  t passed to the 
a380: 6d 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20  macro should be 
a390: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74  the error code t
a3a0: 68 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72  hat.** will be r
a3b0: 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
a3c0: 65 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49  e (e.g. SQLITE_I
a3d0: 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c  OERR_DELETE, SQL
a3e0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a  ITE_CANTOPEN). .
a3f0: 2a 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65  ** The two subse
a400: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
a410: 73 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61  should be the na
a420: 6d 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e  me of the OS fun
a430: 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61  ction that.** fa
a440: 69 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69  iled (e.g. "unli
a450: 6e 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64  nk", "open") and
a460: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
a470: 66 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68  file-system path
a480: 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a  ,.** if any..*/.
a490: 23 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45  #define unixLogE
a4a0: 72 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20  rror(a,b,c)     
a4b0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
a4c0: 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f  ne(a,b,c,__LINE_
a4d0: 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
a4e0: 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65  ixLogErrorAtLine
a4f0: 28 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c  (.  int errcode,
a500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a510: 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72      /* SQLite er
a520: 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f  ror code */.  co
a530: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c  nst char *zFunc,
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a550: 20 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63   Name of OS func
a560: 74 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64  tion that failed
a570: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
a580: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
a590: 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61        /* File pa
a5a0: 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  th associated wi
a5b0: 74 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e  th error */.  in
a5c0: 74 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20  t iLine         
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a5e0: 20 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d   Source line num
a5f0: 62 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20  ber where error 
a600: 6f 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20  occurred */.){. 
a610: 20 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20   char *zErr;    
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a630: 20 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d   /* Message from
a640: 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65   strerror() or e
a650: 71 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69  quivalent */.  i
a660: 6e 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt iErrno = errn
a670: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  o;             /
a680: 2a 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20  * Saved syscall 
a690: 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a  error number */.
a6a0: 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
a6b0: 20 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66   not a threadsaf
a6c0: 65 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f  e build (SQLITE_
a6d0: 54 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20  THREADSAFE==0), 
a6e0: 74 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68  then use.  ** th
a6f0: 65 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e  e strerror() fun
a700: 63 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20  ction to obtain 
a710: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
a720: 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  le error message
a730: 0a 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74  .  ** equivalent
a740: 20 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72   to errno. Other
a750: 77 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72  wise, use strerr
a760: 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69  or_r()..  */ .#i
a770: 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53  f SQLITE_THREADS
a780: 41 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48  AFE && defined(H
a790: 41 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a  AVE_STRERROR_R).
a7a0: 20 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b    char aErr[80];
a7b0: 0a 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20  .  memset(aErr, 
a7c0: 30 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29  0, sizeof(aErr))
a7d0: 3b 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b  ;.  zErr = aErr;
a7e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52  ..  /* If STRERR
a7f0: 4f 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74  OR_R_CHAR_P (set
a800: 20 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72   by autoconf scr
a810: 69 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47  ipts) or __USE_G
a820: 4e 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20  NU is defined,. 
a830: 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
a840: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
a850: 64 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73  des the GNU vers
a860: 69 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f  ion of strerror_
a870: 72 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65  r() that.  ** re
a880: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  turns a pointer 
a890: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
a8a0: 61 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72  aining the error
a8b0: 20 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70   message. That p
a8c0: 6f 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79  ointer .  ** may
a8d0: 20 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d   point to aErr[]
a8e0: 2c 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e  , or it may poin
a8f0: 74 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63  t to some static
a900: 20 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65   storage somewhe
a910: 72 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77  re. .  ** Otherw
a920: 69 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74  ise, assume that
a930: 20 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76   the system prov
a940: 69 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76  ides the POSIX v
a950: 65 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20  ersion of .  ** 
a960: 73 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68  strerror_r(), wh
a970: 69 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65  ich always write
a980: 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  s an error messa
a990: 67 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a  ge into aErr[]..
a9a0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65    **.  ** If the
a9b0: 20 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c   code incorrectl
a9c0: 79 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  y assumes that i
a9d0: 74 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76  t is the POSIX v
a9e0: 65 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20  ersion that is. 
a9f0: 20 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74   ** available, t
aa00: 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
aa10: 20 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61   will often be a
aa20: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20  n empty string. 
aa30: 4e 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20  Not a.  ** huge 
aa40: 70 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65  problem. Incorre
aa50: 63 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20  ctly concluding 
aa60: 74 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72  that the GNU ver
aa70: 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c  sion is availabl
aa80: 65 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65  e .  ** could le
aa90: 61 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74  ad to a segfault
aaa0: 20 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69   though..  */.#i
aab0: 66 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52  f defined(STRERR
aac0: 4f 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20  OR_R_CHAR_P) || 
aad0: 64 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e  defined(__USE_GN
aae0: 55 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65  U).  zErr = .# e
aaf0: 6e 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f  ndif.  strerror_
ab00: 72 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20  r(iErrno, aErr, 
ab10: 73 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b  sizeof(aErr)-1);
ab20: 0a 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54  ..#elif SQLITE_T
ab30: 48 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54  HREADSAFE.  /* T
ab40: 68 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73  his is a threads
ab50: 61 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73  afe build, but s
ab60: 74 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e  trerror_r() is n
ab70: 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f  ot available. */
ab80: 0a 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65  .  zErr = "";.#e
ab90: 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72  lse.  /* Non-thr
aba0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75  eadsafe build, u
abb0: 73 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a  se strerror(). *
abc0: 2f 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72  /.  zErr = strer
abd0: 72 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e  ror(iErrno);.#en
abe0: 64 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68  dif..  if( zPath
abf0: 3d 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22  ==0 ) zPath = ""
ac00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
ac10: 65 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22  errcode,.      "
ac20: 6f 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25  os_unix.c:%d: (%
ac30: 64 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c  d) %s(%s) - %s",
ac40: 0a 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45  .      iLine, iE
ac50: 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61  rrno, zFunc, zPa
ac60: 74 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20  th, zErr.  );.. 
ac70: 20 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b   return errcode;
ac80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ac90: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
aca0: 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75  r..**.** We assu
acb0: 6d 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20  me that close() 
acc0: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f  almost always wo
acd0: 72 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73  rks, since it is
ace0: 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65   only in a.** ve
acf0: 72 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74  ry sick applicat
ad00: 69 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79  ion or on a very
ad10: 20 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74   sick platform t
ad20: 68 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69  hat it might fai
ad30: 6c 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73  l..** If it does
ad40: 20 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65   fail, simply le
ad50: 61 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ak the file desc
ad60: 72 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c  riptor, but do l
ad70: 6f 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e  og the.** error.
ad80: 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
ad90: 20 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20   it is not safe 
ada0: 74 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29  to retry close()
adb0: 20 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e   after EINTR sin
adc0: 63 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64  ce the.** file d
add0: 65 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20  escriptor might 
ade0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
adf0: 6e 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74  n reused by anot
ae00: 68 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53  her thread..** S
ae10: 6f 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20  o we don't even 
ae20: 74 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66  try to recover f
ae30: 72 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a  rom an EINTR.  J
ae40: 75 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f  ust log the erro
ae50: 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e  r.** and move on
ae60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
ae70: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e   robust_close(un
ae80: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
ae90: 6e 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f  nt h, int lineno
aea0: 29 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65  ){.  if( osClose
aeb0: 28 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c  (h) ){.    unixL
aec0: 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51  ogErrorAtLine(SQ
aed0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
aee0: 2c 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20  , "close",.     
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d    pFile ? pFile-
af10: 3e 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65  >zPath : 0, line
af20: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
af30: 2a 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d  * Set the pFile-
af40: 3e 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20  >lastErrno.  Do 
af50: 74 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75  this in a subrou
af60: 74 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f  tine as that pro
af70: 76 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65  vides.** a conve
af80: 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73  nient place to s
af90: 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e  et a breakpoint.
afa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
afb0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75  storeLastErrno(u
afc0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
afd0: 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46  int error){.  pF
afe0: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
aff0: 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   error;.}../*.**
b000: 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20   Close all file 
b010: 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75  descriptors accu
b020: 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e  muated in the un
b030: 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e  ixInodeInfo->pUn
b040: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73  used list..*/ .s
b050: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
b060: 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46  PendingFds(unixF
b070: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
b080: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
b090: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
b0a0: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
b0b0: 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55  edFd *p;.  UnixU
b0c0: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a  nusedFd *pNext;.
b0d0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 46 69    assert( unixFi
b0e0: 6c 65 4d 75 74 65 78 48 65 6c 64 28 70 46 69 6c  leMutexHeld(pFil
b0f0: 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 49  e) );.  for(p=pI
b100: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
b110: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
b120: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
b130: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
b140: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
b150: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
b160: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
b170: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
b180: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
b190: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
b1a0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
b1b0: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
b1c0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
b1d0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
b1e0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
b1f0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
b200: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
b210: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
b220: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
b230: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
b240: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
b250: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
b260: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
b270: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
b280: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
b290: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
b2a0: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
b2b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
b2c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
b2d0: 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c 64  FileMutexNotheld
b2e0: 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 69 66 28  (pFile) );.  if(
b2f0: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
b300: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
b310: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
b320: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
b330: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b340: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
b350: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
b360: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b370: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
b380: 74 65 78 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  tex);.      clos
b390: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
b3a0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
b3b0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49  3_mutex_leave(pI
b3c0: 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
b3d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
b3e0: 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ode->pPrev ){.  
b3f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
b400: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
b410: 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  xt==pInode );.  
b420: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50        pInode->pP
b430: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e  rev->pNext = pIn
b440: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
b450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b460: 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c 69   assert( inodeLi
b470: 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20  st==pInode );.  
b480: 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20        inodeList 
b490: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
b4a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b4b0: 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74  f( pInode->pNext
b4c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
b4d0: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  rt( pInode->pNex
b4e0: 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65  t->pPrev==pInode
b4f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   );.        pIno
b500: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
b510: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76   = pInode->pPrev
b520: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b530: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
b540: 65 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b  ee(pInode->pLock
b550: 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71  Mutex);.      sq
b560: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64  lite3_free(pInod
b570: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  e);.    }.  }.}.
b580: 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66  ./*.** Given a f
b590: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20  ile descriptor, 
b5a0: 6c 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49  locate the unixI
b5b0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
b5c0: 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65  that.** describe
b5d0: 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63  s that file desc
b5e0: 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20  riptor.  Create 
b5f0: 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63  a new one if nec
b600: 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20  essary.  The.** 
b610: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67  return value mig
b620: 68 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69  ht be uninitiali
b630: 7a 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20  zed if an error 
b640: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
b650: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
b660: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
b670: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
b680: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
b690: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
b6a0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
b6b0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ..**.** Return a
b6c0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
b6d0: 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
b6e0: 74 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64  tic int findInod
b6f0: 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c  eInfo(.  unixFil
b700: 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
b710: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20          /* Unix 
b720: 66 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64  file with file d
b730: 65 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20  esc used in the 
b740: 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  key */.  unixIno
b750: 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65  deInfo **ppInode
b760: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
b770: 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  n the unixInodeI
b780: 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20  nfo object here 
b790: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  */.){.  int rc; 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7b0: 20 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d         /* System
b7c0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64   call return cod
b7d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  e */.  int fd;  
b7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7f0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c        /* The fil
b800: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
b810: 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75   pFile */.  stru
b820: 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69  ct unixFileId fi
b830: 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  leId;      /* Lo
b840: 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65  okup key for the
b850: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
b860: 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
b870: 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20  statbuf;        
b880: 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
b890: 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
b8a0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
b8b0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b  nfo *pInode = 0;
b8c0: 20 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74       /* Candidat
b8d0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
b8e0: 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73  object */..  ass
b8f0: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
b900: 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65  ld() );..  /* Ge
b910: 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f  t low-level info
b920: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68  rmation about th
b930: 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63  e file that we c
b940: 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20  an used to.  ** 
b950: 63 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20  create a unique 
b960: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c  name for the fil
b970: 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70  e..  */.  fd = p
b980: 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20  File->h;.  rc = 
b990: 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61  osFstat(fd, &sta
b9a0: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
b9b0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  =0 ){.    storeL
b9c0: 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
b9d0: 65 72 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69  errno);.#if defi
b9e0: 6e 65 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26  ned(EOVERFLOW) &
b9f0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
ba00: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20  _DISABLE_LFS).  
ba10: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73    if( pFile->las
ba20: 74 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f  tErrno==EOVERFLO
ba30: 57 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  W ) return SQLIT
ba40: 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a  E_NOLFS;.#endif.
ba50: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ba60: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69  E_IOERR;.  }..#i
ba70: 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20  fdef __APPLE__. 
ba80: 20 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61   /* On OS X on a
ba90: 6e 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  n msdos filesyst
baa0: 65 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  em, the inode nu
bab0: 6d 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64  mber is reported
bac0: 0a 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c  .  ** incorrectl
bad0: 79 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20  y for zero-size 
bae0: 66 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b  files.  See tick
baf0: 65 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f  et #3260.  To wo
bb00: 72 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74  rk.  ** around t
bb10: 68 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20  his problem (we 
bb20: 63 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75  consider it a bu
bb30: 67 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53  g in OS X, not S
bb40: 51 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61  QLite).  ** we a
bb50: 6c 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74  lways increase t
bb60: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20  he file size to 
bb70: 31 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73  1 by writing a s
bb80: 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20  ingle byte.  ** 
bb90: 70 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69  prior to accessi
bba0: 6e 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  ng the inode num
bbb0: 62 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79  ber.  The one by
bbc0: 74 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20  te written is.  
bbd0: 2a 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20  ** an ASCII 'S' 
bbe0: 63 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20  character which 
bbf0: 61 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20  also happens to 
bc00: 62 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74  be the first byt
bc10: 65 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65  e.  ** in the he
bc20: 61 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51  ader of every SQ
bc30: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
bc40: 49 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20  In this way, if 
bc50: 74 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20  there.  ** is a 
bc60: 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73  race condition s
bc70: 75 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72  uch that another
bc80: 20 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65   thread has alre
bc90: 61 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20  ady populated.  
bca0: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ** the first pag
bcb0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
bcc0: 65 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20  e, no damage is 
bcd0: 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  done..  */.  if(
bce0: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
bcf0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66  ==0 && (pFile->f
bd00: 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
bd10: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
bd20: 29 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20  )!=0 ){.    do{ 
bd30: 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c  rc = osWrite(fd,
bd40: 20 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65   "S", 1); }while
bd50: 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
bd60: 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66  =EINTR );.    if
bd70: 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20  ( rc!=1 ){.     
bd80: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
bd90: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
bda0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
bdb0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
bdc0: 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
bdd0: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
bde0: 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
bdf0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
be00: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
be10: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  no);.      retur
be20: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
be30: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
be40: 0a 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65  ..  memset(&file
be50: 49 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69  Id, 0, sizeof(fi
be60: 6c 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64  leId));.  fileId
be70: 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73  .dev = statbuf.s
be80: 74 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58  t_dev;.#if OS_VX
be90: 57 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70  WORKS.  fileId.p
bea0: 49 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b  Id = pFile->pId;
beb0: 0a 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e  .#else.  fileId.
bec0: 69 6e 6f 20 3d 20 28 75 36 34 29 73 74 61 74 62  ino = (u64)statb
bed0: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
bee0: 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  f.  pInode = ino
bef0: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
bf00: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
bf10: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
bf20: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
bf30: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
bf40: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
bf50: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
bf60: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
bf70: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
bf80: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
bf90: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
bfa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
bfb0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
bfc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bfd0: 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EM_BKPT;.    }. 
bfe0: 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65     memset(pInode
bff0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e  , 0, sizeof(*pIn
c000: 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70  ode));.    memcp
c010: 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  y(&pInode->fileI
c020: 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65  d, &fileId, size
c030: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20  of(fileId));.   
c040: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
c050: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
c060: 74 65 78 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  tex ){.      pIn
c070: 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 20  ode->pLockMutex 
c080: 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  = sqlite3_mutex_
c090: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
c0a0: 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20  EX_FAST);.      
c0b0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  if( pInode->pLoc
c0c0: 6b 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  kMutex==0 ){.   
c0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
c0e0: 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  e(pInode);.     
c0f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c100: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20  _NOMEM_BKPT;.   
c110: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
c120: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
c130: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
c140: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
c150: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
c160: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
c170: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
c180: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
c190: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
c1a0: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
c1b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
c1c0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
c1d0: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
c1e0: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
c1f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
c200: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
c210: 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72  pFile has been r
c220: 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b  enamed or unlink
c230: 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ed since it was 
c240: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f  first opened..*/
c250: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
c260: 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c  HasMoved(unixFil
c270: 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f  e *pFile){.#if O
c280: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
c290: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
c2a0: 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  !=0 && pFile->pI
c2b0: 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  d!=pFile->pInode
c2c0: 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65  ->fileId.pId;.#e
c2d0: 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61  lse.  struct sta
c2e0: 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20  t buf;.  return 
c2f0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
c300: 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61   &&.      (osSta
c310: 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  t(pFile->zPath, 
c320: 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20  &buf)!=0 .      
c330: 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73     || (u64)buf.s
c340: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
c350: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
c360: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
c370: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78  .** Check a unix
c380: 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64  File that is a d
c390: 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79  atabase.  Verify
c3a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
c3b0: 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20  **.** (1) There 
c3c0: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68  is exactly one h
c3d0: 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ard link on the 
c3e0: 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20  file.** (2) The 
c3f0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
c400: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28  mbolic link.** (
c410: 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20  3) The file has 
c420: 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  not been renamed
c430: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a   or unlinked.**.
c440: 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33  ** Issue sqlite3
c450: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
c460: 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65  ING,...) message
c470: 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  s if anything is
c480: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73   not right..*/.s
c490: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66  tatic void verif
c4a0: 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  yDbFile(unixFile
c4b0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
c4c0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
c4d0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
c4e0: 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  se verifications
c4f0: 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20   occurs for the 
c500: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
c510: 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ly */.  if( pFil
c520: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
c530: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
c540: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d   return;..  rc =
c550: 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
c560: 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20  h, &buf);.  if( 
c570: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rc!=0 ){.    sql
c580: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
c590: 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74  WARNING, "cannot
c5a0: 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25   fstat db file %
c5b0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
c5c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
c5d0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
c5e0: 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nlink==0 ){.    
c5f0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
c600: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
c610: 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65  e unlinked while
c620: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
c630: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
c640: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
c650: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
c660: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
c670: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
c680: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
c690: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
c6a0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
c6b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
c6c0: 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76    if( fileHasMov
c6d0: 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ed(pFile) ){.   
c6e0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
c6f0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
c700: 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65  le renamed while
c710: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
c720: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
c730: 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  eturn;.  }.}.../
c740: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
c750: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
c760: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
c770: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
c780: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
c790: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
c7a0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
c7b0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
c7c0: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
c7d0: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
c7e0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
c7f0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
c800: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
c810: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
c820: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
c830: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
c840: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
c850: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
c860: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
c870: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
c880: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
c890: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c8a0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
c8b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c8c0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
c8d0: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
c8e0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c8f0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
c900: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
c910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c920: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
c930: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
c940: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c950: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
c960: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
c970: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74  _LOCK );.  sqlit
c980: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
c990: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 4c  File->pInode->pL
c9a0: 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  ockMutex);..  /*
c9b0: 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
c9c0: 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
c9d0: 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
c9e0: 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
c9f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
ca00: 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
ca10: 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
ca20: 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = 1;.  }..  /
ca30: 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
ca40: 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
ca50: 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a  ocess holds it..
ca60: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44    */.#ifndef __D
ca70: 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65  JGPP__.  if( !re
ca80: 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65  served && !pFile
ca90: 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
caa0: 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74  ssLock ){.    st
cab0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
cac0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  .    lock.l_when
cad0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
cae0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
caf0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
cb00: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
cb10: 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  = 1;.    lock.l_
cb20: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
cb30: 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28      if( osFcntl(
cb40: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c  pFile->h, F_GETL
cb50: 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  K, &lock) ){.   
cb60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
cb70: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
cb80: 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  EDLOCK;.      st
cb90: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
cba0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
cbb0: 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e  } else if( lock.
cbc0: 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20  l_type!=F_UNLCK 
cbd0: 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  ){.      reserve
cbe0: 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
cbf0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 71 6c  .#endif.  .  sql
cc00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
cc10: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
cc20: 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f  pLockMutex);.  O
cc30: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
cc40: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
cc50: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
cc60: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
cc70: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
cc80: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
cc90: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cca0: 2a 20 53 65 74 20 61 20 70 6f 73 69 78 2d 61 64  * Set a posix-ad
ccb0: 76 69 73 6f 72 79 2d 6c 6f 63 6b 2e 0a 2a 2a 0a  visory-lock..**.
ccc0: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  ** There are two
ccd0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 69   versions of thi
cce0: 73 20 72 6f 75 74 69 6e 65 2e 20 20 49 66 20 63  s routine.  If c
ccf0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 0a 2a 2a 20  ompiled with.** 
cd00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
cd10: 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 74 68 65 6e  TLK_TIMEOUT then
cd20: 20 74 68 65 20 72 6f 75 74 69 6e 65 20 68 61 73   the routine has
cd30: 20 61 6e 20 65 78 74 72 61 20 70 61 72 61 6d 65   an extra parame
cd40: 74 65 72 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  ter.** which is 
cd50: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 75  a pointer to a u
cd60: 6e 69 78 46 69 6c 65 2e 20 20 49 66 20 74 68 65  nixFile.  If the
cd70: 20 75 6e 69 78 46 69 6c 65 2d 3e 69 42 75 73 79   unixFile->iBusy
cd80: 54 69 6d 65 6f 75 74 0a 2a 2a 20 76 61 6c 75 65  Timeout.** value
cd90: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 69 74   is set, then it
cda0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cdb0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 74  f milliseconds t
cdc0: 6f 20 77 61 69 74 20 62 65 66 6f 72 65 0a 2a 2a  o wait before.**
cdd0: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 6c 6f 63   failing the loc
cde0: 6b 2e 20 20 54 68 65 20 69 42 75 73 79 54 69 6d  k.  The iBusyTim
cdf0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 61 6c  eout value is al
ce00: 77 61 79 73 20 72 65 73 65 74 20 62 61 63 6b 20  ways reset back 
ce10: 74 6f 0a 2a 2a 20 7a 65 72 6f 20 6f 6e 20 65 61  to.** zero on ea
ce20: 63 68 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  ch call..**.** I
ce30: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ce40: 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 69 73  SETLK_TIMEOUT is
ce50: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 74 68   not defined, th
ce60: 65 6e 20 64 6f 20 61 20 6e 6f 6e 2d 62 6c 6f 63  en do a non-bloc
ce70: 6b 69 6e 67 0a 2a 2a 20 61 74 74 65 6d 70 74 20  king.** attempt 
ce80: 74 6f 20 73 65 74 20 74 68 65 20 6c 6f 63 6b 2e  to set the lock.
ce90: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
cea0: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f  TE_ENABLE_SETLK_
ceb0: 54 49 4d 45 4f 55 54 0a 23 20 64 65 66 69 6e 65  TIMEOUT.# define
cec0: 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73   osSetPosixAdvis
ced0: 6f 72 79 4c 6f 63 6b 28 68 2c 78 2c 74 29 20 6f  oryLock(h,x,t) o
cee0: 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b  sFcntl(h,F_SETLK
cef0: 2c 78 29 0a 23 65 6c 73 65 0a 73 74 61 74 69 63  ,x).#else.static
cf00: 20 69 6e 74 20 6f 73 53 65 74 50 6f 73 69 78 41   int osSetPosixA
cf10: 64 76 69 73 6f 72 79 4c 6f 63 6b 28 0a 20 20 69  dvisoryLock(.  i
cf20: 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
cf30: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
cf40: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 77   descriptor on w
cf50: 68 69 63 68 20 74 6f 20 74 61 6b 65 20 74 68 65  hich to take the
cf60: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 73 74 72 75 63   lock */.  struc
cf70: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20  t flock *pLock, 
cf80: 20 2f 2a 20 54 68 65 20 64 65 73 63 72 69 70 74   /* The descript
cf90: 69 6f 6e 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ion of the lock 
cfa0: 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
cfb0: 46 69 6c 65 20 20 20 20 20 20 20 2f 2a 20 53 74  File       /* St
cfc0: 72 75 63 74 75 72 65 20 68 6f 6c 64 69 6e 67 20  ructure holding 
cfd0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2a 2f  timeout value */
cfe0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 6f  .){.  int rc = o
cff0: 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45 54 4c 4b  sFcntl(h,F_SETLK
d000: 2c 70 4c 6f 63 6b 29 3b 0a 20 20 77 68 69 6c 65  ,pLock);.  while
d010: 28 20 72 63 3c 30 20 26 26 20 70 46 69 6c 65 2d  ( rc<0 && pFile-
d020: 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 3e 30 20  >iBusyTimeout>0 
d030: 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 20 73 79 73  ){.    /* On sys
d040: 74 65 6d 73 20 74 68 61 74 20 73 75 70 70 6f 72  tems that suppor
d050: 74 20 73 6f 6d 65 20 6b 69 6e 64 20 6f 66 20 62  t some kind of b
d060: 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f 63  locking file loc
d070: 6b 20 77 69 74 68 20 61 20 74 69 6d 65 6f 75 74  k with a timeout
d080: 2c 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61 70  ,.    ** make ap
d090: 70 72 6f 70 72 69 61 74 65 20 63 68 61 6e 67 65  propriate change
d0a0: 73 20 68 65 72 65 20 74 6f 20 69 6e 76 6f 6b 65  s here to invoke
d0b0: 20 74 68 61 74 20 62 6c 6f 63 6b 69 6e 67 20 66   that blocking f
d0c0: 69 6c 65 20 6c 6f 63 6b 2e 20 20 4f 6e 0a 20 20  ile lock.  On.  
d0d0: 20 20 2a 2a 20 67 65 6e 65 72 69 63 20 70 6f 73    ** generic pos
d0e0: 69 78 2c 20 68 6f 77 65 76 65 72 2c 20 74 68 65  ix, however, the
d0f0: 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 41 50  re is no such AP
d100: 49 2e 20 20 53 6f 20 77 65 20 73 69 6d 70 6c 79  I.  So we simply
d110: 20 74 72 79 20 74 68 65 0a 20 20 20 20 2a 2a 20   try the.    ** 
d120: 6c 6f 63 6b 20 6f 6e 63 65 20 65 76 65 72 79 20  lock once every 
d130: 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 75 6e 74 69  millisecond unti
d140: 6c 20 65 69 74 68 65 72 20 74 68 65 20 74 69 6d  l either the tim
d150: 65 6f 75 74 20 65 78 70 69 72 65 73 2c 20 6f 72  eout expires, or
d160: 20 75 6e 74 69 6c 0a 20 20 20 20 2a 2a 20 74 68   until.    ** th
d170: 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  e lock is obtain
d180: 65 64 2e 20 2a 2f 0a 20 20 20 20 75 73 6c 65 65  ed. */.    uslee
d190: 70 28 31 30 30 30 29 3b 0a 20 20 20 20 72 63 20  p(1000);.    rc 
d1a0: 3d 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f 53 45  = osFcntl(h,F_SE
d1b0: 54 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  TLK,pLock);.    
d1c0: 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65  pFile->iBusyTime
d1d0: 6f 75 74 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74  out--;.  }.  ret
d1e0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
d1f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
d200: 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20  E_SETLK_TIMEOUT 
d210: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  */.../*.** Attem
d220: 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73 74  pt to set a syst
d230: 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  em-lock on the f
d240: 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20  ile pFile.  The 
d250: 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63  lock is .** desc
d260: 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a  ribed by pLock..
d270: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69  **.** If the pFi
d280: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
d290: 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e  ad/write from un
d2a0: 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68  ix-excl, then th
d2b0: 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65  e only lock.** e
d2c0: 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20  ver obtained is 
d2d0: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
d2e0: 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74  k, and it is obt
d2f0: 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e  ained exactly on
d300: 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  ce.** the first 
d310: 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73  time any lock is
d320: 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c   attempted.  All
d330: 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73 74   subsequent syst
d340: 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70  em locking.** op
d350: 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20  erations become 
d360: 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67  no-ops.  Locking
d370: 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c   operations stil
d380: 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61  l happen interna
d390: 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  lly,.** in order
d3a0: 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61   to coordinate a
d3b0: 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73 65  ccess between se
d3c0: 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65 20  parate database 
d3d0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77  connections.** w
d3e0: 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ithin this proce
d3f0: 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74  ss, but all of t
d400: 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69  hat is handled i
d410: 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65  n memory and the
d420: 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79  .** operating sy
d430: 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61  stem does not pa
d440: 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a  rticipate..**.**
d450: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
d460: 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68  s a pass-through
d470: 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c   to fcntl(F_SETL
d480: 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20 75  K) if pFile is u
d490: 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20  sing.** any VFS 
d4a0: 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78  other than "unix
d4b0: 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69  -excl" or if pFi
d4c0: 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20  le is opened on 
d4d0: 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61  "unix-excl".** a
d4e0: 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e  nd is read-only.
d4f0: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
d500: 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
d510: 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75  all completes su
d520: 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d  ccessfully, or -
d530: 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74  1 if a call.** t
d540: 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e  o fcntl() fails.
d550: 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65   In this case, e
d560: 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72  rrno is set appr
d570: 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66 63  opriately (by fc
d580: 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69  ntl())..*/.stati
d590: 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f  c int unixFileLo
d5a0: 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
d5b0: 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  le, struct flock
d5c0: 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20   *pLock){.  int 
d5d0: 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  rc;.  unixInodeI
d5e0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
d5f0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
d600: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
d610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
d620: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
d630: 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
d640: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 28 70  tex) );.  if( (p
d650: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
d660: 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c  & (UNIXFILE_EXCL
d670: 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59  |UNIXFILE_RDONLY
d680: 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45 58 43  ))==UNIXFILE_EXC
d690: 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e  L ){.    if( pIn
d6a0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
d6b0: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
d6c0: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
d6d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
d6e0: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
d6f0: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
d700: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
d710: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
d720: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
d730: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
d740: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
d750: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
d760: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
d770: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
d780: 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79  SetPosixAdvisory
d790: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 26  Lock(pFile->h, &
d7a0: 6c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a 20 20  lock, pFile);.  
d7b0: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
d7c0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
d7d0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
d7e0: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
d7f0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
d800: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
d810: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
d820: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
d830: 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69  = osSetPosixAdvi
d840: 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  soryLock(pFile->
d850: 68 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c 65 29  h, pLock, pFile)
d860: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
d870: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
d880: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
d890: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
d8a0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
d8b0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
d8c0: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
d8d0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
d8e0: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
d8f0: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
d900: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
d910: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
d920: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
d930: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
d940: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
d950: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
d960: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
d970: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
d980: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
d990: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
d9a0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
d9b0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
d9c0: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
d9d0: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
d9e0: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
d9f0: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
da00: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
da10: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
da20: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
da30: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
da40: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
da50: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
da60: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
da70: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
da80: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
da90: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
daa0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
dab0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
dac0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
dad0: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
dae0: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
daf0: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
db00: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
db10: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
db20: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
db30: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
db40: 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
db50: 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
db60: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
db70: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
db80: 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
db90: 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
dba0: 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71   int unixLock(sq
dbb0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
dbc0: 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
dbd0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
dbe0: 6e 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65  ng describes the
dbf0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
dc00: 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  of the various l
dc10: 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f  ocks and.  ** lo
dc20: 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69  ck transitions i
dc30: 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50  n terms of the P
dc40: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68  OSIX advisory sh
dc50: 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69  ared and exclusi
dc60: 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69  ve.  ** lock pri
dc70: 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20  mitives (called 
dc80: 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77  read-locks and w
dc90: 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77  rite-locks below
dca0: 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20  , to avoid.  ** 
dcb0: 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53  confusion with S
dcc0: 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73  QLite lock names
dcd0: 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d  ). The algorithm
dce0: 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65  s are complicate
dcf0: 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20  d.  ** slightly 
dd00: 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63  in order to be c
dd10: 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 57  ompatible with W
dd20: 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65 6d 73  indows95 systems
dd30: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
dd40: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
dd50: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
dd60: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
dd70: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
dd80: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
dd90: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
dda0: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
ddb0: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
ddc0: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
ddd0: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
dde0: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
ddf0: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
de00: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
de10: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
de20: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
de30: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
de40: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
de50: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
de60: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
de70: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
de80: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
de90: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
dea0: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
deb0: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
dec0: 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61 72 65  ccessful, 'share
ded0: 64 20 62 79 74 65 20 72 61 6e 67 65 27 20 69 73  d byte range' is
dee0: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20 20 2a   read-locked.  *
def0: 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f  * and the lock o
df00: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
df10: 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 20 20  yte' released.  
df20: 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20 20 57  (Legacy note:  W
df30: 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74 65 20  hen.  ** SQLite 
df40: 77 61 73 20 66 69 72 73 74 20 64 65 76 65 6c 6f  was first develo
df50: 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35 20 73  ped, Windows95 s
df60: 79 73 74 65 6d 73 20 77 65 72 65 20 73 74 69 6c  ystems were stil
df70: 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c 0a 20  l very common,. 
df80: 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77 73 39   ** and Widnows9
df90: 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72 65 64  5 lacks a shared
dfa0: 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69 74 79  -lock capability
dfb0: 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f 77 73  .  So on Windows
dfc0: 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e 67 6c  95, a.  ** singl
dfd0: 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63  e randomly selec
dfe0: 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68 65 20  ted by from the 
dff0: 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e  'shared byte ran
e000: 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e 0a 20  ge' is locked.. 
e010: 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20 69 73   ** Windows95 is
e020: 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75 63 68   now pretty much
e030: 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20 74 68   extinct, but th
e040: 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 66  is work-around f
e050: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61 63 6b  or the.  ** lack
e060: 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63 6b 73   of shared-locks
e070: 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20 6c 69   on Windows95 li
e080: 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61 63 6b  ves on, for back
e090: 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d 70 61  wards.  ** compa
e0a0: 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a 2a 0a  tibility.).  **.
e0b0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
e0c0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
e0d0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
e0e0: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
e0f0: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
e100: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
e110: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
e120: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
e130: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
e140: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
e150: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
e160: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
e170: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
e180: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
e190: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
e1a0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
e1b0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
e1c0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
e1d0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
e1e0: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
e1f0: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
e200: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
e210: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
e220: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
e230: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
e240: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
e250: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
e260: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
e270: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
e280: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
e290: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
e2a0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
e2b0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
e2c0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
e2d0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
e2e0: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
e2f0: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
e300: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
e310: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
e320: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
e330: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
e340: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
e350: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
e360: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
e370: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
e380: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
e390: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
e3a0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
e3b0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
e3c0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
e3d0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
e3e0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
e3f0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
e400: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
e410: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
e420: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
e430: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
e440: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
e450: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2f 0a  database. .  */.
e460: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
e470: 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
e480: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
e490: 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
e4a0: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
e4b0: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
e4c0: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72   lock;.  int tEr
e4d0: 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  rno = 0;..  asse
e4e0: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
e4f0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
e500: 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
e510: 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69  ,%d) pid=%d (uni
e520: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
e530: 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
e540: 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a  k(eFileLock), az
e550: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
e560: 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20  eFileLock),.    
e570: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69    azFileLock(pFi
e580: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e590: 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70  eLock), pFile->p
e5a0: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
e5b0: 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
e5c0: 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  )));..  /* If th
e5d0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
e5e0: 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79   lock of this ty
e5f0: 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72  pe or more restr
e600: 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20  ictive on the.  
e610: 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20  ** unixFile, do 
e620: 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75  nothing. Don't u
e630: 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a  se the end_lock:
e640: 20 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20   exit path, as. 
e650: 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74   ** unixEnterMut
e660: 65 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e  ex() hasn't been
e670: 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a   called yet..  *
e680: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
e690: 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c  FileLock>=eFileL
e6a0: 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ock ){.    OSTRA
e6b0: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
e6c0: 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68  %s ok (already h
e6d0: 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20  eld) (unix)\n", 
e6e0: 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20  pFile->h,.      
e6f0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
e700: 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
e710: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e720: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
e730: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
e740: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
e750: 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20   correct..  **  
e760: 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
e770: 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
e780: 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
e790: 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
e7a0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
e7b0: 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
e7c0: 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
e7d0: 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
e7e0: 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
e7f0: 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
e800: 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
e810: 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
e820: 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
e830: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
e840: 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
e850: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
e860: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
e870: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
e880: 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
e890: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
e8a0: 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
e8b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
e8c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e8d0: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
e8e0: 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65  This mutex is ne
e8f0: 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46 69  eded because pFi
e900: 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
e910: 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
e920: 61 64 73 0a 20 20 2a 2f 0a 20 20 70 49 6e 6f 64  ads.  */.  pInod
e930: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e940: 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  e;.  sqlite3_mut
e950: 65 78 5f 65 6e 74 65 72 28 70 49 6e 6f 64 65 2d  ex_enter(pInode-
e960: 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 0a 20  >pLockMutex);.. 
e970: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
e980: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
e990: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
e9a0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
e9b0: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
e9c0: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
e9d0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
e9e0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
e9f0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
ea00: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
ea10: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
ea20: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
ea30: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
ea40: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
ea50: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
ea60: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
ea70: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
ea80: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
ea90: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
eaa0: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
eab0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
eac0: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
ead0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
eae0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
eaf0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
eb00: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
eb10: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
eb20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
eb30: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
eb40: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
eb50: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
eb60: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
eb70: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
eb80: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
eb90: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
eba0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
ebb0: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
ebc0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
ebd0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ebe0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ebf0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
ec00: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
ec10: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
ec20: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
ec30: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
ec40: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
ec50: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
ec60: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
ec70: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
ec80: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
ec90: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
eca0: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
ecb0: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
ecc0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
ecd0: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
ece0: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
ecf0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
ed00: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
ed10: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
ed20: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
ed30: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
ed40: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
ed50: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ed60: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
ed70: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ed80: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
ed90: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
eda0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
edb0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
edc0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
edd0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ede0: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
edf0: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
ee00: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
ee10: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
ee20: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
ee30: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
ee40: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
ee50: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
ee60: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
ee70: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
ee80: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
ee90: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
eea0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
eeb0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
eec0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
eed0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
eee0: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
eef0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
ef00: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
ef10: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
ef20: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
ef30: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
ef40: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
ef50: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
ef60: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
ef70: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
ef80: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
ef90: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
efa0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
efb0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
efc0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
efd0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
efe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
eff0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
f000: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
f010: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
f020: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
f030: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
f040: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
f050: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
f060: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
f070: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
f080: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
f090: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
f0a0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f0b0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
f0c0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
f0d0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
f0e0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
f0f0: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
f100: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
f110: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
f120: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
f130: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
f140: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
f150: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
f160: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
f170: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
f180: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
f190: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
f1a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f1b0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
f1c0: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
f1d0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
f1e0: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
f1f0: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
f200: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
f210: 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20  NLOCK; .    }.. 
f220: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
f230: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f240: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
f250: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f260: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f270: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
f280: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
f290: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f2a0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
f2b0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
f2c0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
f2d0: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
f2e0: 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
f2f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
f300: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
f310: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
f320: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
f330: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
f340: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
f350: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
f360: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
f370: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
f380: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
f390: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
f3a0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
f3b0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
f3c0: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
f3d0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
f3e0: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
f3f0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
f400: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
f410: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
f420: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
f430: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
f440: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
f450: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
f460: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
f470: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
f480: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
f490: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
f4a0: 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73  _WRLCK;..    ass
f4b0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
f4c0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
f4d0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
f4e0: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
f4f0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f500: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
f510: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
f520: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
f530: 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  BYTE;.      lock
f540: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
f550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
f560: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
f570: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
f580: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
f590: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ARED_SIZE;.    }
f5a0: 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ..    if( unixFi
f5b0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
f5c0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
f5d0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
f5e0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
f5f0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
f600: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
f610: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
f620: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
f630: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
f640: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
f650: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
f660: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
f670: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20  .  }.  ..#ifdef 
f680: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
f690: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
f6a0: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
f6b0: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
f6c0: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
f6d0: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
f6e0: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
f6f0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
f700: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
f710: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
f720: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
f730: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f740: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
f750: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
f760: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
f770: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
f780: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
f790: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
f7a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
f7b0: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
f7c0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
f7d0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
f7e0: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
f7f0: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
f800: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
f810: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
f820: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
f830: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
f840: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f850: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
f860: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f870: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
f880: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f890: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
f8a0: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
f8b0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
f8c0: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f8d0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
f8e0: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
f8f0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f900: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
f910: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
f920: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
f930: 65 61 76 65 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  eave(pInode->pLo
f940: 63 6b 4d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52  ckMutex);.  OSTR
f950: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
f960: 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22   %s %s (unix)\n"
f970: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
f980: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
f990: 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51  ), .      rc==SQ
f9a0: 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
f9b0: 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72   "failed"));.  r
f9c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f9d0: 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65 20  ** Add the file 
f9e0: 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64 20  descriptor used 
f9f0: 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70  by file handle p
fa00: 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72  File to the corr
fa10: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e  esponding.** pUn
fa20: 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  used list..*/.st
fa30: 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e  atic void setPen
fa40: 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20  dingFd(unixFile 
fa50: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
fa60: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
fa70: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
fa80: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
fa90: 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 50 72   *p = pFile->pPr
faa0: 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
fab0: 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78  ;.  assert( unix
fac0: 46 69 6c 65 4d 75 74 65 78 48 65 6c 64 28 70 46  FileMutexHeld(pF
fad0: 69 6c 65 29 20 29 3b 0a 20 20 70 2d 3e 70 4e 65  ile) );.  p->pNe
fae0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  xt = pInode->pUn
faf0: 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e  used;.  pInode->
fb00: 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70  pUnused = p;.  p
fb10: 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20  File->h = -1;.  
fb20: 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
fb30: 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a  atedUnused = 0;.
fb40: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
fb50: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
fb60: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
fb70: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
fb80: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
fb90: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
fba0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
fbb0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
fbc0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
fbd0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
fbe0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
fbf0: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
fc00: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
fc10: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
fc20: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
fc30: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
fc40: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
fc50: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
fc60: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
fc70: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
fc80: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
fc90: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
fca0: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
fcb0: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
fcc0: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
fcd0: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
fce0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
fcf0: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
fd00: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
fd10: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
fd20: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
fd30: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
fd40: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
fd50: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
fd60: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
fd70: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
fd80: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
fd90: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
fda0: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
fdb0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
fdc0: 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  int posixUnlock(
fdd0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
fde0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c  , int eFileLock,
fdf0: 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e   int handleNFSUn
fe00: 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c  lock){.  unixFil
fe10: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
fe20: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
fe30: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
fe40: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
fe50: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
fe60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
fe70: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
fe80: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
fe90: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
fea0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
feb0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
fec0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
fed0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
fee0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
fef0: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ff00: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
ff10: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
ff20: 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
ff30: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ff40: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ff50: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ff60: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
ff70: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
ff80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ff90: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70    }.  pInode = p
ffa0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
ffb0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
ffc0: 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63  ter(pInode->pLoc
ffd0: 6b 4d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  kMutex);.  asser
ffe0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
fff0: 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ed!=0 );.  if( p
10000 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
10010 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
10020 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
10030 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46  e->eFileLock==pF
10040 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
10050 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
10060 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68  _DEBUG.    /* Wh
10070 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f  en reducing a lo
10080 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68  ck such that oth
10090 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e  er processes can
100a0 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65   start.    ** re
100b0 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
100c0 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d  se file again, m
100d0 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
100e0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63  e.    ** transac
100f0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
10100 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20   updated if any 
10110 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61  part of the data
10120 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65  base.    ** file
10130 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
10140 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
10150 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64  unter is not upd
10160 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68  ated,.    ** oth
10170 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  er connections t
10180 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  o the same file 
10190 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a  might not realiz
101a0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
101b0 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67  e file has chang
101c0 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67  ed and hence mig
101d0 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66  ht not know to f
101e0 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a  lush their.    *
101f0 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73  * cache.  The us
10200 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63  e of a stale cac
10210 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  he can lead to d
10220 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
10230 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
10240 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
10250 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ite = 0;.#endif.
10260 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61 64  .    /* downgrad
10270 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64 20  ing to a shared 
10280 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76 6f  lock on NFS invo
10290 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74 68  lves clearing th
102a0 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20 20  e write lock.   
102b0 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61 62   ** before estab
102c0 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61 64  lishing the read
102d0 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64 20  lock - to avoid 
102e0 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e  a race condition
102f0 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20 20   we downgrade.  
10300 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 6e    ** the lock in
10310 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74 68   2 blocks, so th
10320 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 72  at part of the r
10330 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f 76  ange will be cov
10340 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20 2a  ered by a .    *
10350 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e 74  * write lock unt
10360 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20 63  il the rest is c
10370 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61 64  overed by a read
10380 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20 31   lock:.    **  1
10390 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20 20  :   [WWWWW].    
103a0 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57 5d  **  2:   [....W]
103b0 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b 52  .    **  3:   [R
103c0 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34 3a  RRRW].    **  4:
103d0 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20 2a     [RRRR.].    *
103e0 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65 4c  /.    if( eFileL
103f0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
10400 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   ){.#if !defined
10410 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 21  (__APPLE__) || !
10420 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
10430 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
10440 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e 46    (void)handleNF
10450 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  SUnlock;.      a
10460 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46 53  ssert( handleNFS
10470 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e  Unlock==0 );.#en
10480 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
10490 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
104a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
104b0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20  ING_STYLE.      
104c0 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  if( handleNFSUnl
104d0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ock ){.        i
104e0 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20 20  nt tErrno;      
104f0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f           /* Erro
10500 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73 74  r code from syst
10510 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a  em call errors *
10520 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74 20  /.        off_t 
10530 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45 44  divSize = SHARED
10540 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20 20  _SIZE - 1;.     
10550 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b     .        lock
10560 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
10570 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
10580 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10590 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
105a0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
105b0 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
105c0 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
105d0 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
105e0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
105f0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10600 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
10610 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10620 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
10630 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
10640 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
10650 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
10660 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
10670 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
10680 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
10690 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
106a0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
106b0 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
106c0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
106d0 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
106e0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
106f0 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
10700 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
10710 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
10720 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10730 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d  (pFile, &lock)==
10740 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
10750 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10760 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
10770 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10780 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10790 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
107a0 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  RDLOCK);.       
107b0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
107c0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
107d0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
107e0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
107f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
10800 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
10810 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
10820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10830 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
10840 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c  UNLCK;.        l
10850 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
10860 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20  EEK_SET;.       
10870 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10880 53 48 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76  SHARED_FIRST+div
10890 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f  Size;.        lo
108a0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
108b0 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a  D_SIZE-divSize;.
108c0 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
108d0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
108e0 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a  &lock)==(-1) ){.
108f0 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f            tErrno
10900 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10910 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10920 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
10930 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
10940 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
10950 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
10960 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
10970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10980 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
10990 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
109a0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
109b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
109c0 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20 7b 0a 20  YLE */.      {. 
109d0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
109e0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
109f0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10a00 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10a10 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
10a20 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10a30 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
10a40 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
10a50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 69  _SIZE;.        i
10a60 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10a70 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b  pFile, &lock) ){
10a80 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
10a90 20 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c   theory, the cal
10aa0 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63  l to unixFileLoc
10ab0 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  k() cannot fail 
10ac0 62 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a  because another.
10ad0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f            ** pro
10ae0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
10af0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
10b00 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73  lock. If it does
10b10 2c 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20  , this .        
10b20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74    ** indicates t
10b30 68 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72  hat the other pr
10b40 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
10b50 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69  lowing the locki
10b60 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
10b70 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69  protocol. If thi
10b80 73 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72  s happens, retur
10b90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
10ba0 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67  DLOCK. Returning
10bb0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51  .          ** SQ
10bc0 4c 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20  LITE_BUSY would 
10bd0 63 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65  confuse the uppe
10be0 72 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63  r layer (in prac
10bf0 74 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a  tice it causes .
10c00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20            ** an 
10c10 61 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e  assert to fail).
10c20 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72   */ .          r
10c30 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10c40 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _RDLOCK;.       
10c50 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10c60 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
10c70 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10c80 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
10c90 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10ca0 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74    }.    lock.l_t
10cb0 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10cc0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
10cd0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
10ce0 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10cf0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
10d00 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32    lock.l_len = 2
10d10 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e 44  L;  assert( PEND
10d20 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53 45  ING_BYTE+1==RESE
10d30 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20 20  RVED_BYTE );.   
10d40 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10d50 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d  k(pFile, &lock)=
10d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  =0 ){.      pIno
10d70 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
10d80 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
10d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
10da0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10db0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74  UNLOCK;.      st
10dc0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10dd0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
10de0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
10df0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
10e00 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  f( eFileLock==NO
10e10 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  _LOCK ){.    /* 
10e20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68  Decrement the sh
10e30 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65  ared lock counte
10e40 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20  r.  Release the 
10e50 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20  lock using an.  
10e60 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c    ** OS call onl
10e70 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61  y when all threa
10e80 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20  ds in this same 
10e90 70 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c  process have rel
10ea0 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65  eased.    ** the
10eb0 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   lock..    */.  
10ec0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
10ed0 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
10ee0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
10ef0 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
10f00 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
10f10 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
10f20 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
10f30 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10f40 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  rt = lock.l_len 
10f50 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20  = 0L;.      if( 
10f60 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10f70 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
10f80 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
10f90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
10fa0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
10fb0 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
10fc0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
10fd0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  OCK;.        sto
10fe0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10ff0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
11000 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
11010 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
11020 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11030 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
11040 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
11050 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
11060 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
11070 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
11080 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
11090 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
110a0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
110b0 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
110c0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
110d0 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
110e0 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
110f0 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
11100 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
11110 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
11120 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
11130 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
11140 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
11150 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
11160 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c 6f 73 65 50  Lock==0 ) closeP
11170 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
11180 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63  ;.  }..end_unloc
11190 6b 3a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  k:.  sqlite3_mut
111a0 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d  ex_leave(pInode-
111b0 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
111c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
111d0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
111e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
111f0 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  eLock;.  }.  ret
11200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
11210 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
11220 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
11230 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11240 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11250 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11260 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11270 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11280 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11290 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
112a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
112b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
112c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
112d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
112e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
112f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
11300 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11310 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
11320 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
11330 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
11340 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
11350 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61  _MMAP_SIZE>0.  a
11360 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
11370 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
11380 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
11390 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
113a0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
113b0 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
113c0 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
113d0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
113e0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
113f0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
11400 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
11410 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
11420 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ;.static void un
11430 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
11440 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64  File *pFd);.#end
11450 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
11460 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
11470 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68   the parts of th
11480 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f  e "close file" o
11490 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d  peration .** com
114a0 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
114b0 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63  ng schemes. It c
114c0 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74  loses the direct
114d0 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20  ory and file.** 
114e0 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79  handles, if they
114f0 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20   are valid, and 
11500 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20  sets all fields 
11510 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
11520 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
11530 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a  0..**.** It is *
11540 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74  not* necessary t
11550 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
11560 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
11570 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  ne is called,.**
11580 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73   even on VxWorks
11590 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20  .  A mutex will 
115a0 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56  be acquired on V
115b0 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a  xWorks by the.**
115c0 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
115d0 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e  ileId() routine.
115e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
115f0 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
11600 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
11610 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11620 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11630 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  d;.#if SQLITE_MA
11640 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
11650 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
11660 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ile);.#endif.  i
11670 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
11680 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
11690 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
116a0 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
116b0 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
116c0 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
116d0 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
116e0 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
116f0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
11700 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
11710 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
11720 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
11730 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
11740 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
11750 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
11760 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
11770 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
11780 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
11790 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49  fdef SQLITE_UNLI
117a0 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20  NK_AFTER_CLOSE. 
117b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
117c0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
117d0 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f  _DELETE ){.    o
117e0 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a  sUnlink(pFile->z
117f0 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
11800 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a  e3_free(*(char**
11810 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  )&pFile->zPath);
11820 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  .    pFile->zPat
11830 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  h = 0;.  }.#endi
11840 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
11850 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
11860 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
11870 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
11880 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
11890 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
118a0 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73  dUnused);.  mems
118b0 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a  et(pFile, 0, siz
118c0 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a  eof(unixFile));.
118d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
118e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
118f0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
11900 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f  atic int unixClo
11910 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
11920 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  *id){.  int rc =
11930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11940 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
11950 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
11960 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
11970 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11980 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  >pInode;..  asse
11990 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b  rt( pInode!=0 );
119a0 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  .  verifyDbFile(
119b0 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e  pFile);.  unixUn
119c0 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
119d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  );.  assert( uni
119e0 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
119f0 64 28 70 46 69 6c 65 29 20 29 3b 0a 20 20 75 6e  d(pFile) );.  un
11a00 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11a10 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
11a20 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  Inode is always 
11a30 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65  valid here. Othe
11a40 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65  rwise, a differe
11a50 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f  nt close.  ** ro
11a60 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f  utine (e.g. nolo
11a70 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64  ckClose()) would
11a80 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
11a90 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ad..  */.  asser
11aa0 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
11ab0 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
11ac0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
11ad0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
11ae0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
11af0 6e 74 65 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f  nter(pInode->pLo
11b00 63 6b 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ckMutex);.  if( 
11b10 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
11b20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
11b30 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
11b40 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
11b50 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
11b60 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
11b70 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
11b80 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
11b90 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
11ba0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
11bb0 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
11bc0 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
11bd0 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
11be0 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
11bf0 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
11c00 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
11c10 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
11c20 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
11c30 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
11c40 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  File);.  }.  sql
11c50 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
11c60 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
11c70 74 65 78 29 3b 0a 20 20 72 65 6c 65 61 73 65 49  tex);.  releaseI
11c80 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
11c90 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
11ca0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
11cb0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
11cc0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
11ce0 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20  nd of the posix 
11cf0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d  advisory lock im
11d00 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
11d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
11d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
11d70 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
11d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e  ************** N
11de0 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  o-op Locking ***
11df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
11e10 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72  **.** Of the var
11e20 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  ious locking imp
11e30 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61  lementations ava
11e40 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20  ilable, this is 
11e50 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69  by far the.** si
11e60 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67  mplest:  locking
11e70 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f   is ignored.  No
11e80 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
11e90 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74   to lock the dat
11ea0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f  abase.** file fo
11eb0 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  r reading or wri
11ec0 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ting..**.** This
11ed0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
11ee0 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72   appropriate for
11ef0 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c   use on read-onl
11f00 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28  y databases.** (
11f10 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68  ex: databases th
11f20 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e  at are burned in
11f30 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65  to CD-ROM, for e
11f40 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e  xample.)  It can
11f50 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64  .** also be used
11f60 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   if the applicat
11f70 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65  ion employs some
11f80 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e   external mechan
11f90 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e  ism to.** preven
11fa0 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61  t simultaneous a
11fb0 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d  ccess of the sam
11fc0 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77  e database by tw
11fd0 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74  o or more.** dat
11fe0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
11ff0 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73  s.  But there is
12000 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20   a serious risk 
12010 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  of database.** c
12020 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69  orruption if thi
12030 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
12040 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74  s used in situat
12050 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69  ions where multi
12060 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ple.** database 
12070 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20  connections are 
12080 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
12090 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
120a0 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   at the same.** 
120b0 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20  time and one or 
120c0 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f  more of those co
120d0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72  nnections are wr
120e0 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69  iting..*/..stati
120f0 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63  c int nolockChec
12100 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12110 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
12120 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  sed, int *pResOu
12130 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  t){.  UNUSED_PAR
12140 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
12150 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b  .  *pResOut = 0;
12160 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12170 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
12180 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c  t nolockLock(sql
12190 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
121a0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
121b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
121c0 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
121d0 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
121e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
121f0 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
12200 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
12210 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
12220 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
12230 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12240 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
12250 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
12260 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12270 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69  .** Close the fi
12280 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
12290 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71  t nolockClose(sq
122a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
122b0 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  {.  return close
122c0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
122d0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
122e0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
122f0 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c   no-op lock impl
12300 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
12310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12320 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
12330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
12370 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
12380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
123c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
123d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
123e0 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69  n dot-file Locki
123f0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
12400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12410 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66  *.**.** The dotf
12420 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ile locking impl
12430 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20  ementation uses 
12440 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  the existence of
12450 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a   separate lock.*
12460 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20  * files (really 
12470 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20  a directory) to 
12480 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74  control access t
12490 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
124a0 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f   This works.** o
124b0 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65  n just about eve
124c0 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d  ry filesystem im
124d0 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74  aginable.  But t
124e0 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73  here are serious
124f0 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a   downsides:.**.*
12500 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20  *    (1)  There 
12510 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65  is zero concurre
12520 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72  ncy.  A single r
12530 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c  eader blocks all
12540 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
12550 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72    connections fr
12560 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  om reading or wr
12570 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  iting the databa
12580 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  se..**.**    (2)
12590 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e    An application
125a0 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20   crash or power 
125b0 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73  loss can leave s
125c0 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a  tale lock files.
125d0 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69  **         sitti
125e0 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e  ng around that n
125f0 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65  eed to be cleare
12600 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a  d manually..**.*
12610 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  * Nevertheless, 
12620 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20  a dotlock is an 
12630 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  appropriate lock
12640 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65  ing mode for use
12650 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20   if no.** other 
12660 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
12670 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a   is available..*
12680 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63  *.** Dotfile loc
12690 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72  king works by cr
126a0 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65  eating a subdire
126b0 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d  ctory in the sam
126c0 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a  e directory as.*
126d0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  * the database a
126e0 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  nd with the same
126f0 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61   name but with a
12700 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69   ".lock" extensi
12710 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65  on added..** The
12720 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20   existence of a 
12730 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69  lock directory i
12740 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53  mplies an EXCLUS
12750 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f  IVE lock.  All o
12760 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70  ther.** lock typ
12770 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45  es (SHARED, RESE
12780 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61  RVED, PENDING) a
12790 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45  re mapped into E
127a0 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a  XCLUSIVE..*/../*
127b0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66  .** The file suf
127c0 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65  fix added to the
127d0 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e   data base filen
127e0 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ame in order to 
127f0 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f  create the.** lo
12800 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f  ck directory..*/
12810 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b  .#define DOTLOCK
12820 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a  _SUFFIX ".lock".
12830 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
12840 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
12850 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
12860 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
12870 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
12880 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
12890 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
128a0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
128b0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
128c0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
128d0 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
128e0 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
128f0 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
12900 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
12910 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
12920 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
12930 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
12940 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
12950 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  k checking..**.*
12960 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63  * In dotfile loc
12970 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c  king, either a l
12980 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74  ock exists or it
12990 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69   does not.  So i
129a0 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74  n this.** variat
129b0 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65  ion of CheckRese
129c0 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65  rvedLock(), *pRe
129d0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74  sOut is set to t
129e0 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a  rue if any lock.
129f0 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ** is held on th
12a00 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65  e file and false
12a10 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
12a20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61  unlocked..*/.sta
12a30 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12a40 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
12a50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12a60 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
12a70 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
12a80 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
12a90 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
12aa0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12ab0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12ac0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
12ad0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
12ae0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
12af0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
12b00 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
12b10 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64 20 3d   );.  reserved =
12b20 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e 73 74   osAccess((const
12b30 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f   char*)pFile->lo
12b40 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20 30 29  ckingContext, 0)
12b50 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ==0;.  OSTRACE((
12b60 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
12b70 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29   %d %d (dotlock)
12b80 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
12b90 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
12ba0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
12bb0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
12bc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
12bd0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
12be0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
12bf0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
12c00 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
12c10 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
12c20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
12c30 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
12c40 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
12c50 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
12c60 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
12c70 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
12c80 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
12c90 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
12ca0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
12cb0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
12cc0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
12cd0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
12ce0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
12cf0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
12d00 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
12d10 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
12d20 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
12d30 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
12d40 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
12d50 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
12d60 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
12d70 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
12d80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
12d90 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
12da0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
12db0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
12dc0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
12dd0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
12de0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
12df0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
12e00 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
12e10 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
12e20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
12e30 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
12e40 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
12e50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
12e60 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
12e70 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54  XCLUSIVE.**.** T
12e80 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
12e90 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
12ea0 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
12eb0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
12ec0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
12ed0 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
12ee0 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74  level..**.** Wit
12ef0 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  h dotfile lockin
12f00 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c  g, we really onl
12f10 79 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20  y support state 
12f20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a  (4): EXCLUSIVE..
12f30 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20  ** But we track 
12f40 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  the other lockin
12f50 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61  g levels interna
12f60 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lly..*/.static i
12f70 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73  nt dotlockLock(s
12f80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12f90 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
12fa0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12fb0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12fc0 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
12fd0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
12fe0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
12ff0 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
13000 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a   = SQLITE_OK;...
13010 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
13020 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  any lock, then t
13030 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72  he lock file alr
13040 65 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c  eady exists.  Al
13050 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74  l we have.  ** t
13060 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f  o do is adjust o
13070 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  ur internal reco
13080 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c  rd of the lock l
13090 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  evel..  */.  if(
130a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
130b0 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  k > NO_LOCK ){. 
130c0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
130d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
130e0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75  .    /* Always u
130f0 70 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74  pdate the timest
13100 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66  amp on the old f
13110 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41  ile */.#ifdef HA
13120 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69  VE_UTIME.    uti
13130 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  me(zLockFile, NU
13140 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75  LL);.#else.    u
13150 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c  times(zLockFile,
13160 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20   NULL);.#endif. 
13170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13180 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
13190 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
131a0 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20  ve lock */.  rc 
131b0 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46  = osMkdir(zLockF
131c0 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66  ile, 0777);.  if
131d0 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ( rc<0 ){.    /*
131e0 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f   failed to open/
131f0 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20  create the lock 
13200 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20  directory */.   
13210 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
13220 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58  rno;.    if( EEX
13230 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b  IST == tErrno ){
13240 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13250 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65  TE_BUSY;.    } e
13260 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lse {.      rc =
13270 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
13280 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
13290 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
132a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
132b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
132c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
132d0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
132e0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
132f0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
13300 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a  urn rc;.  } .  .
13310 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
13320 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
13330 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
13340 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
13350 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
13360 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13370 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
13380 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
13390 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
133a0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
133b0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
133c0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
133d0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
133e0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
133f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
13400 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
13410 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
13420 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
13430 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
13440 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
13450 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
13460 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  no-op..**.** Whe
13470 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  n the locking le
13480 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c  vel reaches NO_L
13490 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20  OCK, delete the 
134a0 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  lock file..*/.st
134b0 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
134c0 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
134d0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
134e0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
134f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13500 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
13510 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
13520 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
13530 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
13540 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
13550 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13560 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13570 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70    %d %d was %d p
13580 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  id=%d (dotlock)\
13590 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
135a0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
135b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
135c0 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
135d0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
135e0 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
135f0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13600 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13610 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
13620 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
13630 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
13640 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13650 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
13660 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
13670 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
13680 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
13690 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
136a0 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
136b0 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
136c0 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
136d0 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
136e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
136f0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
13700 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13710 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
13720 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13730 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
13740 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
13750 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
13760 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
13770 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
13780 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
13790 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 52  CK );.  rc = osR
137a0 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b  mdir(zLockFile);
137b0 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20  .  if( rc<0 ){. 
137c0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
137d0 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 74  errno;.    if( t
137e0 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 7b  Errno==ENOENT ){
137f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
13800 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
13810 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13820 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
13830 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
13840 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
13850 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
13860 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
13870 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
13880 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
13890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
138b0 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65 20  e a file.  Make 
138c0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68 61  sure the lock ha
138d0 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  s been released 
138e0 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e 0a  before closing..
138f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
13900 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  tlockClose(sqlit
13910 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
13920 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
13930 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
13940 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
13950 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e  0 );.  dotlockUn
13960 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13970 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
13980 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
13990 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74 75  Context);.  retu
139a0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
139b0 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  (id);.}./*******
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
139d0 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
139e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
139f0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
13a00 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
13a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a50 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
13a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13aa0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
13ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ac0 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
13ad0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13af0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
13b00 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
13b10 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
13b20 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
13b30 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
13b40 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
13b50 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
13b60 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
13b70 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
13b80 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
13b90 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
13ba0 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
13bb0 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
13bc0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
13bd0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
13be0 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
13bf0 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
13c00 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
13c10 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
13c20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
13c30 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
13c40 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
13c50 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
13c60 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
13c70 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
13c80 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
13c90 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
13ca0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
13cb0 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
13cc0 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
13cd0 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
13ce0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13cf0 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
13d00 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
13d10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
13d20 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
13d30 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
13d40 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
13d50 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
13d60 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
13d70 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
13d80 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
13d90 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
13da0 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
13db0 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
13dc0 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
13dd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13de0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
13df0 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
13e00 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
13e10 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
13e20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
13e30 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
13e40 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
13e50 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
13e60 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
13e70 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
13e80 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
13e90 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
13ea0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
13eb0 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
13ec0 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
13ed0 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
13ee0 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
13ef0 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
13f00 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
13f10 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
13f20 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
13f30 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
13f40 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
13f50 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
13f60 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
13f70 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
13f80 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
13f90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
13fa0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
13fb0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
13fc0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
13fd0 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
13fe0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
13ff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14000 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14010 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
14020 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
14030 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
14040 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
14050 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
14060 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
14070 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
14080 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
14090 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
140a0 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
140b0 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
140c0 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
140d0 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
140e0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
140f0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
14100 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
14110 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
14120 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
14130 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
14140 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
14150 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
14160 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
14170 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
14180 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
14190 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
141a0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
141b0 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
141c0 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
141d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
141e0 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
141f0 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
14200 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
14210 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
14220 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
14230 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
14240 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
14250 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
14260 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = lrc;.      }. 
14270 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14280 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
14290 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
142a0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
142b0 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
142c0 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
142d0 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
142e0 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
142f0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
14300 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
14310 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
14320 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
14330 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
14340 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
14350 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
14360 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
14370 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
14380 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
14390 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
143a0 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
143b0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
143c0 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
143d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
143e0 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
143f0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
14400 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c  c & 0xff) == SQL
14410 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
14420 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14430 0a 20 20 20 20 72 65 73 65 72 76 65 64 3d 31 3b  .    reserved=1;
14440 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  .  }.#endif /* S
14450 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
14460 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
14470 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  /.  *pResOut = r
14480 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
14490 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
144a0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
144b0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
144c0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
144d0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
144e0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
144f0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
14500 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
14510 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
14520 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
14530 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
14540 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
14550 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
14560 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
14570 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
14580 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
14590 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
145a0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
145b0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
145c0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
145d0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
145e0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
145f0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
14600 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
14610 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
14620 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
14630 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
14640 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
14650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
14660 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
14670 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
14680 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
14690 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
146a0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
146b0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
146c0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
146d0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
146e0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
146f0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
14700 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
14710 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
14720 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
14730 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
14740 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
14750 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72  * flock() only r
14760 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
14770 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
14780 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
14790 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
147a0 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
147b0 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
147c0 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
147d0 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
147e0 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
147f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
14800 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
14810 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
14820 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
14830 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
14840 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
14850 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
14860 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
14870 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
14880 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
14890 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
148a0 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
148b0 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73   int flockLock(s
148c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
148d0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
148e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
148f0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
14900 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14910 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73  xFile*)id;..  as
14920 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
14930 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
14940 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
14950 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
14960 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
14970 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
14980 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
14990 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
149a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
149b0 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
149c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
149d0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
149e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
149f0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61  .  }.  .  /* gra
14a00 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  b an exclusive l
14a10 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28  ock */.  .  if (
14a20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
14a30 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c  le->h, LOCK_EX |
14a40 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20   LOCK_NB)) {.   
14a50 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
14a60 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e  rno;.    /* didn
14a70 27 74 20 67 65 74 2c 20 6d 75 73 74 20 62 65 20  't get, must be 
14a80 62 75 73 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d  busy */.    rc =
14a90 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
14aa0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
14ab0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
14ac0 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
14ad0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
14ae0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
14af0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
14b00 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
14b10 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a   } else {.    /*
14b20 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
14b30 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
14b40 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65   ok */.    pFile
14b50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14b60 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f  ileLock;.  }.  O
14b70 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
14b80 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f 63 6b   %d %s %s (flock
14b90 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
14ba0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
14bb0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
14bc0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
14bd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
14be0 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  d"));.#ifdef SQL
14bf0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
14c00 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
14c10 66 28 20 28 72 63 20 26 20 30 78 66 66 29 20 3d  f( (rc & 0xff) =
14c20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
14c30 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14c40 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
14c50 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
14c60 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
14c70 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
14c80 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
14c90 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
14ca0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
14cb0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14cc0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14cd0 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14ce0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14cf0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14d00 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14d10 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14d20 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14d30 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14d40 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
14d50 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
14d60 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
14d70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
14d80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
14d90 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
14da0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14db0 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
14dc0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
14dd0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
14de0 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
14df0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
14e00 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
14e10 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
14e20 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
14e30 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
14e40 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
14e50 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14e60 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
14e70 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
14e80 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
14e90 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
14ea0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
14eb0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14ec0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
14ed0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
14ee0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
14ef0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
14f00 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
14f10 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
14f20 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
14f30 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
14f40 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
14f50 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
14f60 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14f70 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
14f80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
14f90 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
14fa0 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
14fb0 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
14fc0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
14fd0 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
14fe0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
14ff0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15000 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
15010 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
15020 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
15030 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
15040 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
15050 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
15060 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
15070 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15080 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
15090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
150a0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
150b0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
150c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
150d0 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
150e0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 61 73  file *id) {.  as
150f0 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
15100 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c   flockUnlock(id,
15110 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74   NO_LOCK);.  ret
15120 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
15130 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  e(id);.}..#endif
15140 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
15150 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
15160 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f  && !OS_VXWORK */
15170 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
15180 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
15190 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70  e flock lock imp
151a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
151b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151c0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
151d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
151f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15210 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15260 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15280 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72  n Named Semaphor
15290 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  e Locking ******
152a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
152b0 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  **.**.** Named s
152c0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
152d0 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74   is only support
152e0 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  ed on VxWorks..*
152f0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
15300 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
15310 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63  ot-lock and floc
15320 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72 65 61  k in that it rea
15330 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70  lly only.** supp
15340 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c  orts EXCLUSIVE l
15350 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20  ocking.  Only a 
15360 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
15370 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  an read or write
15380 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
15390 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e   file at a time.
153a0 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 70    This reduces p
153b0 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72  otential concurr
153c0 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b  ency, but.** mak
153d0 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c  es the lock impl
153e0 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20  ementation much 
153f0 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f  easier..*/.#if O
15400 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a  S_VXWORKS../*.**
15410 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
15420 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
15430 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
15440 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
15450 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
15460 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
15470 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
15480 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
15490 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
154a0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
154b0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
154c0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
154d0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
154e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
154f0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
15500 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
15510 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
15520 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
15530 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
15540 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73  int semXCheckRes
15550 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
15560 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15570 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e  *pResOut) {.  in
15580 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
15590 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
155a0 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
155b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
155c0 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
155d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
155e0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
155f0 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
15600 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65  CK; );.  .  asse
15610 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20  rt( pFile );..  
15620 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
15630 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
15640 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
15650 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
15660 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15670 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
15680 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
15690 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
156a0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
156b0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
156c0 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20  s holds it. */. 
156d0 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29   if( !reserved )
156e0 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65  {.    sem_t *pSe
156f0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
15700 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66  e->pSem;..    if
15710 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53  ( sem_trywait(pS
15720 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  em)==-1 ){.     
15730 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
15740 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45  rno;.      if( E
15750 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20  AGAIN != tErrno 
15760 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
15770 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15780 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15790 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
157a0 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
157b0 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  );.        store
157c0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
157d0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
157e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
157f0 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65   /* someone else
15800 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68   has the lock wh
15810 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f  en we are in NO_
15820 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20  LOCK */.        
15830 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c  reserved = (pFil
15840 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53  e->eFileLock < S
15850 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
15860 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
15870 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c        /* we coul
15880 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65 20  d have it if we 
15890 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20  want it */.     
158a0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b   sem_post(pSem);
158b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
158c0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
158d0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73 65  OCK %d %d %d (se
158e0 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  m)\n", pFile->h,
158f0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
15900 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ..  *pResOut = r
15910 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
15920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
15930 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
15940 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
15950 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
15960 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
15970 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
15980 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
15990 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
159a0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
159b0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
159c0 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
159d0 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
159e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
159f0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
15a00 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
15a10 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
15a20 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
15a30 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
15a40 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
15a50 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
15a60 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
15a70 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
15a80 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
15a90 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
15aa0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
15ab0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
15ac0 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
15ad0 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
15ae0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
15af0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
15b00 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
15b10 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
15b20 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
15b30 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
15b40 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
15b50 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
15b60 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
15b70 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
15b80 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
15b90 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
15ba0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
15bb0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
15bc0 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
15bd0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
15be0 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
15bf0 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  s only really su
15c00 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
15c10 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
15c20 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
15c30 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
15c40 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
15c50 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
15c60 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
15c70 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
15c80 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
15c90 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
15ca0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
15cb0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
15cc0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
15cd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
15ce0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
15cf0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
15d00 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
15d10 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
15d20 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
15d30 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
15d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d  /.static int sem
15d50 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  XLock(sqlite3_fi
15d60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
15d70 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
15d80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
15d90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
15da0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
15db0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
15dc0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15dd0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
15de0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
15df0 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
15e00 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
15e10 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
15e20 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
15e30 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
15e40 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
15e50 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
15e60 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
15e70 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
15e80 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
15e90 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
15ea0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
15eb0 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
15ec0 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
15ed0 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
15ee0 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
15ef0 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
15f00 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
15f10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15f20 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
15f30 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
15f40 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
15f50 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
15f60 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
15f70 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15f80 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
15f90 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
15fa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15fb0 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
15fc0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
15fd0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
15fe0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
15ff0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
16000 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
16010 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
16020 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
16030 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16040 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
16050 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
16060 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
16070 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
16080 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
16090 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
160a0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
160b0 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f  tic int semXUnlo
160c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
160d0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
160e0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
160f0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16100 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
16110 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
16120 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20  pInode->pSem;.. 
16130 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
16140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d  ;.  assert( pSem
16150 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
16160 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
16170 73 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d  s %d pid=%d (sem
16180 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
16190 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
161a0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
161b0 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
161c0 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
161d0 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
161e0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
161f0 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
16200 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
16210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
16220 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
16230 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16240 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73  K;.  }.  .  /* s
16250 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62  hared can just b
16260 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65  e set because we
16270 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20   always have an 
16280 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69  exclusive */.  i
16290 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f (eFileLock==SH
162a0 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  ARED_LOCK) {.   
162b0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
162c0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
162d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
162e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
162f0 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f   no, really unlo
16300 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65  ck. */.  if ( se
16310 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31  m_post(pSem)==-1
16320 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c   ) {.    int rc,
16330 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
16340 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16350 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
16360 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
16370 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
16380 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16390 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
163a0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
163b0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
163c0 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  o);.    }.    re
163d0 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20  turn rc; .  }.  
163e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
163f0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65   = NO_LOCK;.  re
16400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16410 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20  }../*. ** Close 
16420 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74  a file.. */.stat
16430 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65  ic int semXClose
16440 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
16450 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b  d) {.  if( id ){
16460 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  .    unixFile *p
16470 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16480 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e  *)id;.    semXUn
16490 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
164a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
164b0 46 69 6c 65 20 29 3b 0a 20 20 20 20 61 73 73 65  File );.    asse
164c0 72 74 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65  rt( unixFileMute
164d0 78 4e 6f 74 68 65 6c 64 28 70 46 69 6c 65 29 20  xNotheld(pFile) 
164e0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
164f0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c  Mutex();.    rel
16500 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
16510 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  ile);.    unixLe
16520 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
16530 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
16540 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16550 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65  SQLITE_OK;.}..#e
16560 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
16570 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65  KS */./*.** Name
16580 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
16590 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ing is only avai
165a0 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73  lable on VxWorks
165b0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
165c0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
165d0 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
165e0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
165f0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
16600 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
16610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16650 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
16660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
166b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166c0 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63  ** Begin AFP Loc
166d0 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
166e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
166f0 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50  ******.**.** AFP
16700 20 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69   is the Apple Fi
16710 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20  ling Protocol.  
16720 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b  AFP is a network
16730 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e   filesystem foun
16740 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61  d.** on Apple Ma
16750 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72  cintosh computer
16760 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64  s - both OS9 and
16770 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72   OSX..**.** Thir
16780 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e  d-party implemen
16790 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61  tations of AFP a
167a0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42  re available.  B
167b0 75 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72  ut this code her
167c0 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20  e.** only works 
167d0 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20  on OSX..*/..#if 
167e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
167f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
16800 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
16810 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c  E./*.** The afpL
16820 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74  ockingContext st
16830 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
16840 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70   all afp lock sp
16850 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a  ecific state.*/.
16860 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61  typedef struct a
16870 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
16880 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
16890 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f  xt;.struct afpLo
168a0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20  ckingContext {. 
168b0 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20   int reserved;. 
168c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50   const char *dbP
168d0 61 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  ath;            
168e0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
168f0 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  open file */.};.
16900 0a 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67  .struct ByteRang
16910 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73  eLockPB2.{.  uns
16920 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
16930 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f  offset;        /
16940 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73  * offset to firs
16950 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a  t byte to lock *
16960 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
16970 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20  g long length;  
16980 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20        /* nbr of 
16990 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
169a0 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
169b0 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74   long retRangeSt
169c0 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31  art; /* nbr of 1
169d0 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69  st byte locked i
169e0 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a  f successful */.
169f0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
16a00 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20  unLockFlag;     
16a10 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63      /* 1 = unloc
16a20 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20  k, 0 = lock */. 
16a30 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73   unsigned char s
16a40 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20  tartEndFlag;    
16a50 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65     /* 1=rel to e
16a60 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65  nd of fork, 0=re
16a70 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20  l to start */.  
16a80 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74    /* file desc t
16ab0 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63  o assoc this loc
16ac0 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64  k with */.};..#d
16ad0 65 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52  efine afpfsByteR
16ae0 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20  angeLock2FSCTL  
16af0 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c        _IOWR('z',
16b00 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
16b10 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f  RangeLockPB2)../
16b20 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
16b30 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69  tility for setti
16b40 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61  ng or clearing a
16b50 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20   bit-range lock 
16b60 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c  on an.** AFP fil
16b70 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20  esystem..** .** 
16b80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
16b90 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c   on success, SQL
16ba0 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c  ITE_BUSY on fail
16bb0 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ure..*/.static i
16bc0 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20  nt afpSetLock(. 
16bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74   const char *pat
16be0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
16bf0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
16c00 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
16c10 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   or unlocked */.
16c20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
16c30 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16c40 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
16c50 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68  scriptor on path
16c60 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
16c70 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c  ong long offset,
16c80 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
16c90 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  te to be locked 
16ca0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
16cb0 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20  ng long length, 
16cc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
16cd0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
16ce0 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46  /.  int setLockF
16cf0 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20  lag             
16d00 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65     /* True to se
16d10 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74  t lock.  False t
16d20 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a  o clear lock */.
16d30 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65  ){.  struct Byte
16d40 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b  RangeLockPB2 pb;
16d50 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20  .  int err;.  . 
16d60 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d   pb.unLockFlag =
16d70 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30   setLockFlag ? 0
16d80 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74   : 1;.  pb.start
16d90 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70  EndFlag = 0;.  p
16da0 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65  b.offset = offse
16db0 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d  t;.  pb.length =
16dc0 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66   length; .  pb.f
16dd0 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  d = pFile->h;.  
16de0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50  .  OSTRACE(("AFP
16df0 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72  SETLOCK [%s] for
16e00 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25   %d%s in range %
16e10 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20  llx:%llx\n", .  
16e20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22    (setLockFlag?"
16e30 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c  ON":"OFF"), pFil
16e40 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31  e->h, (pb.fd==-1
16e50 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22  ?"[testval-1]":"
16e60 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20  "),.    offset, 
16e70 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20  length));.  err 
16e80 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66  = fsctl(path, af
16e90 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
16ea0 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b  2FSCTL, &pb, 0);
16eb0 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20  .  if ( err==-1 
16ec0 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ) {.    int rc;.
16ed0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
16ee0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52   errno;.    OSTR
16ef0 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
16f00 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c   failed to fsctl
16f10 28 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22  () '%s' %d %s\n"
16f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
16f30 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72  ath, tErrno, str
16f40 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b  error(tErrno)));
16f50 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
16f60 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45  GNORE_AFP_LOCK_E
16f70 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53  RRORS.    rc = S
16f80 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73  QLITE_BUSY;.#els
16f90 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  e.    rc = sqlit
16fa0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
16fb0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20  rror(tErrno,.   
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16fd0 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53   setLockFlag ? S
16fe0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
16ff0 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   : SQLITE_IOERR_
17000 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20  UNLOCK);.#endif 
17010 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
17020 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  _AFP_LOCK_ERRORS
17030 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c   */.    if( IS_L
17040 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
17050 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
17060 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
17070 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
17080 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65  return rc;.  } e
17090 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
170a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
170b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
170c0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
170d0 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
170e0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
170f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
17100 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
17110 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
17120 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
17130 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
17140 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
17150 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
17160 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
17170 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
17180 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
17190 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
171a0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
171b0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
171c0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
171d0 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
171e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43  .static int afpC
171f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
17200 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17210 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
17220 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17230 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
17240 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
17250 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
17260 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
17270 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
17280 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a  xt *context;.  .
17290 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
172a0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
172b0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
172c0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
172d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
172e0 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28  );.  context = (
172f0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
17300 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
17310 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66  ingContext;.  if
17320 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72  ( context->reser
17330 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ved ){.    *pRes
17340 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Out = 1;.    ret
17350 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17360 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
17370 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e  ex_enter(pFile->
17380 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74  pInode->pLockMut
17390 65 78 29 3b 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ex);.  /* Check 
173a0 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
173b0 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
173c0 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
173d0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
173e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
173f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
17400 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
17410 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68  .  }.  .  /* Oth
17420 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
17430 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
17440 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f   holds it..   */
17450 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
17460 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20   ){.    /* lock 
17470 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79 74  the RESERVED byt
17480 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63  e */.    int lrc
17490 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
174a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
174b0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
174c0 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20  YTE, 1,1);  .   
174d0 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
174e0 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  lrc ){.      /* 
174f0 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64 20  if we succeeded 
17500 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72 65  in taking the re
17510 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c  served lock, unl
17520 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f 72  ock it to restor
17530 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  e.      ** the o
17540 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f  riginal state */
17550 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66 70  .      lrc = afp
17560 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17570 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17580 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
17590 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  , 0);.    } else
175a0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77   {.      /* if w
175b0 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20  e failed to get 
175c0 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f  the lock then so
175d0 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74 20  meone else must 
175e0 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20 20  have it */.     
175f0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
17600 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53 5f     }.    if( IS_
17610 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
17620 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63 3b  ){.      rc=lrc;
17630 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
17640 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
17650 61 76 65 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ave(pFile->pInod
17660 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a  e->pLockMutex);.
17670 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
17680 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
17690 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
176a0 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76  e->h, rc, reserv
176b0 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73  ed));.  .  *pRes
176c0 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
176d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
176e0 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
176f0 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
17700 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
17710 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
17720 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
17730 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
17740 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
17750 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17760 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
17770 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
17780 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
17790 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
177a0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
177b0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
177c0 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
177d0 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
177e0 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
177f0 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
17800 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
17810 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
17820 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
17830 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
17840 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
17850 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
17860 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
17870 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
17880 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
17890 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
178a0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
178b0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
178c0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
178d0 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
178e0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
178f0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
17900 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
17910 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
17920 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
17930 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
17940 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
17950 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
17960 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
17970 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
17980 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
17990 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
179a0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
179b0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
179c0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
179d0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
179e0 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
179f0 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
17a00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
17a10 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  fpLock(sqlite3_f
17a20 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
17a30 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  leLock){.  int r
17a40 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17a50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
17a60 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
17a70 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
17a80 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
17a90 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  e->pInode;.  afp
17aa0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
17ab0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
17ac0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
17ad0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
17ae0 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65  ntext;.  .  asse
17af0 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
17b00 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
17b10 20 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73   %d %s was %s(%s
17b20 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70  ,%d) pid=%d (afp
17b30 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
17b40 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
17b50 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
17b60 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
17b70 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
17b80 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
17b90 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46  eLock(pInode->eF
17ba0 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65  ileLock), pInode
17bb0 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65  ->nShared , osGe
17bc0 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
17bd0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
17be0 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
17bf0 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
17c00 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
17c10 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
17c20 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
17c30 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70  on't use the afp
17c40 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20  _end_lock: exit 
17c50 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
17c60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
17c70 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
17c80 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
17c90 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
17ca0 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
17cb0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
17cc0 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
17cd0 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
17ce0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
17cf0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
17d00 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
17d10 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  ck)));.    retur
17d20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
17d30 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
17d40 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71   the locking seq
17d50 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74  uence is correct
17d60 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
17d70 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
17d80 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
17d90 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
17da0 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
17db0 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
17dc0 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
17dd0 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
17de0 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
17df0 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
17e00 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
17e10 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
17e20 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
17e30 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
17e40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
17e50 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
17e60 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17e70 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
17e80 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
17e90 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
17ea0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
17eb0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
17ec0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17ed0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
17ee0 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75  .  .  /* This mu
17ef0 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65  tex is needed be
17f00 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
17f10 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
17f20 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a  ross threads.  *
17f30 2f 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  /.  pInode = pFi
17f40 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71  le->pInode;.  sq
17f50 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17f60 72 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d  r(pInode->pLockM
17f70 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  utex);..  /* If 
17f80 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e  some thread usin
17f90 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20 61  g this PID has a
17fa0 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66   lock via a diff
17fb0 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a  erent unixFile*.
17fc0 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74    ** handle that
17fd0 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20 72   precludes the r
17fe0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72  equested lock, r
17ff0 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f  eturn BUSY..  */
18000 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65  .  if( (pFile->e
18010 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65  FileLock!=pInode
18020 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a  ->eFileLock && .
18030 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e         (pInode->
18040 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
18050 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NG_LOCK || eFile
18060 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
18070 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72  )).     ){.    r
18080 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
18090 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e  .    goto afp_en
180a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20  d_lock;.  }.  . 
180b0 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
180c0 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
180d0 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
180e0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
180f0 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
18100 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
18110 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
18120 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
18130 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
18140 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
18150 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
18160 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18170 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
18180 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
18190 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
181a0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
181b0 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
181c0 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
181d0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
181e0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
181f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
18200 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
18210 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18220 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18230 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
18240 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18250 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
18260 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
18270 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
18280 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61  ck++;.    goto a
18290 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d  fp_end_lock;.  }
182a0 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e  .    .  /* A PEN
182b0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
182c0 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
182d0 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
182e0 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
182f0 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
18300 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
18310 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
18320 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
18330 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
18340 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
18350 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
18360 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20  HARED_LOCK .    
18370 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    || (eFileLock=
18380 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
18390 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
183a0 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ock<PENDING_LOCK
183b0 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  ).  ){.    int f
183c0 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65  ailed;.    faile
183d0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
183e0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
183f0 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
18400 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  YTE, 1, 1);.    
18410 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20  if (failed) {.  
18420 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b      rc = failed;
18430 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18440 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a  end_lock;.    }.
18450 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63    }.  .  /* If c
18460 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
18470 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
18480 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
18490 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
184a0 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
184b0 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
184c0 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
184d0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
184e0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
184f0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31   ){.    int lrc1
18500 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e  , lrc2, lrc1Errn
18510 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20  o = 0;.    long 
18520 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20  lk, mask;.    . 
18530 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
18540 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b  e->nShared==0 );
18550 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
18560 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
18570 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  0 );.        .  
18580 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66    mask = (sizeof
18590 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52  (long)==8) ? LAR
185a0 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37  GEST_INT64 : 0x7
185b0 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20  fffffff;.    /* 
185c0 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
185d0 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43  -lock SHARED_LOC
185e0 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65  K */.    /* note
185f0 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69 74   that the qualit
18600 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e  y of the randomn
18610 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  ess doesn't matt
18620 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a  er that much */.
18630 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28      lk = random(
18640 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ); .    pInode->
18650 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b  sharedByte = (lk
18660 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44   & mask)%(SHARED
18670 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
18680 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc1 = afpSetLoc
18690 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
186a0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
186b0 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52 53       SHARED_FIRS
186c0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
186d0 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
186e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
186f0 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20  OR(lrc1) ){.    
18700 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46    lrc1Errno = pF
18710 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a  ile->lastErrno;.
18720 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f      }.    /* Dro
18730 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  p the temporary 
18740 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a  PENDING lock */.
18750 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65      lrc2 = afpSe
18760 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18770 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
18780 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
18790 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20  );.    .    if( 
187a0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
187b0 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74  c1) ) {.      st
187c0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
187d0 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a  le, lrc1Errno);.
187e0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
187f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18800 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
18810 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
18820 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
18830 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
18840 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
18850 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
18860 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
18870 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
18880 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
18890 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
188a0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
188b0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
188c0 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
188d0 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
188e0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
188f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
18900 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
18910 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
18920 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
18930 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
18940 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
18950 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
18960 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
18970 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
18980 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
18990 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
189a0 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
189b0 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
189c0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
189d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
189e0 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
189f0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
18a00 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
18a10 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
18a20 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
18a30 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
18a40 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
18a50 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
18a60 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
18a70 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
18a80 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
18a90 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
18aa0 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
18ab0 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
18ac0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
18ad0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
18ae0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
18af0 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
18b00 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
18b10 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
18b20 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
18b30 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
18b40 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
18b50 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
18b60 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
18b70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
18b80 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
18b90 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
18ba0 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
18bb0 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
18bc0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
18bd0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
18be0 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
18bf0 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
18c00 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
18c10 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
18c20 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
18c30 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
18c40 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
18c50 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
18c60 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
18c70 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
18c80 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
18c90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
18ca0 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
18cb0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18cc0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18cd0 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
18d00 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
18d10 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
18d20 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
18d30 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
18d40 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
18d50 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
18d60 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
18d70 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
18d80 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18d90 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18da0 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
18db0 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
18de0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
18df0 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
18e00 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
18e10 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
18e20 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
18e50 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18e60 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
18e70 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
18e80 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
18e90 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
18ea0 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
18eb0 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
18ec0 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
18ed0 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
18ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
18ef0 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
18f00 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49   & 0xff) == SQLI
18f10 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
18f20 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
18f30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
18f40 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
18f50 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
18f60 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
18f70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
18f80 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
18f90 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
18fa0 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
18fb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
18fc0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
18fd0 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
18fe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
18ff0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
19000 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
19010 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
19020 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
19030 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
19040 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
19050 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
19060 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
19070 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
19080 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
19090 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
190a0 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
190b0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 73 71 6c 69 74  nd_lock:.  sqlit
190c0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
190d0 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65  Inode->pLockMute
190e0 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
190f0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
19100 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
19110 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
19120 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
19130 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
19140 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
19150 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
19160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
19170 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
19180 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
19190 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
191a0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
191b0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
191c0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
191d0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
191e0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
191f0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
19200 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
19210 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
19220 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
19230 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
19240 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
19250 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
19260 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
19270 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
19280 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
19290 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
192a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
192b0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
192c0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
192d0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
192e0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
192f0 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
19300 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
19310 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
19320 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
19330 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
19340 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
19350 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
19360 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
19370 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
19380 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
19390 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
193a0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
193b0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
193c0 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
193d0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
193e0 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
193f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
19400 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
19410 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
19420 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
19430 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
19440 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
19450 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
19460 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
19470 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
19480 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
19490 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
194a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
194b0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
194c0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 73 71 6c  e->pInode;.  sql
194d0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
194e0 28 70 49 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75  (pInode->pLockMu
194f0 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
19500 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21  pInode->nShared!
19510 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  =0 );.  if( pFil
19520 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
19530 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
19540 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
19550 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65  eFileLock==pFile
19560 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20  ->eFileLock );. 
19570 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
19580 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
19590 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
195a0 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53  ( h=(-1) ).    S
195b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
195c0 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69  nign(0);.    .#i
195d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
195e0 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
195f0 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
19600 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
19610 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
19620 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
19630 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19640 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
19650 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
19660 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
19670 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
19680 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
19690 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
196a0 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
196b0 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
196c0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
196d0 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
196e0 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
196f0 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
19700 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
19710 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
19720 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
19730 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
19740 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
19750 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
19760 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
19770 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
19780 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
19790 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
197a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
197b0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
197c0 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61  ( pFile->inNorma
197d0 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20  lWrite==0.      
197e0 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64       || pFile->d
197f0 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20  bUpdate==0.     
19800 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
19810 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31  transCntrChng==1
19820 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   );.    pFile->i
19830 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
19840 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20  ;.#endif.    .  
19850 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
19860 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
19870 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
19880 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19890 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
198a0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
198b0 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a  IRST, SHARED_SIZ
198c0 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  E, 0);.      if(
198d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
198e0 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  & (eFileLock==SH
198f0 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e  ARED_LOCK || pIn
19900 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20  ode->nShared>1) 
19910 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e  ){.        /* on
19920 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20  ly re-establish 
19930 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
19940 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
19950 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72          int shar
19960 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
19970 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
19980 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
19990 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
199a0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
199b0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
199c0 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
199d0 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73   1);.      } els
199e0 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70  e {.        skip
199f0 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
19a00 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
19a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19a20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
19a30 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
19a40 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
19a50 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
19a60 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
19a70 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
19a80 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20   1, 0);.    } . 
19a90 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19aa0 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  E_OK && pFile->e
19ab0 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56  FileLock>=RESERV
19ac0 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65  ED_LOCK && conte
19ad0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
19ae0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
19af0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
19b00 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45  bPath, pFile, RE
19b10 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20  SERVED_BYTE, 1, 
19b20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72  0);.      if( !r
19b30 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f  c ){ .        co
19b40 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
19b50 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  = 0; .      }.  
19b60 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
19b70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
19b80 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
19b90 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
19ba0 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20  nShared>1)){.   
19bb0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
19bc0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
19bd0 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  CK;.    }.  }.  
19be0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19bf0 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  K && eFileLock==
19c00 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20  NO_LOCK ){..    
19c10 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
19c20 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
19c30 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
19c40 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
19c50 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
19c60 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
19c70 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
19c80 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
19c90 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
19ca0 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
19cb0 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
19cc0 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f  ng long sharedLo
19cd0 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f  ckByte = SHARED_
19ce0 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
19cf0 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49  aredByte;.    pI
19d00 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
19d10 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
19d20 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
19d30 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d40 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
19d50 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d60 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
19d70 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
19d80 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
19d90 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68       if( !skipSh
19da0 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ared ){.        
19db0 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19dc0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
19dd0 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f   pFile, sharedLo
19de0 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20  ckByte, 1, 0);. 
19df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
19e00 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20   !rc ){.        
19e10 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19e20 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
19e30 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
19e40 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
19e50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
19e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49  E_OK ){.      pI
19e80 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
19e90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
19ea0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
19eb0 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
19ec0 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 20 63 6c  e->nLock==0 ) cl
19ed0 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
19ee0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
19ef0 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74    .  sqlite3_mut
19f00 65 78 5f 6c 65 61 76 65 28 70 49 6e 6f 64 65 2d  ex_leave(pInode-
19f10 3e 70 4c 6f 63 6b 4d 75 74 65 78 29 3b 0a 20 20  >pLockMutex);.  
19f20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
19f30 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
19f40 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
19f50 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  eLock;.  }.  ret
19f60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19f70 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
19f80 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
19f90 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
19fa0 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
19fb0 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
19fc0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
19fd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19fe0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19ff0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1a000 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
1a010 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
1a020 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
1a030 4c 4f 43 4b 29 3b 0a 20 20 61 73 73 65 72 74 28  LOCK);.  assert(
1a040 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f   unixFileMutexNo
1a050 74 68 65 6c 64 28 70 46 69 6c 65 29 20 29 3b 0a  theld(pFile) );.
1a060 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1a070 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ();.  if( pFile-
1a080 3e 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 75  >pInode ){.    u
1a090 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
1a0a0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
1a0b0 6e 6f 64 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  node;.    sqlite
1a0c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49  3_mutex_enter(pI
1a0d0 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
1a0e0 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
1a0f0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
1a100 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
1a110 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
1a120 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e  ding locks, do n
1a130 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73  ot actually clos
1a140 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a  e the file just.
1a150 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63        ** yet bec
1a160 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
1a170 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
1a180 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
1a190 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
1a1a0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  ** descriptor to
1a1b0 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e   pInode->aPendin
1a1c0 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  g.  It will be a
1a1d0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
1a1e0 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a  sed when.      *
1a1f0 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  * the last lock 
1a200 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
1a210 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65    */.      setPe
1a220 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
1a230 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a240 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49  3_mutex_leave(pI
1a250 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
1a260 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
1a270 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
1a280 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
1a290 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
1a2a0 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d 20  ontext);.  rc = 
1a2b0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
1a2c0 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
1a2d0 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
1a2e0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
1a2f0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1a300 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1a310 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1a320 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
1a330 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
1a340 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
1a350 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
1a360 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
1a370 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
1a380 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
1a390 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
1a3a0 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
1a3b0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
1a3c0 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f  vailable.  If yo
1a3d0 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20  u don't compile 
1a3e0 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20  for a mac, then 
1a3f0 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a  the "unix-afp".*
1a400 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61  * VFS is not ava
1a410 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ilable..**.*****
1a420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a430 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20   End of the AFP 
1a440 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
1a450 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
1a460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
1a470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
1a4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
1a510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a520 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46  ******* Begin NF
1a530 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  S Locking ******
1a540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66  **********/..#if
1a560 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1a570 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
1a580 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
1a590 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20  LE./*. ** Lower 
1a5a0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1a5b0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
1a5c0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
1a5d0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
1a5e0 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20  ock. ** must be 
1a5f0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
1a600 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20  r SHARED_LOCK.. 
1a610 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f  **. ** If the lo
1a620 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
1a630 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
1a640 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
1a650 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68   or below. ** th
1a660 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
1a670 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
1a680 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
1a690 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  op.. */.static i
1a6a0 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c  nt nfsUnlock(sql
1a6b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1a6c0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
1a6d0 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c   return posixUnl
1a6e0 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63  ock(id, eFileLoc
1a6f0 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  k, 1);.}..#endif
1a700 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
1a710 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
1a720 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
1a730 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54  STYLE */./*.** T
1a740 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73  he code above is
1a750 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
1a760 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54  plementation.  T
1a770 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69  he code is speci
1a780 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58  fic.** to MacOSX
1a790 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f   and does not wo
1a7a0 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78  rk on other unix
1a7b0 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20   platforms.  No 
1a7c0 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69  alternative.** i
1a7d0 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a  s available.  .*
1a7e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1a7f0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
1a800 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c  he NFS lock impl
1a810 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
1a820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a830 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1a840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a880 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
1a890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a8d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
1a8e0 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20  *** Non-locking 
1a8f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1a900 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
1a910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1a920 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78  **.**.** The nex
1a930 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  t division conta
1a940 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ins implementati
1a950 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68  ons for all meth
1a960 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ods of the .** s
1a970 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65  qlite3_file obje
1a980 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ct other than th
1a990 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1a9a0 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a  s.  The locking.
1a9b0 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20  ** methods were 
1a9c0 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73  defined in divis
1a9d0 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20  ions above (one 
1a9e0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70  locking method p
1a9f0 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e  er.** division).
1aa00 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20    Those methods 
1aa10 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20  that are common 
1aa20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d  to all locking m
1aa30 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68  odes.** are gath
1aa40 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f  er together into
1aa50 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a   this division..
1aa60 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74  */../*.** Seek t
1aa70 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73  o the offset pas
1aa80 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
1aa90 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e  d argument, then
1aaa0 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79   read cnt .** by
1aab0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52  tes into pBuf. R
1aac0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1aad0 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
1aae0 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e  ly read..**.** N
1aaf0 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e  B:  If you defin
1ab00 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55  e USE_PREAD or U
1ab10 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e  SE_PREAD64, then
1ab20 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a   it might also.*
1ab30 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74  * be necessary t
1ab40 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
1ab50 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30  SOURCE to be 500
1ab60 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66  .  This varies f
1ab70 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65  rom.** one syste
1ab80 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53  m to another.  S
1ab90 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73  ince SQLite does
1aba0 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f   not define USE_
1abb0 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20  PREAD.** in any 
1abc0 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c  form by default,
1abd0 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74   we will not att
1abe0 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f  empt to define _
1abf0 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a  XOPEN_SOURCE..**
1ac00 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37   See tickets #27
1ac10 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a  41 and #2681..**
1ac20 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f  .** To avoid sto
1ac30 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20  mping the errno 
1ac40 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65  value on a faile
1ac50 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45  d read the lastE
1ac60 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73  rrno value.** is
1ac70 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75   set before retu
1ac80 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1ac90 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64   int seekAndRead
1aca0 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73  (unixFile *id, s
1acb0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1acc0 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  set, void *pBuf,
1acd0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74   int cnt){.  int
1ace0 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f   got;.  int prio
1acf0 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66  r = 0;.#if (!def
1ad00 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20  ined(USE_PREAD) 
1ad10 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f  && !defined(USE_
1ad20 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20  PREAD64)).  i64 
1ad30 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69  newOffset;.#endi
1ad40 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  f.  TIMER_START;
1ad50 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
1ad60 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b  (cnt&0x1ffff) );
1ad70 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68  .  assert( id->h
1ad80 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20  >2 );.  do{.#if 
1ad90 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1ada0 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50  D).    got = osP
1adb0 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  read(id->h, pBuf
1adc0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
1add0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1ade0 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
1adf0 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1ae00 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20  SE_PREAD64).    
1ae10 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28  got = osPread64(
1ae20 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
1ae30 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53  , offset);.    S
1ae40 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1ae50 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73  got = -1 );.#els
1ae60 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20  e.    newOffset 
1ae70 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f  = lseek(id->h, o
1ae80 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29  ffset, SEEK_SET)
1ae90 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1aea0 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74  Error( newOffset
1aeb0 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28   = -1 );.    if(
1aec0 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a   newOffset<0 ){.
1aed0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1aee0 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1aef0 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1af00 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1af10 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52   }.    got = osR
1af20 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ead(id->h, pBuf,
1af30 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20   cnt);.#endif.  
1af40 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29    if( got==cnt )
1af50 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
1af60 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69  got<0 ){.      i
1af70 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  f( errno==EINTR 
1af80 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74  ){ got = 1; cont
1af90 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72  inue; }.      pr
1afa0 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ior = 0;.      s
1afb0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75  toreLastErrno((u
1afc0 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20 65 72  nixFile*)id,  er
1afd0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rno);.      brea
1afe0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1aff0 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20   got>0 ){.      
1b000 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20  cnt -= got;.    
1b010 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b    offset += got;
1b020 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20  .      prior += 
1b030 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20  got;.      pBuf 
1b040 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20  = (void*)(got + 
1b050 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20  (char*)pBuf);.  
1b060 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f    }.  }while( go
1b070 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45  t>0 );.  TIMER_E
1b080 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ND;.  OSTRACE(("
1b090 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35 64  READ    %-3d %5d
1b0a0 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a   %7lld %llu\n",.
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e              id->
1b0c0 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66  h, got+prior, of
1b0d0 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45  fset-prior, TIME
1b0e0 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72  R_ELAPSED));.  r
1b0f0 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b  eturn got+prior;
1b100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
1b110 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
1b120 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
1b130 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b140 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
1b150 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
1b160 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
1b170 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
1b180 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
1b190 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1b1a0 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71  t unixRead(.  sq
1b1b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1b1c0 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a  .  void *pBuf, .
1b1d0 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c    int amt,.  sql
1b1e0 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65  ite3_int64 offse
1b1f0 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  t.){.  unixFile 
1b200 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1b210 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67  le *)id;.  int g
1b220 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ot;.  assert( id
1b230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
1b240 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  fset>=0 );.  ass
1b250 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20  ert( amt>0 );.. 
1b260 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
1b270 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1b280 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d  not a journal, m
1b290 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72  aster-journal or
1b2a0 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29   temp.  ** file)
1b2b0 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  , the bytes in t
1b2c0 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65  he locking range
1b2d0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65   should never be
1b2e0 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
1b2f0 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73  . */.#if 0.  ass
1b300 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50 72 65  ert( pFile->pPre
1b310 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 3d  allocatedUnused=
1b320 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  =0.       || off
1b330 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54  set>=PENDING_BYT
1b340 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20  E+512.       || 
1b350 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44  offset+amt<=PEND
1b360 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23  ING_BYTE .  );.#
1b370 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1b380 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1b390 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1b3a0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1b3b0 20 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73   read request as
1b3c0 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61   possible by tra
1b3d0 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61  nsfering.  ** da
1b3e0 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f  ta from the memo
1b3f0 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67  ry mapping using
1b400 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20   memcpy().  */. 
1b410 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c   if( offset<pFil
1b420 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1b430 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d     if( offset+am
1b440 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  t <= pFile->mmap
1b450 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65  Size ){.      me
1b460 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1b470 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1b480 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1b490 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74   amt);.      ret
1b4a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b4b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b4c0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c  int nCopy = pFil
1b4d0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66  e->mmapSize - of
1b4e0 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63  fset;.      memc
1b4f0 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a  py(pBuf, &((u8 *
1b500 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1b510 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e  ion))[offset], n
1b520 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75  Copy);.      pBu
1b530 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66  f = &((u8 *)pBuf
1b540 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20  )[nCopy];.      
1b550 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20  amt -= nCopy;.  
1b560 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43      offset += nC
1b570 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  opy;.    }.  }.#
1b580 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73  endif..  got = s
1b590 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1b5a0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1b5b0 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d  amt);.  if( got=
1b5c0 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
1b5d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1b5e0 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20  }else if( got<0 
1b5f0 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72  ){.    /* lastEr
1b600 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41  rno set by seekA
1b610 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65  ndRead */.    re
1b620 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1b630 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b  R_READ;.  }else{
1b640 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1b650 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20  rno(pFile, 0);  
1b660 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d   /* not a system
1b670 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a   error */.    /*
1b680 20 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66   Unread parts of
1b690 20 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74   the buffer must
1b6a0 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20   be zero-filled 
1b6b0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28  */.    memset(&(
1b6c0 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74  (char*)pBuf)[got
1b6d0 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a  ], 0, amt-got);.
1b6e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b6f0 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1b700 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  AD;.  }.}../*.**
1b710 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b   Attempt to seek
1b720 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69   the file-descri
1b730 70 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ptor passed as t
1b740 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1b750 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65  t to.** absolute
1b760 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68   offset iOff, th
1b770 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72  en attempt to wr
1b780 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f  ite nBuf bytes o
1b790 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70  f data from.** p
1b7a0 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e  Buf to it. If an
1b7b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
1b7c0 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74  eturn -1 and set
1b7d0 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72   *piErrno. Other
1b7e0 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e  wise, .** return
1b7f0 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62   the actual numb
1b800 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
1b810 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62  ten (which may b
1b820 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e  e less than.** n
1b830 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Buf)..*/.static 
1b840 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1b850 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20  Fd(.  int fd,   
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
1b880 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74  scriptor to writ
1b890 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f  e to */.  i64 iO
1b8a0 66 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ff,             
1b8b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1b8c0 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69  e offset to begi
1b8d0 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a  n writing at */.
1b8e0 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1b8f0 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1b900 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
1b910 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20  rom this buffer 
1b920 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
1b930 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20   int nBuf,      
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66   /* Size of buff
1b960 65 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73  er pBuf in bytes
1b970 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72   */.  int *piErr
1b980 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
1b990 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72        /* OUT: Er
1b9a0 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72  ror number if er
1b9b0 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b  ror occurs */.){
1b9c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20  .  int rc = 0;  
1b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b9e0 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75     /* Value retu
1b9f0 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63  rned by system c
1ba00 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  all */..  assert
1ba10 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78  ( nBuf==(nBuf&0x
1ba20 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65  1ffff) );.  asse
1ba30 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 61 73  rt( fd>2 );.  as
1ba40 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21 3d 30  sert( piErrno!=0
1ba50 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78   );.  nBuf &= 0x
1ba60 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53  1ffff;.  TIMER_S
1ba70 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e  TART;..#if defin
1ba80 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20  ed(USE_PREAD).  
1ba90 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73  do{ rc = (int)os
1baa0 50 77 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c  Pwrite(fd, pBuf,
1bab0 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77   nBuf, iOff); }w
1bac0 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1bad0 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1bae0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
1baf0 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72  PREAD64).  do{ r
1bb00 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74  c = (int)osPwrit
1bb10 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42  e64(fd, pBuf, nB
1bb20 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65  uf, iOff);}while
1bb30 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
1bb40 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20  =EINTR);.#else. 
1bb50 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65   do{.    i64 iSe
1bb60 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69  ek = lseek(fd, i
1bb70 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  Off, SEEK_SET);.
1bb80 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1bb90 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d 31 20  ror( iSeek = -1 
1bba0 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b  );.    if( iSeek
1bbb0 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
1bbc0 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   -1;.      break
1bbd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1bbe0 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75   osWrite(fd, pBu
1bbf0 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69  f, nBuf);.  }whi
1bc00 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1bc10 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
1bc20 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  if..  TIMER_END;
1bc30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
1bc40 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
1bc50 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c  lld %llu\n", fd,
1bc60 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52   rc, iOff, TIMER
1bc70 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69  _ELAPSED));..  i
1bc80 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45 72 72  f( rc<0 ) *piErr
1bc90 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65  no = errno;.  re
1bca0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1bcb0 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f  ** Seek to the o
1bcc0 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66  ffset in id->off
1bcd0 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63 6e  set then read cn
1bce0 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75  t bytes into pBu
1bcf0 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  f..** Return the
1bd00 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
1bd10 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 20   actually read. 
1bd20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66 73   Update the offs
1bd30 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  et..**.** To avo
1bd40 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1bd50 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1bd60 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74 68   failed write th
1bd70 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75  e lastErrno valu
1bd80 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f  e.** is set befo
1bd90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1bda0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1bdb0 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69 6c  AndWrite(unixFil
1bdc0 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73 65  e *id, i64 offse
1bdd0 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
1bde0 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20  Buf, int cnt){. 
1bdf0 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64 57   return seekAndW
1be00 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66  riteFd(id->h, of
1be10 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c  fset, pBuf, cnt,
1be20 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29   &id->lastErrno)
1be30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
1be40 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  e data from a bu
1be50 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c 65  ffer into a file
1be60 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1be70 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a  _OK on success.*
1be80 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20  * or some other 
1be90 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61  error code on fa
1bea0 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1beb0 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28 0a   int unixWrite(.
1bec0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
1bed0 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69  id, .  const voi
1bee0 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20  d *pBuf, .  int 
1bef0 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69  amt,.  sqlite3_i
1bf00 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a  nt64 offset .){.
1bf10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1bf20 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
1bf30 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20 3d  d;.  int wrote =
1bf40 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   0;.  assert( id
1bf50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d   );.  assert( am
1bf60 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  t>0 );..  /* If 
1bf70 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61  this is a databa
1bf80 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  se file (not a j
1bf90 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a  ournal, master-j
1bfa0 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20  ournal or temp. 
1bfb0 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62   ** file), the b
1bfc0 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b  ytes in the lock
1bfd0 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64  ing range should
1bfe0 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f   never be read o
1bff0 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69  r written. */.#i
1c000 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46  f 0.  assert( pF
1c010 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
1c020 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  edUnused==0.    
1c030 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1c040 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1c050 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1c060 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1c070 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1c080 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1c090 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
1c0a0 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1c0b0 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1c0c0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1c0d0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
1c0e0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1c0f0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1c100 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1c110 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1c120 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
1c130 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
1c140 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
1c150 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1c160 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
1c170 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
1c180 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1c190 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
1c1a0 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
1c1b0 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
1c1c0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1c1d0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
1c1e0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
1c1f0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
1c200 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
1c210 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
1c220 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
1c230 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
1c240 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1c250 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
1c260 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
1c270 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1c280 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1c290 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1c2a0 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
1c2b0 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
1c2c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1c2d0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
1c2e0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
1c2f0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
1c300 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
1c310 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
1c320 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1c330 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
1c340 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1c350 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
1c360 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
1c370 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1c380 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
1c390 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41  (SQLITE_MMAP_REA
1c3a0 44 57 52 49 54 45 29 20 26 26 20 53 51 4c 49 54  DWRITE) && SQLIT
1c3b0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
1c3c0 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68  0.  /* Deal with
1c3d0 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73   as much of this
1c3e0 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20 61   write request a
1c3f0 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72  s possible by tr
1c400 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64  ansfering.  ** d
1c410 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d  ata from the mem
1c420 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e  ory mapping usin
1c430 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a  g memcpy().  */.
1c440 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69    if( offset<pFi
1c450 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1c460 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61      if( offset+a
1c470 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  mt <= pFile->mma
1c480 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d  pSize ){.      m
1c490 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1c4a0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1c4b0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1c4c0 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65  , amt);.      re
1c4d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c4e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c4f0 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69   int nCopy = pFi
1c500 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f  le->mmapSize - o
1c510 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d  ffset;.      mem
1c520 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1c530 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1c540 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1c550 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42  nCopy);.      pB
1c560 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75  uf = &((u8 *)pBu
1c570 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20  f)[nCopy];.     
1c580 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20   amt -= nCopy;. 
1c590 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e       offset += n
1c5a0 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Copy;.    }.  }.
1c5b0 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65  #endif. .  while
1c5c0 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  ( (wrote = seekA
1c5d0 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
1c5e0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1c5f0 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e  ))<amt && wrote>
1c600 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  0 ){.    amt -= 
1c610 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65  wrote;.    offse
1c620 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t += wrote;.    
1c630 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29  pBuf = &((char*)
1c640 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20  pBuf)[wrote];.  
1c650 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  }.  SimulateIOEr
1c660 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29  ror(( wrote=(-1)
1c670 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69  , amt=1 ));.  Si
1c680 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1c690 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61  ror(( wrote=0, a
1c6a0 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20  mt=1 ));..  if( 
1c6b0 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20  amt>wrote ){.   
1c6c0 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20   if( wrote<0 && 
1c6d0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
1c6e0 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20  !=ENOSPC ){.    
1c6f0 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
1c700 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  et by seekAndWri
1c710 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  te */.      retu
1c720 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1c730 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65  WRITE;.    }else
1c740 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1c750 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29  tErrno(pFile, 0)
1c760 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65  ; /* not a syste
1c770 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20  m error */.     
1c780 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1c790 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ULL;.    }.  }..
1c7a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c7b0 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  OK;.}..#ifdef SQ
1c7c0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
1c7d0 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1c7e0 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e   of fullsyncs an
1c7f0 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20  d normal syncs. 
1c800 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
1c810 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79   test.** that sy
1c820 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63  ncs and fullsync
1c830 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20  s are occurring 
1c840 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69 6d  at the right tim
1c850 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
1c860 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  e3_sync_count = 
1c870 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  0;.int sqlite3_f
1c880 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20  ullsync_count = 
1c890 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
1c8a0 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74   We do not trust
1c8b0 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76   systems to prov
1c8c0 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64  ide a working fd
1c8d0 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65  atasync().  Some
1c8e0 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64   do..** Others d
1c8f0 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66  o no.  To be saf
1c900 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b  e, we will stick
1c910 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67 68   with the (sligh
1c920 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66  tly slower).** f
1c930 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b  sync(). If you k
1c940 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73 79  now that your sy
1c950 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72  stem does suppor
1c960 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f  t fdatasync() co
1c970 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e  rrectly,.** then
1c980 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20   simply compile 
1c990 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63  with -Dfdatasync
1c9a0 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44  =fdatasync or -D
1c9b0 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a  HAVE_FDATASYNC.*
1c9c0 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
1c9d0 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 48 41  datasync) && !HA
1c9e0 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64  VE_FDATASYNC.# d
1c9f0 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20  efine fdatasync 
1ca00 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a  fsync.#endif../*
1ca10 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f  .** Define HAVE_
1ca20 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f  FULLFSYNC to 0 o
1ca30 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  r 1 depending on
1ca40 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
1ca50 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59  ** the F_FULLFSY
1ca60 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  NC macro is defi
1ca70 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e  ned.  F_FULLFSYN
1ca80 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  C is currently.*
1ca90 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  * only available
1caa0 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42   on Mac OS X.  B
1cab0 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68  ut that could ch
1cac0 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ange..*/.#ifdef 
1cad0 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65  F_FULLFSYNC.# de
1cae0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1caf0 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65  YNC 1.#else.# de
1cb00 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1cb10 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f  YNC 0.#endif.../
1cb20 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29  *.** The fsync()
1cb30 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65   system call doe
1cb40 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64  s not work as ad
1cb50 76 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79  vertised on many
1cb60 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73  .** unix systems
1cb70 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1cb80 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e   procedure is an
1cb90 20 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65   attempt to make
1cba0 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74  .** it work bett
1cbb0 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  er..**.** The SQ
1cbc0 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63  LITE_NO_SYNC mac
1cbd0 72 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20  ro disables all 
1cbe0 66 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20  fsync()s.  This 
1cbf0 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72  is useful.** for
1cc00 20 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65   testing when we
1cc10 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72   want to run thr
1cc20 6f 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75  ough the test su
1cc30 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20  ite quickly..** 
1cc40 59 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79  You are strongly
1cc50 20 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74   advised *not* t
1cc60 6f 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51  o deploy with SQ
1cc70 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20  LITE_NO_SYNC.** 
1cc80 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72  enabled, however
1cc90 2c 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c  , since with SQL
1cca0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62  ITE_NO_SYNC enab
1ccb0 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68  led, an OS crash
1ccc0 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
1ccd0 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  lure will likely
1cce0 20 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74   corrupt the dat
1ccf0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1cd00 2a 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68  * SQLite sets th
1cd10 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20  e dataOnly flag 
1cd20 69 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  if the size of t
1cd30 68 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61  he file is uncha
1cd40 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65  nged..** The ide
1cd50 61 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c  a behind dataOnl
1cd60 79 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f  y is that it sho
1cd70 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  uld only write t
1cd80 68 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a  he file content.
1cd90 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20  ** to disk, not 
1cda0 74 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f  the inode.  We o
1cdb0 6e 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79  nly set dataOnly
1cdc0 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a   if the file siz
1cdd0 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67  e is .** unchang
1cde0 65 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c  ed since the fil
1cdf0 65 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f  e size is part o
1ce00 66 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f  f the inode.  Ho
1ce10 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54  wever, .** Ted T
1ce20 73 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61  s'o tells us tha
1ce30 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1ce40 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68  ll also write th
1ce50 65 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a  e inode if the.*
1ce60 2a 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20  * file size has 
1ce70 63 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e  changed.  The on
1ce80 6c 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e  ly real differen
1ce90 63 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61  ce between fdata
1cea0 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73  sync().** and fs
1ceb0 79 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73  ync(), Ted tells
1cec0 20 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61   us, is that fda
1ced0 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f  tasync() will no
1cee0 74 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69  t flush the.** i
1cef0 6e 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d  node if the mtim
1cf00 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74  e or owner or ot
1cf10 68 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62  her inode attrib
1cf20 75 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  utes have change
1cf30 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61  d..** We only ca
1cf40 72 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  re about the fil
1cf50 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20  e size, not the 
1cf60 6f 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69  other file attri
1cf70 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20  butes, so.** as 
1cf80 66 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73  far as SQLite is
1cf90 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66   concerned, an f
1cfa0 64 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c  datasync() is al
1cfb0 77 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a  ways adequate..*
1cfc0 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20  * So, we always 
1cfd0 75 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20  use fdatasync() 
1cfe0 69 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62  if it is availab
1cff0 6c 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f  le, regardless o
1d000 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  f.** the value o
1d010 66 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  f the dataOnly f
1d020 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lag..*/.static i
1d030 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e  nt full_fsync(in
1d040 74 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79  t fd, int fullSy
1d050 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79  nc, int dataOnly
1d060 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
1d070 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
1d080 20 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73   "ifdef/elif/els
1d090 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68  e/" block has th
1d0a0 65 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65  e same structure
1d0b0 20 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65   as.  ** the one
1d0c0 20 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65   below. It is re
1d0d0 70 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f  plicated here so
1d0e0 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c  lely to avoid cl
1d0f0 75 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75  uttering .  ** u
1d100 70 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20  p the real code 
1d110 77 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f  with the UNUSED_
1d120 50 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72  PARAMETER() macr
1d130 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  os..  */.#ifdef 
1d140 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20  SQLITE_NO_SYNC. 
1d150 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1d160 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
1d170 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79  PARAMETER(fullSy
1d180 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  nc);.  UNUSED_PA
1d190 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1d1a0 29 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  );.#elif HAVE_FU
1d1b0 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  LLFSYNC.  UNUSED
1d1c0 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1d1d0 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  nly);.#else.  UN
1d1e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1d1f0 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1d200 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1d210 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a  aOnly);.#endif..
1d220 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20    /* Record the 
1d230 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20  number of times 
1d240 74 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72  that we do a nor
1d250 6d 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20  mal fsync() and 
1d260 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20  .  ** FULLSYNC. 
1d270 20 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75   This is used du
1d280 72 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20  ring testing to 
1d290 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1d2a0 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20   procedure.  ** 
1d2b0 67 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68  gets called with
1d2c0 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67   the correct arg
1d2d0 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66  uments..  */.#if
1d2e0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1d2f0 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
1d300 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e   sqlite3_fullsyn
1d310 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c  c_count++;.  sql
1d320 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b  ite3_sync_count+
1d330 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  +;.#endif..  /* 
1d340 49 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77  If we compiled w
1d350 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e  ith the SQLITE_N
1d360 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65  O_SYNC flag, the
1d370 6e 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20  n syncing is a. 
1d380 20 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20   ** no-op.  But 
1d390 67 6f 20 61 68 65 61 64 20 61 6e 64 20 63 61 6c  go ahead and cal
1d3a0 6c 20 66 73 74 61 74 28 29 20 74 6f 20 76 61 6c  l fstat() to val
1d3b0 69 64 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20  idate the file. 
1d3c0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61   ** descriptor a
1d3d0 73 20 77 65 20 6e 65 65 64 20 61 20 6d 65 74 68  s we need a meth
1d3e0 6f 64 20 74 6f 20 70 72 6f 76 6f 6b 65 20 61 20  od to provoke a 
1d3f0 66 61 69 6c 75 72 65 20 64 75 72 69 6e 67 0a 20  failure during. 
1d400 20 2a 2a 20 63 6f 76 65 72 61 74 65 20 74 65 73   ** coverate tes
1d410 74 69 6e 67 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ting..  */.#ifde
1d420 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1d430 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74 20  .  {.    struct 
1d440 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20 72 63  stat buf;.    rc
1d450 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
1d460 62 75 66 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20  buf);.  }.#elif 
1d470 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1d480 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1d490 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1d4a0 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1d4b0 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1d4c0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1d4d0 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1d4e0 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1d4f0 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1d500 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1d510 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1d520 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1d530 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1d540 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1d550 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1d560 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1d570 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1d580 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1d590 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1d5a0 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1d5b0 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1d5c0 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1d5d0 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1d5e0 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1d5f0 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1d600 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1d610 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1d620 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1d630 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1d640 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1d650 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1d660 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1d670 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1d680 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1d690 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1d6a0 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1d6b0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1d6c0 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1d6d0 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1d6e0 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1d6f0 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1d700 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1d710 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1d720 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1d730 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1d740 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1d750 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1d760 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1d770 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1d780 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1d790 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1d7a0 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1d7b0 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1d7c0 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1d7d0 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1d7e0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1d7f0 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1d800 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1d810 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1d820 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1d830 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1d840 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1d850 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1d860 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d870 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1d880 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1d890 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1d8a0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1d8b0 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1d8c0 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1d8d0 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1d8e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1d8f0 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1d900 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1d910 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1d920 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1d930 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1d940 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1d950 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1d960 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1d970 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1d980 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1d990 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1d9a0 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1d9b0 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1d9c0 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1d9d0 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1d9e0 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1d9f0 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1da00 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1da10 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1da20 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1da30 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1da40 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1da50 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1da60 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1da70 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1da80 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1da90 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1daa0 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1dab0 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1dac0 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1dad0 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1dae0 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1daf0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1db00 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1db10 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1db20 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1db30 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1db40 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1db50 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1db60 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1db70 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1db80 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1db90 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1dba0 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1dbb0 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1dbc0 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1dbd0 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1dbe0 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1dbf0 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1dc00 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1dc10 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1dc20 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1dc30 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1dc40 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1dc50 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1dc60 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1dc70 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1dc80 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1dc90 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1dca0 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1dcb0 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1dcc0 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1dcd0 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1dce0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1dcf0 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1dd00 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1dd10 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1dd20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1dd30 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1dd40 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1dd50 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1dd60 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1dd70 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1dd80 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1dd90 69 3e 30 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>0 && zDirname[
1dda0 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1ddb0 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1ddc0 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1ddd0 3d 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b  = '\0';.  }else{
1dde0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 6e 61 6d  .    if( zDirnam
1ddf0 65 5b 30 5d 21 3d 27 2f 27 20 29 20 7a 44 69 72  e[0]!='/' ) zDir
1de00 6e 61 6d 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20  name[0] = '.';. 
1de10 20 20 20 7a 44 69 72 6e 61 6d 65 5b 31 5d 20 3d     zDirname[1] =
1de20 20 30 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72   0;.  }.  fd = r
1de30 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e  obust_open(zDirn
1de40 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
1de50 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 69 66  BINARY, 0);.  if
1de60 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f  ( fd>=0 ){.    O
1de70 53 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52  STRACE(("OPENDIR
1de80 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c   %-3d %s\n", fd,
1de90 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 7d   zDirname));.  }
1dea0 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20  .  *pFd = fd;.  
1deb0 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65 74 75  if( fd>=0 ) retu
1dec0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1ded0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1dee0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1def0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 44  PEN_BKPT, "openD
1df00 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69 72 6e  irectory", zDirn
1df10 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  ame);.}../*.** M
1df20 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69  ake sure all wri
1df30 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75  tes to a particu
1df40 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d  lar file are com
1df50 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a  mitted to disk..
1df60 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c  **.** If dataOnl
1df70 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74  y==0 then both t
1df80 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61  he file itself a
1df90 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61 20  nd its metadata 
1dfa0 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61  (file.** size, a
1dfb0 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29  ccess time, etc)
1dfc0 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66   are synced.  If
1dfd0 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65   dataOnly!=0 the
1dfe0 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69  n only the.** fi
1dff0 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63 65  le data is synce
1e000 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55  d..**.** Under U
1e010 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73  nix, also make s
1e020 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72  ure that the dir
1e030 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1e040 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73   the file.** has
1e050 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79   been created by
1e060 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64   fsync-ing the d
1e070 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f  irectory that co
1e080 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e  ntains the file.
1e090 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74  .** If we do not
1e0a0 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20   do this and we 
1e0b0 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65  encounter a powe
1e0c0 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  r failure, the d
1e0d0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72  irectory.** entr
1e0e0 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1e0f0 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73  l might not exis
1e100 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f  t after we reboo
1e110 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20  t.  The next.** 
1e120 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73  SQLite to access
1e130 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e   the file will n
1e140 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  ot know that the
1e150 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20   journal exists 
1e160 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
1e170 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20  directory entry 
1e180 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1e190 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65  was never create
1e1a0 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73  d) and the trans
1e1b0 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e  action.** will n
1e1c0 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70  ot roll back - p
1e1d0 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20  ossibly leading 
1e1e0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1e1f0 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  uption..*/.stati
1e200 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73  c int unixSync(s
1e210 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1e220 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69   int flags){.  i
1e230 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c  nt rc;.  unixFil
1e240 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1e250 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74  File*)id;..  int
1e260 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66   isDataOnly = (f
1e270 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43  lags&SQLITE_SYNC
1e280 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e  _DATAONLY);.  in
1e290 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28  t isFullsync = (
1e2a0 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c  flags&0x0F)==SQL
1e2b0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a  ITE_SYNC_FULL;..
1e2c0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
1e2d0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59  one of SQLITE_SY
1e2e0 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  NC_NORMAL or FUL
1e2f0 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a  L was passed */.
1e300 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73 26    assert((flags&
1e310 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
1e320 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20  NC_NORMAL.      
1e330 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d  || (flags&0x0F)=
1e340 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
1e350 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69  L.  );..  /* Uni
1e360 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f  x cannot, but so
1e370 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72  me systems may r
1e380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1e390 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69  L from here. Thi
1e3a0 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74  s.  ** line is t
1e3b0 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e  o test that doin
1e3c0 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61  g so does not ca
1e3d0 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73  use any problems
1e3e0 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74  ..  */.  Simulat
1e3f0 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1e400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1e410 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  LL );..  assert(
1e420 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
1e430 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d  ACE(("SYNC    %-
1e440 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
1e450 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66  );.  rc = full_f
1e460 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69  sync(pFile->h, i
1e470 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74  sFullsync, isDat
1e480 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61  aOnly);.  Simula
1e490 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
1e4a0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1e4b0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1e4c0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
1e4d0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
1e4e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
1e4f0 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75  IOERR_FSYNC, "fu
1e500 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65  ll_fsync", pFile
1e510 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20  ->zPath);.  }.. 
1e520 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74   /* Also fsync t
1e530 68 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e  he directory con
1e540 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65  taining the file
1e550 20 69 66 20 74 68 65 20 44 49 52 53 59 4e 43 20   if the DIRSYNC 
1e560 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74  flag.  ** is set
1e570 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65  .  This is a one
1e580 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65  -time occurrence
1e590 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20  .  Many systems 
1e5a0 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a  (examples: AIX).
1e5b0 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20    ** are unable 
1e5c0 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72 65 63  to fsync a direc
1e5d0 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20  tory, so ignore 
1e5e0 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73  errors on the fs
1e5f0 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ync..  */.  if( 
1e600 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e610 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53   & UNIXFILE_DIRS
1e620 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64  YNC ){.    int d
1e630 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43  irfd;.    OSTRAC
1e640 45 28 28 22 44 49 52 53 59 4e 43 20 25 73 20 28  E(("DIRSYNC %s (
1e650 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25  have_fullfsync=%
1e660 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e  d fullsync=%d)\n
1e670 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ", pFile->zPath,
1e680 0a 20 20 20 20 20 20 20 20 20 20 20 20 48 41 56  .            HAV
1e690 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46  E_FULLFSYNC, isF
1e6a0 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72  ullsync));.    r
1e6b0 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74  c = osOpenDirect
1e6c0 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ory(pFile->zPath
1e6d0 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69  , &dirfd);.    i
1e6e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e6f0 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66   ){.      full_f
1e700 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30  sync(dirfd, 0, 0
1e710 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  );.      robust_
1e720 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72  close(pFile, dir
1e730 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
1e740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e750 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
1e760 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20  TE_CANTOPEN );. 
1e770 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e780 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  _OK;.    }.    p
1e790 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1e7a0 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52  &= ~UNIXFILE_DIR
1e7b0 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SYNC;.  }.  retu
1e7c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1e7d0 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e  Truncate an open
1e7e0 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69   file to a speci
1e7f0 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61  fied size.*/.sta
1e800 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
1e810 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
1e820 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65  e *id, i64 nByte
1e830 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1e840 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1e850 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b   *)id;.  int rc;
1e860 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1e870 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
1e880 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
1e890 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1e8a0 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ATE );..  /* If 
1e8b0 74 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e  the user has con
1e8c0 66 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d  figured a chunk-
1e8d0 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69  size for this fi
1e8e0 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  le, truncate the
1e8f0 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68  .  ** file so th
1e900 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  at it consists o
1e910 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  f an integer num
1e920 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69  ber of chunks (i
1e930 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74  .e. the.  ** act
1e940 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66  ual file size af
1e950 74 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f  ter the operatio
1e960 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20  n may be larger 
1e970 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
1e980 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20  ed.  ** size).. 
1e990 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
1e9a0 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
1e9b0 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74    nByte = ((nByt
1e9c0 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  e + pFile->szChu
1e9d0 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73  nk - 1)/pFile->s
1e9e0 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d  zChunk) * pFile-
1e9f0 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20  >szChunk;.  }.. 
1ea00 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72   rc = robust_ftr
1ea10 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
1ea20 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 72   nByte);.  if( r
1ea30 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  c ){.    storeLa
1ea40 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
1ea50 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  rrno);.    retur
1ea60 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  n unixLogError(S
1ea70 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
1ea80 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65  CATE, "ftruncate
1ea90 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1eaa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65  ;.  }else{.#ifde
1eab0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1eac0 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20     /* If we are 
1ead0 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1eae0 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1eaf0 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1eb00 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f  sed to.    ** do
1eb10 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1eb20 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1eb30 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1eb40 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1eb50 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61      ** normal da
1eb60 74 61 62 61 73 65 20 66 69 6c 65 29 20 61 6e 64  tabase file) and
1eb70 20 77 65 20 74 72 75 6e 63 61 74 65 20 74 68 65   we truncate the
1eb80 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65   file to zero le
1eb90 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61  ngth,.    ** tha
1eba0 74 20 65 66 66 65 63 74 69 76 65 6c 79 20 75 70  t effectively up
1ebb0 64 61 74 65 73 20 74 68 65 20 63 68 61 6e 67 65  dates the change
1ebc0 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69 73 20   counter.  This 
1ebd0 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20 20 20  might happen.   
1ebe0 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f 72 69   ** when restori
1ebf0 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 75 73  ng a database us
1ec00 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70 20 41  ing the backup A
1ec10 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c  PI from a zero-l
1ec20 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75  ength.    ** sou
1ec30 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  rce..    */.    
1ec40 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1ec50 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42 79 74  malWrite && nByt
1ec60 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 46  e==0 ){.      pF
1ec70 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1ec80 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65  ng = 1;.    }.#e
1ec90 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1eca0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1ecb0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66  .    /* If the f
1ecc0 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74 72 75  ile was just tru
1ecd0 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69 7a 65  ncated to a size
1ece0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1ecf0 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20 20 20  e currently.    
1ed00 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ** mapped region
1ed10 2c 20 72 65 64 75 63 65 20 74 68 65 20 65 66 66  , reduce the eff
1ed20 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67 20 73  ective mapping s
1ed30 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c  ize as well. SQL
1ed40 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20  ite will.    ** 
1ed50 75 73 65 20 72 65 61 64 28 29 20 61 6e 64 20 77  use read() and w
1ed60 72 69 74 65 28 29 20 74 6f 20 61 63 63 65 73 73  rite() to access
1ed70 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74 68 69   data beyond thi
1ed80 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77  s point from now
1ed90 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20   on.  .    */.  
1eda0 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46 69 6c    if( nByte<pFil
1edb0 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20  e->mmapSize ){. 
1edc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70       pFile->mmap
1edd0 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Size = nByte;.  
1ede0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1edf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ee00 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
1ee10 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
1ee20 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
1ee30 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1ee40 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
1ee50 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
1ee60 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a 70  file *id, i64 *p
1ee70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
1ee80 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
1ee90 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  uf;.  assert( id
1eea0 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74   );.  rc = osFst
1eeb0 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  at(((unixFile*)i
1eec0 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20  d)->h, &buf);.  
1eed0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1eee0 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72   rc=1 );.  if( r
1eef0 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f 72  c!=0 ){.    stor
1ef00 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
1ef10 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29  File*)id, errno)
1ef20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1ef30 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
1ef40 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20  .  }.  *pSize = 
1ef50 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20  buf.st_size;..  
1ef60 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  /* When opening 
1ef70 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61 74 61  a zero-size data
1ef80 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64 49 6e  base, the findIn
1ef90 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63 65 64  odeInfo() proced
1efa0 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65 73 20  ure.  ** writes 
1efb0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 69 6e  a single byte in
1efc0 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69 6e 20  to that file in 
1efd0 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20 61 72  order to work ar
1efe0 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a 2a 20  ound a bug.  ** 
1eff0 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f  in the OS-X msdo
1f000 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20 20 49  s filesystem.  I
1f010 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
1f020 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 75   problems with u
1f030 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73  pper.  ** layers
1f040 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 70  , we need to rep
1f050 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20 73 69  ort this file si
1f060 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65 6e 20  ze as zero even 
1f070 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20 20 2a  though it is.  *
1f080 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20 54 69  * really 1.   Ti
1f090 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f  cket #3260..  */
1f0a0 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31  .  if( *pSize==1
1f0b0 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a   ) *pSize = 0;..
1f0c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1f0d0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
1f0e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1f0f0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1f100 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
1f110 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f 72 20  .** Handler for 
1f120 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69  proxy-locking fi
1f130 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73  le-control verbs
1f140 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c 6f 77  .  Defined below
1f150 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79   in the.** proxy
1f160 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69  ing locking divi
1f170 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sion..*/.static 
1f180 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e  int proxyFileCon
1f190 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1f1a0 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23  e*,int,void*);.#
1f1b0 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  endif../* .** Th
1f1c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1f1d0 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c 65 20  alled to handle 
1f1e0 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
1f1f0 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66  _SIZE_HINT .** f
1f200 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72  ile-control oper
1f210 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20  ation.  Enlarge 
1f220 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
1f230 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a  nBytes in size.*
1f240 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  * (rounded up to
1f250 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d   the next chunk-
1f260 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65 20 64  size).  If the d
1f270 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1f280 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20  dy.** nBytes or 
1f290 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72 6f 75  larger, this rou
1f2a0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
1f2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1f2c0 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69  cntlSizeHint(uni
1f2d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36  xFile *pFile, i6
1f2e0 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66 28 20  4 nByte){.  if( 
1f2f0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1f300 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53 69 7a   ){.    i64 nSiz
1f310 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1f320 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65        /* Require
1f330 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20  d file size */. 
1f340 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62     struct stat b
1f350 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1f360 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f 6c 64   /* Used to hold
1f370 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 6f   return values o
1f380 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 20  f fstat() */.   
1f390 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
1f3a0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29  (pFile->h, &buf)
1f3b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1f3c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
1f3d0 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  TAT;.    }..    
1f3e0 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
1f3f0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
1f400 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
1f410 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
1f420 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
1f430 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
1f440 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
1f450 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
1f460 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
1f470 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
1f480 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
1f490 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
1f4a0 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
1f4b0 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
1f4c0 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
1f4d0 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
1f4e0 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
1f4f0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
1f500 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
1f510 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
1f520 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
1f530 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
1f540 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
1f550 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
1f560 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
1f570 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
1f580 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
1f590 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
1f5a0 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
1f5b0 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
1f5c0 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
1f5d0 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
1f5e0 20 20 20 69 66 28 20 65 72 72 20 26 26 20 65 72     if( err && er
1f5f0 72 21 3d 45 49 4e 56 41 4c 20 29 20 72 65 74 75  r!=EINVAL ) retu
1f600 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1f610 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20  WRITE;.#else.   
1f620 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20     /* If the OS 
1f630 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f  does not have po
1f640 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c  six_fallocate(),
1f650 20 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20   fake it. Write 
1f660 61 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67  a .      ** sing
1f670 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c  le byte to the l
1f680 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68  ast byte in each
1f690 20 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c   block that fall
1f6a0 73 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20  s entirely.     
1f6b0 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65   ** within the e
1f6c0 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20  xtended region. 
1f6d0 54 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65  Then, if require
1f6e0 64 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  d, a single byte
1f6f0 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66  .      ** at off
1f700 73 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74  set (nSize-1), t
1f710 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
1f720 66 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65  f the file corre
1f730 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54  ctly..      ** T
1f740 68 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72  his is a similar
1f750 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68   technique to th
1f760 61 74 20 75 73 65 64 20 62 79 20 67 6c 69 62 63  at used by glibc
1f770 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20   on systems.    
1f780 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74    ** that do not
1f790 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c   have a real fal
1f7a0 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20  locate() call.. 
1f7b0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
1f7c0 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f  t nBlk = buf.st_
1f7d0 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c  blksize;  /* Fil
1f7e0 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73  e-system block s
1f7f0 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ize */.      int
1f800 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20   nWrite = 0;    
1f810 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1f820 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74  er of bytes writ
1f830 74 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72  ten by seekAndWr
1f840 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  ite */.      i64
1f850 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20   iWrite;        
1f860 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
1f870 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65   offset to write
1f880 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57   to */..      iW
1f890 72 69 74 65 20 3d 20 28 62 75 66 2e 73 74 5f 73  rite = (buf.st_s
1f8a0 69 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b  ize/nBlk)*nBlk +
1f8b0 20 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20   nBlk - 1;.     
1f8c0 20 61 73 73 65 72 74 28 20 69 57 72 69 74 65 3e   assert( iWrite>
1f8d0 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a  =buf.st_size );.
1f8e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28        assert( ((
1f8f0 69 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d  iWrite+1)%nBlk)=
1f900 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  =0 );.      for(
1f910 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74  /*no-op*/; iWrit
1f920 65 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20  e<nSize+nBlk-1; 
1f930 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a  iWrite+=nBlk ){.
1f940 20 20 20 20 20 20 20 20 69 66 28 20 69 57 72 69          if( iWri
1f950 74 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57 72 69  te>=nSize ) iWri
1f960 74 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a  te = nSize - 1;.
1f970 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d          nWrite =
1f980 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46   seekAndWrite(pF
1f990 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c  ile, iWrite, "",
1f9a0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
1f9b0 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74   nWrite!=1 ) ret
1f9c0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1f9d0 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  _WRITE;.      }.
1f9e0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
1f9f0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1fa00 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
1fa10 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
1fa20 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65  zeMax>0 && nByte
1fa30 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  >pFile->mmapSize
1fa40 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
1fa50 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
1fa60 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20  zChunk<=0 ){.   
1fa70 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
1fa80 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
1fa90 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
1faa0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1fab0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
1fac0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1fad0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1fae0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
1faf0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
1fb00 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
1fb10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1fb20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70      rc = unixMap
1fb30 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  file(pFile, nByt
1fb40 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
1fb50 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
1fb60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fb70 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a  K;.}../*.** If *
1fb80 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c  pArg is initiall
1fb90 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
1fba0 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
1fbb0 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
1fbc0 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
1fbd0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
1fbe0 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
1fbf0 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1fc00 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
1fc10 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
1fc20 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
1fc30 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
1fc40 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
1fc50 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
1fc60 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42  c void unixModeB
1fc70 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  it(unixFile *pFi
1fc80 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
1fc90 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
1fca0 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
1fcb0 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
1fcc0 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
1fcd0 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
1fce0 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
1fcf0 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
1fd00 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
1fd10 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
1fd20 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1fd30 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
1fd40 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64   }.}../* Forward
1fd50 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
1fd60 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
1fd70 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
1fd80 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
1fd90 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  ;../*.** Informa
1fda0 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  tion and control
1fdb0 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65   of an open file
1fdc0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
1fdd0 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43  ic int unixFileC
1fde0 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1fdf0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
1fe00 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
1fe10 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1fe20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1fe30 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
1fe40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c  .#if defined(__l
1fe50 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e  inux__) && defin
1fe60 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1fe70 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
1fe80 49 54 45 29 0a 20 20 20 20 63 61 73 65 20 53 51  ITE).    case SQ
1fe90 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e  LITE_FCNTL_BEGIN
1fea0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b  _ATOMIC_WRITE: {
1feb0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1fec0 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68  osIoctl(pFile->h
1fed0 2c 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54  , F2FS_IOC_START
1fee0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a  _ATOMIC_WRITE);.
1fef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20        return rc 
1ff00 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ? SQLITE_IOERR_B
1ff10 45 47 49 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51  EGIN_ATOMIC : SQ
1ff20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ff30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ff40 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  CNTL_COMMIT_ATOM
1ff50 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  IC_WRITE: {.    
1ff60 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63    int rc = osIoc
1ff70 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46  tl(pFile->h, F2F
1ff80 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f  S_IOC_COMMIT_ATO
1ff90 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20  MIC_WRITE);.    
1ffa0 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51    return rc ? SQ
1ffb0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49  LITE_IOERR_COMMI
1ffc0 54 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54  T_ATOMIC : SQLIT
1ffd0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1ffe0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1fff0 4c 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49  L_ROLLBACK_ATOMI
20000 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
20010 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
20020 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
20030 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54  _IOC_ABORT_VOLAT
20040 49 4c 45 5f 57 52 49 54 45 29 3b 0a 20 20 20 20  ILE_WRITE);.    
20050 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51    return rc ? SQ
20060 4c 49 54 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42  LITE_IOERR_ROLLB
20070 41 43 4b 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c  ACK_ATOMIC : SQL
20080 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
20090 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f  ndif /* __linux_
200a0 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  _ && SQLITE_ENAB
200b0 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
200c0 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61  WRITE */..    ca
200d0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
200e0 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
200f0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
20100 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
20110 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
20120 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
20130 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
20140 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e  _FCNTL_LAST_ERRN
20150 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
20160 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
20170 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
20180 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20190 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
201a0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
201b0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
201c0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
201d0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
201e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
201f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
20200 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20210 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
20220 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
20230 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
20240 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
20250 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
20260 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
20270 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
20280 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
20290 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
202a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
202b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
202c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
202d0 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
202e0 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
202f0 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45  ile, UNIXFILE_PE
20300 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
20310 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
20320 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20330 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
20340 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
20350 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
20360 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
20370 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
20380 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
20390 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
203a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
203b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
203c0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
203d0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
203e0 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
203f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
20400 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
20410 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
20420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20430 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
20440 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
20450 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
20460 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
20470 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
20480 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  4( pFile->pVfs->
20490 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
204a0 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
204b0 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65  {.        unixGe
204c0 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
204d0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
204e0 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  e, zTFile);.    
204f0 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
20500 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
20510 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
20520 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
20530 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
20540 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
20550 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  D: {.      *(int
20560 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73  *)pArg = fileHas
20570 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20  Moved(pFile);.  
20580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20590 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  E_OK;.    }.#ifd
205a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
205b0 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20  _SETLK_TIMEOUT. 
205c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
205d0 43 4e 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55  CNTL_LOCK_TIMEOU
205e0 54 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  T: {.      pFile
205f0 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 20 3d  ->iBusyTimeout =
20600 20 2a 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20   *(int*)pArg;.  
20610 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20620 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
20630 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
20640 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
20650 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
20660 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b  NTL_MMAP_SIZE: {
20670 0a 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69  .      i64 newLi
20680 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72  mit = *(i64*)pAr
20690 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  g;.      int rc 
206a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
206b0 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e     if( newLimit>
206c0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
206d0 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20  fig.mxMmap ){.  
206e0 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d        newLimit =
206f0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
20700 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20  nfig.mxMmap;.   
20710 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54     }..      /* T
20720 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 65 77 4c  he value of newL
20730 69 6d 69 74 20 6d 61 79 20 62 65 20 65 76 65 6e  imit may be even
20740 74 75 61 6c 6c 79 20 63 61 73 74 20 74 6f 20 28  tually cast to (
20750 73 69 7a 65 5f 74 29 20 61 6e 64 20 70 61 73 73  size_t) and pass
20760 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  ed.      ** to m
20770 6d 61 70 28 29 2e 20 52 65 73 74 72 69 63 74 20  map(). Restrict 
20780 69 74 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42  its value to 2GB
20790 20 69 66 20 28 73 69 7a 65 5f 74 29 20 69 73 20   if (size_t) is 
207a0 6e 6f 74 20 61 74 20 6c 65 61 73 74 20 61 0a 20  not at least a. 
207b0 20 20 20 20 20 2a 2a 20 36 34 2d 62 69 74 20 74       ** 64-bit t
207c0 79 70 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  ype. */.      if
207d0 28 20 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20  ( newLimit>0 && 
207e0 73 69 7a 65 6f 66 28 73 69 7a 65 5f 74 29 3c 38  sizeof(size_t)<8
207f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
20800 69 6d 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74  imit = (newLimit
20810 20 26 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a   & 0x7FFFFFFF);.
20820 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a        }..      *
20830 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69  (i64*)pArg = pFi
20840 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  le->mmapSizeMax;
20850 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
20860 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d  mit>=0 && newLim
20870 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  it!=pFile->mmapS
20880 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d  izeMax && pFile-
20890 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b  >nFetchOut==0 ){
208a0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
208b0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65  mmapSizeMax = ne
208c0 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  wLimit;.        
208d0 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
208e0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
208f0 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
20900 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
20910 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
20920 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a  ile(pFile, -1);.
20930 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20940 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
20950 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
20960 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20970 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
20980 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
20990 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
209a0 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
209b0 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
209c0 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
209d0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
209e0 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
209f0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
20a00 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
20a10 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
20a20 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
20a30 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
20a40 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
20a50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20a60 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
20a70 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
20a80 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
20a90 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
20aa0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20ab0 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
20ac0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
20ad0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
20ae0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
20af0 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
20b00 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
20b10 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
20b20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
20b30 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_GET_LOCKPRO
20b40 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
20b50 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
20b60 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
20b70 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
20b80 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
20b90 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20ba0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
20bb0 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20  PLE__) */.  }.  
20bc0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
20bd0 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TFOUND;.}../*.**
20be0 20 49 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53   If pFd->sectorS
20bf0 69 7a 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  ize is non-zero 
20c00 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
20c10 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
20c20 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20   is a.** no-op. 
20c30 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 76  Otherwise, the v
20c40 61 6c 75 65 73 20 6f 66 20 70 46 64 2d 3e 73 65  alues of pFd->se
20c50 63 74 6f 72 53 69 7a 65 20 61 6e 64 20 0a 2a 2a  ctorSize and .**
20c60 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
20c70 61 63 74 65 72 69 73 74 69 63 73 20 61 72 65 20  acteristics are 
20c80 73 65 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  set according to
20c90 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
20ca0 20 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73   .** characteris
20cb0 74 69 63 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  tics. .**.** The
20cc0 72 65 20 61 72 65 20 74 77 6f 20 76 65 72 73 69  re are two versi
20cd0 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ons of this func
20ce0 74 69 6f 6e 2e 20 4f 6e 65 20 66 6f 72 20 51 4e  tion. One for QN
20cf0 58 20 61 6e 64 20 6f 6e 65 20 66 6f 72 20 61 6c  X and one for al
20d00 6c 0a 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65  l.** other syste
20d10 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f  ms..*/.#ifndef _
20d20 5f 51 4e 58 4e 54 4f 5f 5f 0a 73 74 61 74 69 63  _QNXNTO__.static
20d30 20 76 6f 69 64 20 73 65 74 44 65 76 69 63 65 43   void setDeviceC
20d40 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 75  haracteristics(u
20d50 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
20d60 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 64 65   assert( pFd->de
20d70 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20d80 69 63 73 3d 3d 30 20 7c 7c 20 70 46 64 2d 3e 73  ics==0 || pFd->s
20d90 65 63 74 6f 72 53 69 7a 65 21 3d 30 20 29 3b 0a  ectorSize!=0 );.
20da0 20 20 69 66 28 20 70 46 64 2d 3e 73 65 63 74 6f    if( pFd->secto
20db0 72 53 69 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 20  rSize==0 ){.#if 
20dc0 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
20dd0 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  _) && defined(SQ
20de0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
20df0 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a  H_ATOMIC_WRITE).
20e00 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
20e10 20 75 33 32 20 66 20 3d 20 30 3b 0a 0a 20 20 20   u32 f = 0;..   
20e20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 73 75   /* Check for su
20e30 70 70 6f 72 74 20 66 6f 72 20 46 32 46 53 20 61  pport for F2FS a
20e40 74 6f 6d 69 63 20 62 61 74 63 68 20 77 72 69 74  tomic batch writ
20e50 65 73 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  es. */.    res =
20e60 20 6f 73 49 6f 63 74 6c 28 70 46 64 2d 3e 68 2c   osIoctl(pFd->h,
20e70 20 46 32 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45   F2FS_IOC_GET_FE
20e80 41 54 55 52 45 53 2c 20 26 66 29 3b 0a 20 20 20  ATURES, &f);.   
20e90 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28   if( res==0 && (
20ea0 66 20 26 20 46 32 46 53 5f 46 45 41 54 55 52 45  f & F2FS_FEATURE
20eb0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 29  _ATOMIC_WRITE) )
20ec0 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76  {.      pFd->dev
20ed0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
20ee0 63 73 20 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  cs = SQLITE_IOCA
20ef0 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 3b 0a  P_BATCH_ATOMIC;.
20f00 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
20f10 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c  __linux__ && SQL
20f20 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
20f30 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f  _ATOMIC_WRITE */
20f40 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
20f50 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
20f60 52 49 54 45 20 66 6c 61 67 20 69 66 20 72 65 71  RITE flag if req
20f70 75 65 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69  uested. */.    i
20f80 66 28 20 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67  f( pFd->ctrlFlag
20f90 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  s & UNIXFILE_PSO
20fa0 57 20 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e  W ){.      pFd->
20fb0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20fc0 73 74 69 63 73 20 7c 3d 20 53 51 4c 49 54 45 5f  stics |= SQLITE_
20fd0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
20fe0 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 20 20 7d  OVERWRITE;.    }
20ff0 0a 0a 20 20 20 20 70 46 64 2d 3e 73 65 63 74 6f  ..    pFd->secto
21000 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
21010 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
21020 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a  ZE;.  }.}.#else.
21030 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63  #include <sys/dc
21040 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75  md_blk.h>.#inclu
21050 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e  de <sys/statvfs.
21060 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  h>.static void s
21070 65 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  etDeviceCharacte
21080 72 69 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65  ristics(unixFile
21090 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 66 28 20   *pFile){.  if( 
210a0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
210b0 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74  e == 0 ){.    st
210c0 72 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49  ruct statvfs fsI
210d0 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20  nfo;.       .   
210e0 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73   /* Set defaults
210f0 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74   for non-support
21100 65 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a  ed filesystems *
21110 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  /.    pFile->sec
21120 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
21130 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
21140 53 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d  SIZE;.    pFile-
21150 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
21160 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20  istics = 0;.    
21170 69 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69  if( fstatvfs(pFi
21180 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20  le->h, &fsInfo) 
21190 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20  == -1 ) {.      
211a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20  return;.    }.. 
211b0 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28 66     if( !strcmp(f
211c0 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
211d0 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20  , "tmp") ) {.   
211e0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
211f0 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f  Size = fsInfo.f_
21200 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69  bsize;.      pFi
21210 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
21220 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20  teristics =.    
21230 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
21240 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20  _ATOMIC4K |     
21250 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c    /* All ram fil
21260 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20 61  esystem writes a
21270 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
21280 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
21290 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20  P_SAFE_APPEND | 
212a0 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68     /* growing th
212b0 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  e file does not 
212c0 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20  occur until.    
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212f0 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73    ** the write s
21300 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20  ucceeds */.     
21310 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
21320 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
21330 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
21340 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
21350 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
21360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21380 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
21390 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
213a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
213b0 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
213c0 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66 73  _basetype, "etfs
213d0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
213e0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
213f0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
21400 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
21410 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21420 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
21430 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a  etfs cluster siz
21440 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  e writes are ato
21450 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  mic */.        (
21460 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
21470 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
21480 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
21490 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49  ) |.        SQLI
214a0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
214b0 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
214c0 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
214d0 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
214e0 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21500 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
21510 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
21520 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
21530 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
21540 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
21550 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
21560 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
21570 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
21580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21590 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
215a0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
215b0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
215c0 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
215d0 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
215e0 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20  e, "qnx6") ){.  
215f0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
21600 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
21610 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
21620 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
21630 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
21640 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
21650 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20  P_ATOMIC |      
21660 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79     /* All filesy
21670 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
21680 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
21690 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
216a0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
216b0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
216c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
216d0 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
216e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
216f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
21700 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
21710 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
21720 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
21730 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
21740 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
21750 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
21760 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
21770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
21790 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
217a0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
217b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
217c0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
217d0 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29  asetype, "qnx4")
217e0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
217f0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
21800 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
21810 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
21820 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21830 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75   =.        /* fu
21840 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f  ll bitset of ato
21850 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65  mics from max se
21860 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d  ctor size and sm
21870 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20  aller */.       
21880 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72   ((pFile->sector
21890 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c  Size / 512 * SQL
218a0 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
218b0 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c  512) << 1) - 2 |
218c0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
218d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
218e0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
218f0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
21900 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
21910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
21920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21930 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
21940 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
21950 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
21960 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
21970 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
21980 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20   "dos") ){.     
21990 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
219a0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
219b0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
219c0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
219d0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
219e0 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74    /* full bitset
219f0 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d   of atomics from
21a00 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65   max sector size
21a10 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a   and smaller */.
21a20 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
21a30 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
21a40 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
21a50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31  _ATOMIC512) << 1
21a60 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20  ) - 2 |.        
21a70 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
21a80 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
21a90 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
21aa0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
21ab0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
21ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
21ae0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
21af0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
21b00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
21b10 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
21b20 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
21b30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
21b40 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c  OCAP_ATOMIC512 |
21b50 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20        /* blocks 
21b60 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
21b70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
21b80 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
21b90 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
21ba0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
21bb0 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21be0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
21bf0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
21c00 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d      0;.    }.  }
21c10 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63  .  /* Last chanc
21c20 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20  e verification. 
21c30 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20 73   If the sector s
21c40 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74  ize isn't a mult
21c50 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a  iple of 512.  **
21c60 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76   then it isn't v
21c70 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46  alid.*/.  if( pF
21c80 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
21c90 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20  % 512 != 0 ){.  
21ca0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
21cb0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
21cc0 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73   0;.    pFile->s
21cd0 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49  ectorSize = SQLI
21ce0 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
21cf0 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65  R_SIZE;.  }.}.#e
21d00 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
21d10 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
21d20 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
21d30 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
21d40 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
21d50 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
21d60 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
21d70 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
21d80 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
21d90 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
21da0 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
21db0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
21dc0 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
21dd0 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
21de0 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
21df0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
21e00 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
21e10 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
21e20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
21e30 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
21e40 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
21e50 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
21e60 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
21e70 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
21e80 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
21e90 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  h..*/.static int
21ea0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
21eb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
21ec0 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
21ed0 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
21ee0 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43  id;.  setDeviceC
21ef0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
21f00 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  Fd);.  return pF
21f10 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d  d->sectorSize;.}
21f20 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21f30 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
21f40 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
21f50 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
21f60 69 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70  is VFS is set up
21f70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54   to return SQLIT
21f80 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46  E_IOCAP_POWERSAF
21f90 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64  E_OVERWRITE by d
21fa0 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76  efault..** Howev
21fb0 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20  er, that choice 
21fc0 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c  is controversial
21fd0 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c   since technical
21fe0 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  ly the underlyin
21ff0 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d  g.** file system
22000 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73   does not always
22010 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61   provide powersa
22020 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20  fe overwrites.  
22030 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72  (In other.** wor
22040 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65  ds, after a powe
22050 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61  r-loss event, pa
22060 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20  rts of the file 
22070 74 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a  that were never.
22080 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74  ** written might
22090 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c   end up being al
220a0 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72  tered.)  However
220b0 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76  , non-PSOW behav
220c0 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20  ior is very,.** 
220d0 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20  very rare.  And 
220e0 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d  asserting PSOW m
220f0 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64  akes a large red
22100 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d  uction in the am
22110 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69  ount.** of requi
22120 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72  red I/O for jour
22130 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20  naling, since a 
22140 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69  lot of padding i
22150 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a  s eliminated..**
22160 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50    Hence, while P
22170 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
22180 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61  TE is on by defa
22190 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20  ult, there is a 
221a0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20  file-control.** 
221b0 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
221c0 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49  n it off and URI
221d0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
221e0 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75   available to tu
221f0 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74  rn it off..*/.st
22200 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76  atic int unixDev
22210 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
22220 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  cs(sqlite3_file 
22230 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
22240 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
22250 65 2a 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69  e*)id;.  setDevi
22260 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
22270 73 28 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e  s(pFd);.  return
22280 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72   pFd->deviceChar
22290 61 63 74 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a  acteristics;.}..
222a0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
222b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
222c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
222d0 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52  _SIZE>0../*.** R
222e0 65 74 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d  eturn the system
222f0 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a   page size..**.*
22300 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22310 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61  should not be ca
22320 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62 79  lled directly by
22330 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74   other code in t
22340 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e  his file. .** In
22350 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64  stead, it should
22360 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d   be called via m
22370 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69  acro osGetpagesi
22380 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ze()..*/.static 
22390 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73  int unixGetpages
223a0 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f  ize(void){.#if O
223b0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
223c0 72 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64  rn 1024;.#elif d
223d0 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52  efined(_BSD_SOUR
223e0 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74  CE).  return get
223f0 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73  pagesize();.#els
22400 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  e.  return (int)
22410 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45  sysconf(_SC_PAGE
22420 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  SIZE);.#endif.}.
22430 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
22440 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
22450 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
22460 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
22470 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
22480 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a  E_OMIT_WAL../*.*
22490 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  * Object used to
224a0 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68   represent an sh
224b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66  ared memory buff
224c0 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  er.  .**.** When
224d0 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
224e0 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20  s all reference 
224f0 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64  the same wal-ind
22500 65 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a  ex, each thread.
22510 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75  ** has its own u
22520 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62  nixShm object, b
22530 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e  ut they all poin
22540 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e  t to a single in
22550 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69  stance.** of thi
22560 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  s unixShmNode ob
22570 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20  ject.  In other 
22580 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d  words, each wal-
22590 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a  index is opened.
225a0 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72  ** only once per
225b0 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
225c0 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Each unixShmNode
225d0 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65   object is conne
225e0 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65  cted to a single
225f0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
22600 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75  bject..** We cou
22610 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73  ld coalesce this
22620 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69   object into uni
22630 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20  xInodeInfo, but 
22640 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a  that would mean.
22650 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69  ** every open fi
22660 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
22670 20 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   use shared memo
22680 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  ry (in other wor
22690 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e  ds, most.** open
226a0 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61   files) would ha
226b0 76 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75  ve to carry arou
226c0 6e 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e  nd this extra in
226d0 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a  formation.  So.*
226e0 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * the unixInodeI
226f0 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61  nfo object conta
22700 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ins a pointer to
22710 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64   this unixShmNod
22720 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20  e object.** and 
22730 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
22740 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
22750 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64  d only when need
22760 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75  ed..**.** unixMu
22770 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62  texHeld() must b
22780 65 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61  e true when crea
22790 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69  ting or destroyi
227a0 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63  ng.** this objec
227b0 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69  t or while readi
227c0 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
227d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
227e0 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e  ds:.**.**      n
227f0 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  Ref.**.** The fo
22800 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
22810 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74  re read-only aft
22820 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73  er the object is
22830 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a   created:.** .**
22840 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20        fid.**    
22850 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a    zFilename.**.*
22860 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d  * Either unixShm
22870 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20  Node.mutex must 
22880 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53  be held or unixS
22890 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61  hmNode.nRef==0 a
228a0 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48  nd.** unixMutexH
228b0 65 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68  eld() is true wh
228c0 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  en reading or wr
228d0 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20  iting any other 
228e0 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73  field.** in this
228f0 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73   structure..*/.s
22900 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64  truct unixShmNod
22910 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e {.  unixInodeI
22920 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
22930 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66   /* unixInodeInf
22940 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73  o that owns this
22950 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73   SHM node */.  s
22960 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
22970 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74  tex;      /* Mut
22980 65 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69  ex to access thi
22990 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68  s object */.  ch
229a0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
229b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
229c0 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20   of the mmapped 
229d0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  file */.  int h;
229e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229f0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c       /* Open fil
22a00 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
22a10 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20    int szRegion; 
22a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22a30 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d  Size of shared-m
22a40 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f  emory regions */
22a50 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20  .  u16 nRegion; 
22a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22a70 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61   Size of array a
22a80 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  pRegion */.  u8 
22a90 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20  isReadonly;     
22aa0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22ab0 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  if read-only */.
22ac0 20 20 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b    u8 isUnlocked;
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22ae0 54 72 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c  True if no DMS l
22af0 6f 63 6b 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68  ock held */.  ch
22b00 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20  ar **apRegion;  
22b10 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
22b20 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72  y of mapped shar
22b30 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
22b40 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  s */.  int nRef;
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22b60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75    /* Number of u
22b70 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70  nixShm objects p
22b80 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20  ointing to this 
22b90 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46  */.  unixShm *pF
22ba0 69 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  irst;           
22bb0 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f  /* All unixShm o
22bc0 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20  bjects pointing 
22bd0 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65  to this */.#ifde
22be0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
22bf0 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20   u8 exclMask;   
22c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22c10 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65  ask of exclusive
22c20 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
22c30 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20   u8 sharedMask; 
22c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
22c50 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f  ask of shared lo
22c60 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
22c70 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20   nextShmId;     
22c80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
22c90 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53   available unixS
22ca0 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23  hm.id value */.#
22cb0 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
22cc0 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
22cd0 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
22ce0 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
22cf0 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
22d00 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
22d10 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
22d20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
22d30 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
22d40 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65   initialized whe
22d50 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  n this object is
22d60 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20   created and.** 
22d70 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68  are read-only th
22d80 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20  ereafter:.**.** 
22d90 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65     unixShm.pFile
22da0 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69  .**    unixShm.i
22db0 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65  d.**.** All othe
22dc0 72 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61  r fields are rea
22dd0 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e  d/write.  The un
22de0 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74  ixShm.pFile->mut
22df0 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  ex must be held.
22e00 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  ** while accessi
22e10 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74  ng any read/writ
22e20 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72  e fields..*/.str
22e30 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20  uct unixShm {.  
22e40 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
22e50 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68  mNode;     /* Th
22e60 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69  e underlying uni
22e70 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
22e80 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e  */.  unixShm *pN
22e90 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
22ea0 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20  /* Next unixShm 
22eb0 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e  with the same un
22ec0 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75  ixShmNode */.  u
22ed0 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20  8 hasMutex;     
22ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22ef0 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65  e if holding the
22f00 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74   unixShmNode mut
22f10 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20  ex */.  u8 id;  
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
22f40 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
22f50 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f  in its unixShmNo
22f60 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72  de */.  u16 shar
22f70 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  edMask;         
22f80 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
22f90 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
22fa0 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73  */.  u16 exclMas
22fb0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
22fc0 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75  /* Mask of exclu
22fd0 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20  sive locks held 
22fe0 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  */.};../*.** Con
22ff0 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20  stants used for 
23000 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69  locking.*/.#defi
23010 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  ne UNIX_SHM_BASE
23020 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53     ((22+SQLITE_S
23030 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20  HM_NLOCK)*4)    
23040 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f       /* first lo
23050 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69  ck byte */.#defi
23060 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20  ne UNIX_SHM_DMS 
23070 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53     (UNIX_SHM_BAS
23080 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  E+SQLITE_SHM_NLO
23090 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20  CK)  /* deadman 
230a0 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  switch */../*.**
230b0 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76   Apply posix adv
230c0 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20  isory locks for 
230d0 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f  all bytes from o
230e0 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74  fst through ofst
230f0 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  +n-1..**.** Lock
23100 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
23110 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
23120 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
23130 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
23140 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
23150 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
23160 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
23170 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
23180 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
23190 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
231a0 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69   WAL file */.  i
231b0 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20  nt lockType,    
231c0 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b        /* F_UNLCK
231d0 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f  , F_RDLCK, or F_
231e0 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f  WRLCK */.  int o
231f0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
23200 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
23210 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  of the locking r
23220 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20  ange */.  int n 
23230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23240 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
23250 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29  tes to lock */.)
23260 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
23270 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70  *pShmNode; /* Ap
23280 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69  ply locks to thi
23290 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65  s open shared-me
232a0 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  mory segment */.
232b0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66    struct flock f
232c0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
232d0 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c  posix advisory l
232e0 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
232f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
23300 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20  QLITE_OK;    /* 
23310 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d  Result code form
23320 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f   fcntl() */..  /
23330 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
23340 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
23350 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
23360 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
23370 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  /.  pShmNode = p
23380 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
23390 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  hmNode;.  assert
233a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
233b0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
233c0 75 74 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f  utex_held(pShmNo
233d0 64 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  de->mutex) );.. 
233e0 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73   /* Shared locks
233f0 20 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65   never span more
23400 20 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a   than one byte *
23410 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31  /.  assert( n==1
23420 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f   || lockType!=F_
23430 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c  RDLCK );..  /* L
23440 6f 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20  ocks are within 
23450 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72  range */.  asser
23460 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51  t( n>=1 && n<=SQ
23470 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
23480 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  ;..  if( pShmNod
23490 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f  e->h>=0 ){.    /
234a0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
234b0 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74   locking paramet
234c0 65 72 73 20 2a 2f 0a 20 20 20 20 66 2e 6c 5f 74  ers */.    f.l_t
234d0 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
234e0 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
234f0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
23500 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
23510 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
23520 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74  ;.    rc = osSet
23530 50 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63  PosixAdvisoryLoc
23540 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  k(pShmNode->h, &
23550 66 2c 20 70 46 69 6c 65 29 3b 0a 20 20 20 20 72  f, pFile);.    r
23560 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
23570 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
23580 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
23590 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
235a0 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
235b0 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
235c0 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
235d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
235e0 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
235f0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
23600 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66  "));.  mask = of
23610 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a  st>31 ? 0xffff :
23620 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
23630 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
23640 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23650 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
23660 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
23670 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
23680 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
23690 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
236a0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
236b0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
236c0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
236d0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
236e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
236f0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
23700 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
23710 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
23720 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
23730 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
23740 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
23750 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
23760 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
23770 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
23780 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
23790 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
237a0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
237b0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
237c0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
237d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
237e0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
237f0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
23800 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
23810 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
23820 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
23830 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
23840 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
23850 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
23860 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
23870 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
23880 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
23890 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
238a0 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
238b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
238c0 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
238d0 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
238e0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
238f0 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
23900 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
23910 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
23920 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
23930 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
23940 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
23950 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
23960 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
23970 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
23980 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
23990 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a          .}../*.*
239a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e  * Return the min
239b0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33  imum number of 3
239c0 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20  2KB shm regions 
239d0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  that should be m
239e0 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69  apped at.** a ti
239f0 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  me, assuming tha
23a00 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  t each mapping m
23a10 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
23a20 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
23a30 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73  e.** current sys
23a40 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a  tem page-size..*
23a50 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
23a60 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63  is is 1. The exc
23a70 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20  eption seems to 
23a80 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  be systems that 
23a90 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  are configured.*
23aa0 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61  * to use 64KB pa
23ab0 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61  ges - in this ca
23ac0 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  se each mapping 
23ad0 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65  must cover at le
23ae0 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72  ast two.** shm r
23af0 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  egions..*/.stati
23b00 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67  c int unixShmReg
23b10 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b  ionPerMap(void){
23b20 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33  .  int shmsz = 3
23b30 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20  2*1024;         
23b40 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e     /* SHM region
23b50 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70   size */.  int p
23b60 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73  gsz = osGetpages
23b70 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74  ize();   /* Syst
23b80 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  em page size */.
23b90 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a    assert( ((pgsz
23ba0 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20  -1)&pgsz)==0 ); 
23bb0 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d    /* Page size m
23bc0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
23bd0 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73  f 2 */.  if( pgs
23be0 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e  z<shmsz ) return
23bf0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73   1;.  return pgs
23c00 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  z/shmsz;.}../*.*
23c10 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
23c20 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
23c30 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
23c40 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
23c50 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
23c60 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
23c70 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
23c80 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
23c90 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
23ca0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
23cb0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
23cc0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
23cd0 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
23ce0 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
23cf0 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
23d00 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
23d10 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
23d20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
23d30 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
23d40 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d  ( p && ALWAYS(p-
23d50 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20  >nRef==0) ){.   
23d60 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
23d70 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
23d80 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74  erMap();.    int
23d90 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
23da0 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
23db0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
23dc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
23dd0 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
23de0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
23df0 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
23e00 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
23e10 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
23e20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
23e30 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
23e40 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
23e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23e60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23e70 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
23e80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
23e90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23ea0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
23eb0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
23ec0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
23ed0 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
23ee0 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
23ef0 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
23f00 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
23f10 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
23f20 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
23f30 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
23f40 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e 6f   DMS lock has no
23f50 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b 65 6e  t yet been taken
23f60 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70 53 68   on shm file pSh
23f70 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74 20 74  mNode. Attempt t
23f80 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f 77  o.** take it now
23f90 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
23fa0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
23fb0 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
23fc0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
23fd0 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
23fe0 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74 20   the DMS cannot 
23ff0 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  be locked becaus
24000 65 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  e this is a read
24010 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63  only_shm=1 .** c
24020 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f  onnection and no
24030 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
24040 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c  lready holds a l
24050 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ock, return.** S
24060 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
24070 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20  ANTINIT and set 
24080 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
24090 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  cked=1..*/.stati
240a0 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 68  c int unixLockSh
240b0 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
240c0 69 6c 65 20 2a 70 44 62 46 64 2c 20 75 6e 69 78  ile *pDbFd, unix
240d0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
240e0 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  e){.  struct flo
240f0 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
24100 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
24110 20 20 2f 2a 20 55 73 65 20 46 5f 47 45 54 4c 4b    /* Use F_GETLK
24120 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
24130 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72 20 70 72  e locks other pr
24140 6f 63 65 73 73 65 73 20 61 72 65 20 68 6f 6c 64  ocesses are hold
24150 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ing.  ** on the 
24160 44 4d 53 20 62 79 74 65 2e 20 49 66 20 69 74 20  DMS byte. If it 
24170 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 61  indicates that a
24180 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
24190 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 61  s holding.  ** a
241a0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
241b0 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  en this process 
241c0 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65 20 61 20  may also take a 
241d0 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
241e0 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74   and proceed wit
241f0 68 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d  h opening the *-
24200 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a  shm file. .  **.
24210 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 6f    ** Or, if no o
24220 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
24230 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f 63 6b  holding any lock
24240 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63  , then this proc
24250 65 73 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  ess.  ** is the 
24260 66 69 72 73 74 20 74 6f 20 6f 70 65 6e 20 69 74  first to open it
24270 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
24280 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ake an EXCLUSIVE
24290 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
242a0 2a 20 44 4d 53 20 62 79 74 65 20 61 6e 64 20 74  * DMS byte and t
242b0 72 75 6e 63 61 74 65 20 74 68 65 20 2a 2d 73 68  runcate the *-sh
242c0 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  m file to zero b
242d0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
242e0 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64  en.  ** downgrad
242f0 65 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  e to a SHARED lo
24300 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79  ck on the DMS by
24310 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  te..  **.  ** If
24320 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
24330 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45   is holding an E
24340 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
24350 20 74 68 65 20 44 4d 53 20 62 79 74 65 2c 0a 20   the DMS byte,. 
24360 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
24370 45 5f 42 55 53 59 20 74 6f 20 74 68 65 20 63 61  E_BUSY to the ca
24380 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c 20 74 72  ller (it will tr
24390 79 20 61 67 61 69 6e 29 2e 20 41 6e 20 65 61 72  y again). An ear
243a0 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72 73 69 6f  lier.  ** versio
243b0 6e 20 6f 66 20 74 68 69 73 20 63 6f 64 65 20 61  n of this code a
243c0 74 74 65 6d 70 74 65 64 20 74 68 65 20 53 48 41  ttempted the SHA
243d0 52 45 44 20 6c 6f 63 6b 20 61 74 20 74 68 69 73  RED lock at this
243e0 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20 20 2a 2a   point. But.  **
243f0 20 74 68 69 73 20 69 6e 74 72 6f 64 75 63 65 64   this introduced
24400 20 61 20 73 75 62 74 6c 65 20 72 61 63 65 20 63   a subtle race c
24410 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20 74 68 65  ondition: if the
24420 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 69 6e 67   process holding
24430 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20  .  ** EXCLUSIVE 
24440 66 61 69 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  failed just befo
24450 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  re truncating th
24460 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c 20 74 68  e *-shm file, th
24470 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 6f  en this.  ** pro
24480 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
24490 61 6e 64 20 75 73 65 20 74 68 65 20 2a 2d 73 68  and use the *-sh
244a0 6d 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 74  m file without t
244b0 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 20 20  runcating it..  
244c0 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 2a 2d  ** And if the *-
244d0 73 68 6d 20 66 69 6c 65 20 68 61 73 20 62 65 65  shm file has bee
244e0 6e 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 61  n corrupted by a
244f0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
24500 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72  r.  ** system cr
24510 61 73 68 2c 20 74 68 65 20 64 61 74 61 62 61 73  ash, the databas
24520 65 20 69 74 73 65 6c 66 20 6d 61 79 20 61 6c 73  e itself may als
24530 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  o become corrupt
24540 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  .  */.  lock.l_w
24550 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
24560 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74  ;.  lock.l_start
24570 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b   = UNIX_SHM_DMS;
24580 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
24590 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  1;.  lock.l_type
245a0 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 69 66   = F_WRLCK;.  if
245b0 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  ( osFcntl(pShmNo
245c0 64 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  de->h, F_GETLK, 
245d0 26 6c 6f 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20  &lock)!=0 ) {.  
245e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
245f0 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  ERR_LOCK;.  }els
24600 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
24610 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
24620 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
24630 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
24640 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
24650 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20  Unlocked = 1;.  
24660 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24670 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49  READONLY_CANTINI
24680 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
24690 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
246a0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
246b0 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
246c0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
246d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
246e0 45 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66  E_OK && robust_f
246f0 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
24700 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20  e->h, 0) ){.    
24710 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
24720 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
24730 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74 72 75  RR_SHMOPEN,"ftru
24740 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64 65 2d  ncate",pShmNode-
24750 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
24760 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
24770 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
24780 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
24790 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
247a0 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  USY;.  }..  if( 
247b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
247c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63  .    assert( loc
247d0 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  k.l_type==F_UNLC
247e0 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  K || lock.l_type
247f0 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20 20 20  ==F_RDLCK );.   
24800 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
24810 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
24820 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
24830 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  _DMS, 1);.  }.  
24840 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
24850 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65  .** Open a share
24860 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73  d-memory area as
24870 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6f 70  sociated with op
24880 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
24890 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69   pDbFd.  .** Thi
248a0 73 20 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70  s particular imp
248b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
248c0 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a   mmapped files..
248d0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75  **.** The file u
248e0 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
248f0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69   shared-memory i
24900 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  s in the same di
24910 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68  rectory.** as th
24920 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
24930 66 69 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65  file and has the
24940 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
24950 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a  e open database.
24960 2a 2a 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  ** file with the
24970 20 22 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61   "-shm" suffix a
24980 64 64 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70  dded.  For examp
24990 6c 65 2c 20 69 66 20 74 68 65 20 64 61 74 61 62  le, if the datab
249a0 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22  ase file.** is "
249b0 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66  /home/user1/conf
249c0 69 67 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20  ig.db" then the 
249d0 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 72 65  file that is cre
249e0 61 74 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64  ated and mmapped
249f0 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d  .** for shared m
24a00 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61  emory will be ca
24a10 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72  lled "/home/user
24a20 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22  1/config.db-shm"
24a30 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65  .  .**.** Anothe
24a40 72 20 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73  r approach to is
24a50 20 74 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e   to use files in
24a60 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65   /dev/shm or /de
24a70 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73  v/tmp or an.** s
24a80 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20  ome other tmpfs 
24a90 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20  mount. But if a 
24aa0 66 69 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72  file in a differ
24ab0 65 6e 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ent directory.**
24ac0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
24ad0 73 65 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c  se file is used,
24ae0 20 74 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20   then differing 
24af0 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
24b00 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f  ns.** or a chroo
24b10 74 28 29 20 6d 69 67 68 74 20 63 61 75 73 65 20  t() might cause 
24b20 74 77 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72  two different pr
24b30 6f 63 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73  ocesses on the s
24b40 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ame.** database 
24b50 74 6f 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20  to end up using 
24b60 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20  different files 
24b70 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  for shared memor
24b80 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20  y - .** meaning 
24b90 74 68 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72  that their memor
24ba0 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c  y would not real
24bb0 6c 79 20 62 65 20 73 68 61 72 65 64 20 2d 20 72  ly be shared - r
24bc0 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64  esulting.** in d
24bd0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
24be0 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73  on.  Nevertheles
24bf0 73 2c 20 74 68 69 73 20 74 6d 70 66 73 20 66 69  s, this tmpfs fi
24c00 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20  le usage.** can 
24c10 62 65 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  be enabled at co
24c20 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67  mpile-time using
24c30 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49   -DSQLITE_SHM_DI
24c40 52 45 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68  RECTORY="/dev/sh
24c50 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75  m".** or the equ
24c60 69 76 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73  ivalent.  The us
24c70 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
24c80 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
24c90 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70  mpile-time.** op
24ca0 74 69 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  tion results in 
24cb0 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
24cc0 62 75 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b  build of SQLite;
24cd0 20 20 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69    builds of SQLi
24ce0 74 65 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20  te.** that with 
24cf0 64 69 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45  differing SQLITE
24d00 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73  _SHM_DIRECTORY s
24d10 65 74 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20  ettings attempt 
24d20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61  to use the.** sa
24d30 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
24d40 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
24d50 65 2c 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  e, database corr
24d60 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65  uption will like
24d70 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68  ly.** result. Th
24d80 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
24d90 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
24da0 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f  ime option is co
24db0 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73  nsidered.** "uns
24dc0 75 70 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61  upported" and ma
24dd0 79 20 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66  y go away in a f
24de0 75 74 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c  uture SQLite rel
24df0 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ease..**.** When
24e00 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73   opening a new s
24e10 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
24e20 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69  e, if no other i
24e30 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74  nstances of that
24e40 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72  .** file are cur
24e50 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20  rently open, in 
24e60 74 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20  this process or 
24e70 69 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  in other process
24e80 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  es, then.** the 
24e90 66 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75  file must be tru
24ea0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c  ncated to zero l
24eb0 65 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74  ength or have it
24ec0 73 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64  s header cleared
24ed0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ..**.** If the o
24ee0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
24ef0 20 66 69 6c 65 20 28 70 44 62 46 64 29 20 69 73   file (pDbFd) is
24f00 20 75 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78   using the "unix
24f10 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68  -excl" VFS.** th
24f20 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  at means that an
24f30 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
24f40 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
24f50 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
24f60 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65  .** that no othe
24f70 72 20 70 72 6f 63 65 73 73 65 73 20 61 72 65 20  r processes are 
24f80 61 62 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20  able to read or 
24f90 77 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61  write the databa
24fa0 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20  se.  In.** that 
24fb0 63 61 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20  case, we do not 
24fc0 72 65 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72  really need shar
24fd0 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73  ed memory.  No s
24fe0 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20  hared memory.** 
24ff0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e  file is created.
25000 20 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d    The shared mem
25010 6f 72 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75  ory will be simu
25020 6c 61 74 65 64 20 77 69 74 68 20 68 65 61 70 20  lated with heap 
25030 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
25040 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68  c int unixOpenSh
25050 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
25060 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73  ile *pDbFd){.  s
25070 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70  truct unixShm *p
25080 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f   = 0;          /
25090 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * The connection
250a0 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f   to be opened */
250b0 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
250c0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
250d0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
250e0 79 69 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c  ying mmapped fil
250f0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
25100 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
25110 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
25120 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49   code */.  unixI
25130 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
25140 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;          /* Th
25150 65 20 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f  e inode of fd */
25160 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d 3b 20 20  .  char *zShm;  
25170 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
25180 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75  me of the file u
25190 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20  sed for SHM */. 
251a0 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d   int nShmFilenam
251b0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
251c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
251d0 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20  SHM filename in 
251e0 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41  bytes */..  /* A
251f0 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f  llocate space fo
25200 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68  r the new unixSh
25210 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70  m object. */.  p
25220 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
25230 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  c64( sizeof(*p) 
25240 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  );.  if( p==0 ) 
25250 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
25260 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 73  MEM_BKPT;.  mems
25270 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
25280 2a 70 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *p));.  assert( 
25290 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
252a0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f  ;..  /* Check to
252b0 20 73 65 65 20 69 66 20 61 20 75 6e 69 78 53 68   see if a unixSh
252c0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72  mNode object alr
252d0 65 61 64 79 20 65 78 69 73 74 73 2e 20 52 65 75  eady exists. Reu
252e0 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20  se an existing. 
252f0 20 2a 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65   ** one if prese
25300 6e 74 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77  nt. Create a new
25310 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
25320 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
25330 28 20 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e  ( unixFileMutexN
25340 6f 74 68 65 6c 64 28 70 44 62 46 64 29 20 29 3b  otheld(pDbFd) );
25350 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
25360 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
25370 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
25380 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f   pShmNode = pIno
25390 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
253a0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
253b0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
253c0 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
253d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74            /* fst
253e0 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61  at() info for da
253f0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
25400 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48  ifndef SQLITE_SH
25410 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
25420 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
25430 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a  ePath = pDbFd->z
25440 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Path;.#endif..  
25450 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28    /* Call fstat(
25460 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
25470 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
25480 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
25490 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20  file. If.    ** 
254a0 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65  a new *-shm file
254b0 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20   is created, an 
254c0 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20  attempt will be 
254d0 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69  made to create i
254e0 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  t.    ** with th
254f0 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
25500 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ns..    */.    i
25510 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64  f( osFstat(pDbFd
25520 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ->h, &sStat) ){.
25530 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25540 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
25550 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
25560 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23  en_err;.    }..#
25570 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
25580 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
25590 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
255a0 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
255b0 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b  DIRECTORY) + 31;
255c0 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
255d0 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69  ilename = 6 + (i
255e0 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50  nt)strlen(zBaseP
255f0 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ath);.#endif.   
25600 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69   pShmNode = sqli
25610 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69  te3_malloc64( si
25620 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20  zeof(*pShmNode) 
25630 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29  + nShmFilename )
25640 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ;.    if( pShmNo
25650 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
25660 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
25670 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
25680 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
25690 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74      }.    memset
256a0 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69  (pShmNode, 0, si
256b0 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b  zeof(*pShmNode)+
256c0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nShmFilename);. 
256d0 20 20 20 7a 53 68 6d 20 3d 20 70 53 68 6d 4e 6f     zShm = pShmNo
256e0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  de->zFilename = 
256f0 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65  (char*)&pShmNode
25700 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  [1];.#ifdef SQLI
25710 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
25720 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
25730 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
25740 6d 65 2c 20 7a 53 68 6d 2c 20 0a 20 20 20 20 20  me, zShm, .     
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
25770 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68  TORY "/sqlite-sh
25780 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20  m-%x-%x",.      
25790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
257a0 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f  u32)sStat.st_ino
257b0 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f  , (u32)sStat.st_
257c0 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dev);.#else.    
257d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
257e0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
257f0 53 68 6d 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a  Shm, "%s-shm", z
25800 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73  BasePath);.    s
25810 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78  qlite3FileSuffix
25820 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20  3(pDbFd->zPath, 
25830 7a 53 68 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  zShm);.#endif.  
25840 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20    pShmNode->h = 
25850 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70  -1;.    pDbFd->p
25860 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
25870 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20  = pShmNode;.    
25880 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
25890 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
258a0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
258b0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43  3GlobalConfig.bC
258c0 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  oreMutex ){.    
258d0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65    pShmNode->mute
258e0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
258f0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
25900 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20  UTEX_FAST);.    
25910 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
25920 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
25930 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25940 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
25950 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
25960 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20  n_err;.      }. 
25970 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49     }..    if( pI
25980 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
25990 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ck==0 ){.      i
259a0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 75 72  f( 0==sqlite3_ur
259b0 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d  i_boolean(pDbFd-
259c0 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c  >zPath, "readonl
259d0 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20  y_shm", 0) ){.  
259e0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
259f0 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  h = robust_open(
25a00 7a 53 68 6d 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  zShm, O_RDWR|O_C
25a10 52 45 41 54 2c 20 28 73 53 74 61 74 2e 73 74 5f  REAT, (sStat.st_
25a20 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20  mode&0777));.   
25a30 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
25a40 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a  ShmNode->h<0 ){.
25a50 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
25a60 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65  ->h = robust_ope
25a70 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59  n(zShm, O_RDONLY
25a80 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
25a90 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 20  &0777));.       
25aa0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
25ab0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
25ac0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
25ad0 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
25ae0 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20  N_BKPT, "open", 
25af0 7a 53 68 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  zShm);.         
25b00 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
25b10 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rr;.        }.  
25b20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
25b30 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  isReadonly = 1;.
25b40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
25b50 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
25b60 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
25b70 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  root, make sure 
25b80 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c  that the SHM fil
25b90 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77  e.      ** is ow
25ba0 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
25bb0 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  user that owns t
25bc0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
25bd0 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  base.  Otherwise
25be0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  ,.      ** the o
25bf0 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69  riginal owner wi
25c00 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
25c10 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20  o connect..     
25c20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74   */.      robust
25c30 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d  Fchown(pShmNode-
25c40 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64  >h, sStat.st_uid
25c50 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 3b  , sStat.st_gid);
25c60 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  ..      rc = uni
25c70 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72  xLockSharedMemor
25c80 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64  y(pDbFd, pShmNod
25c90 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
25ca0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
25cb0 63 21 3d 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  c!=SQLITE_READON
25cc0 4c 59 5f 43 41 4e 54 49 4e 49 54 20 29 20 67 6f  LY_CANTINIT ) go
25cd0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
25ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
25cf0 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f   Make the new co
25d00 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64  nnection a child
25d10 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e   of the unixShmN
25d20 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d  ode */.  p->pShm
25d30 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
25d40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
25d50 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70  EBUG.  p->id = p
25d60 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d  ShmNode->nextShm
25d70 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
25d80 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b  ShmNode->nRef++;
25d90 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d  .  pDbFd->pShm =
25da0 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d   p;.  unixLeaveM
25db0 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68  utex();..  /* Th
25dc0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
25dd0 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61  t on pShmNode ha
25de0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  s already been i
25df0 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72  ncremented under
25e00 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20  .  ** the cover 
25e10 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  of the unixEnter
25e20 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e  Mutex() mutex an
25e30 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72  d the pointer fr
25e40 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20  om the.  ** new 
25e50 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29  (struct unixShm)
25e60 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70   object to the p
25e70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e  ShmNode has been
25e80 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69   set. All that i
25e90 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64  s.  ** left to d
25ea0 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65  o is to link the
25eb0 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f   new object into
25ec0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
25ed0 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61   starting.  ** a
25ee0 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  t pShmNode->pFir
25ef0 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65  st. This must be
25f00 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64   done while hold
25f10 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65  ing the pShmNode
25f20 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75  ->mutex .  ** mu
25f30 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  tex..  */.  sqli
25f40 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
25f50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
25f60 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  ;.  p->pNext = p
25f70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
25f80 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  .  pShmNode->pFi
25f90 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74  rst = p;.  sqlit
25fa0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
25fb0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
25fc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20  .  return rc;.. 
25fd0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
25fe0 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
25ff0 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
26000 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64  ixShmPurge(pDbFd
26010 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73  );       /* This
26020 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d   call frees pShm
26030 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72 65 64  Node if required
26040 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   */.  sqlite3_fr
26050 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61  ee(p);.  unixLea
26060 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
26070 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26080 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
26090 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
260a0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
260b0 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f  region iRegion o
260c0 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64  f the .** shared
260d0 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74  -memory associat
260e0 65 64 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ed with the data
260f0 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68  base file fd. Sh
26100 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
26110 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62  ons .** are numb
26120 65 72 65 64 20 73 74 61 72 74 69 6e 67 20 66 72  ered starting fr
26130 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68  om zero. Each sh
26140 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
26150 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a  on is szRegion .
26160 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ** bytes in size
26170 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
26180 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
26190 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
261a0 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73  urned and *pp is
261b0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
261c0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
261d0 66 20 74 68 65 20 62 45 78 74 65 6e 64 20 70 61  f the bExtend pa
261e0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
261f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
26200 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  hared-memory.** 
26210 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62  region has not b
26220 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62  een allocated (b
26230 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e  y any client, in
26240 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e  cluding one runn
26250 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61  ing in a.** sepa
26260 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74  rate process), t
26270 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74  hen *pp is set t
26280 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54  o NULL and SQLIT
26290 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
262a0 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73  f .** bExtend is
262b0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
262c0 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61 72  e requested shar
262d0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
262e0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a   has not yet .**
262f0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c   been allocated,
26300 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64   it is allocated
26310 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
26320 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  n..**.** If the 
26330 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
26340 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  gion has already
26350 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
26360 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  or is allocated 
26370 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20  by.** this call 
26380 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
26390 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d  ve, then it is m
263a0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
263b0 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64  processes .** ad
263c0 64 72 65 73 73 20 73 70 61 63 65 20 28 69 66 20  dress space (if 
263d0 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
263e0 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74  y), *pp is set t
263f0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d  o point to the m
26400 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79  apped .** memory
26410 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
26420 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
26430 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61  ic int unixShmMa
26440 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
26450 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
26460 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
26470 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20  pen on database 
26480 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52  file */.  int iR
26490 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20  egion,          
264a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67            /* Reg
264b0 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20  ion to retrieve 
264c0 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f  */.  int szRegio
264d0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
264e0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
264f0 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
26500 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20   bExtend,       
26510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26520 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66  True to extend f
26530 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  ile if necessary
26540 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
26550 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20  ile **pp        
26560 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61        /* OUT: Ma
26570 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  pped memory */.)
26580 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
26590 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
265a0 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a  )fd;.  unixShm *
265b0 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  p;.  unixShmNode
265c0 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e   *pShmNode;.  in
265d0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
265e0 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d  ;.  int nShmPerM
265f0 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69  ap = unixShmRegi
26600 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e  onPerMap();.  in
26610 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20  t nReqRegion;.. 
26620 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61 72 65   /* If the share
26630 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61  d-memory file ha
26640 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f  s not yet been o
26650 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e  pened, open it n
26660 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62  ow. */.  if( pDb
26670 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20  Fd->pShm==0 ){. 
26680 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
26690 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
266a0 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Fd);.    if( rc!
266b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
266c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
266d0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
266e0 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
266f0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69  pShmNode;.  sqli
26700 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
26710 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
26720 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
26730 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 29 7b 0a  ->isUnlocked ){.
26740 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63      rc = unixLoc
26750 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44  kSharedMemory(pD
26760 62 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a  bFd, pShmNode);.
26770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
26780 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 68 6d  TE_OK ) goto shm
26790 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 70 53  page_out;.    pS
267a0 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b  hmNode->isUnlock
267b0 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  ed = 0;.  }.  as
267c0 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d  sert( szRegion==
267d0 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
267e0 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  on || pShmNode->
267f0 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20  nRegion==0 );.  
26800 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
26810 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
26820 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
26830 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
26840 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
26850 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
26860 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
26870 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
26880 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
26890 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
268a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69  =0 );..  /* Mini
268b0 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  mum number of re
268c0 67 69 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74  gions required t
268d0 6f 20 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a  o be mapped. */.
268e0 20 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28    nReqRegion = (
268f0 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72  (iRegion+nShmPer
26900 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61  Map) / nShmPerMa
26910 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b  p) * nShmPerMap;
26920 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ..  if( pShmNode
26930 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65  ->nRegion<nReqRe
26940 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  gion ){.    char
26950 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20   **apNew;       
26960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26970 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d  * New apRegion[]
26980 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e   array */.    in
26990 74 20 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65  t nByte = nReqRe
269a0 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20  gion*szRegion;  
269b0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75   /* Minimum requ
269c0 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a  ired file size *
269d0 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  /.    struct sta
269e0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
269f0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
26a00 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a   by fstat() */..
26a10 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a      pShmNode->sz
26a20 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f  Region = szRegio
26a30 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d  n;..    if( pShm
26a40 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  Node->h>=0 ){.  
26a50 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
26a60 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e  sted region is n
26a70 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74  ot mapped into t
26a80 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
26a90 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20  dress space..   
26aa0 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73     ** Check to s
26ab0 65 65 20 69 66 20 69 74 20 68 61 73 20 62 65 65  ee if it has bee
26ac0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65  n allocated (i.e
26ad0 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64  . if the wal-ind
26ae0 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20  ex file is.     
26af0 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   ** large enough
26b00 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
26b10 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
26b20 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
26b30 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 53    if( osFstat(pS
26b40 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61  hmNode->h, &sSta
26b50 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  t) ){.        rc
26b60 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26b70 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20  SHMSIZE;.       
26b80 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26b90 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  t;.      }.  .  
26ba0 20 20 20 20 69 66 28 20 73 53 74 61 74 2e 73 74      if( sStat.st
26bb0 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20  _size<nByte ){. 
26bc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
26bd0 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72  quested memory r
26be0 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  egion does not e
26bf0 78 69 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64  xist. If bExtend
26c00 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20   is set to.     
26c10 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69     ** false, exi
26c20 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c  t early. *pp wil
26c30 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c  l be set to NULL
26c40 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72   and SQLITE_OK r
26c50 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20  eturned..       
26c60 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
26c70 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20  !bExtend ){.    
26c80 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
26c90 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
26ca0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  }..        /* Al
26cb0 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20  ternatively, if 
26cc0 62 45 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c  bExtend is true,
26cd0 20 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65   extend the file
26ce0 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20  . Do this by.   
26cf0 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20       ** writing 
26d00 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
26d10 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68   the end of each
26d20 20 28 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67   (OS) page being
26d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
26d40 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65  cated or extende
26d50 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20  d. Technically, 
26d60 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69  we need only wri
26d70 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  te to the.      
26d80 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69    ** last page i
26d90 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e  n order to exten
26da0 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20  d the file. But 
26db0 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e  writing to all n
26dc0 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ew.        ** pa
26dd0 67 65 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f  ges forces the O
26de0 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68  S to allocate th
26df0 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20  em immediately, 
26e00 77 68 69 63 68 20 72 65 64 75 63 65 73 0a 20 20  which reduces.  
26e10 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61        ** the cha
26e20 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53 20 77  nces of SIGBUS w
26e30 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74  hile accessing t
26e40 68 65 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  he mapped region
26e50 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20   later on..     
26e60 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c     */.        el
26e70 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74  se{.          st
26e80 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70  atic const int p
26e90 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20  gsz = 4096;.    
26ea0 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a        int iPg;..
26eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
26ec0 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62  te to the last b
26ed0 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c  yte of each newl
26ee0 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65  y allocated or e
26ef0 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a  xtended page */.
26f00 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
26f10 28 20 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29  ( (nByte % pgsz)
26f20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
26f30 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e   for(iPg=(sStat.
26f40 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69  st_size/pgsz); i
26f50 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b  Pg<(nByte/pgsz);
26f60 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
26f70 20 20 20 20 20 69 6e 74 20 78 20 3d 20 30 3b 0a       int x = 0;.
26f80 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
26f90 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 70  seekAndWriteFd(p
26fa0 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a  ShmNode->h, iPg*
26fb0 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22  pgsz + pgsz-1, "
26fc0 22 2c 20 31 2c 20 26 78 29 21 3d 31 20 29 7b 0a  ", 1, &x)!=1 ){.
26fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
26fe0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
26ff0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
27000 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
27010 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
27020 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
27030 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
27040 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
27050 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
27060 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
27070 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27080 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27090 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
270a0 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
270b0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
270c0 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
270d0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
270e0 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
270f0 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
27100 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
27110 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
27120 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
27130 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
27140 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
27150 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
27160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
27170 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
27180 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
27190 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
271a0 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64     }.    pShmNod
271b0 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70  e->apRegion = ap
271c0 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  New;.    while( 
271d0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
271e0 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
271f0 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d        int nMap =
27200 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65   szRegion*nShmPe
27210 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  rMap;.      int 
27220 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70  i;.      void *p
27230 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
27240 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b  ShmNode->h>=0 ){
27250 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20  .        pMem = 
27260 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a  osMmap(0, nMap,.
27270 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d              pShm
27280 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
27290 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50   ? PROT_READ : P
272a0 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52  ROT_READ|PROT_WR
272b0 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ITE, .          
272c0 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53    MAP_SHARED, pS
272d0 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67  hmNode->h, szReg
272e0 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64  ion*(i64)pShmNod
272f0 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20  e->nRegion.     
27300 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
27310 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c  ( pMem==MAP_FAIL
27320 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ED ){.          
27330 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
27340 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
27350 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70  HMMAP, "mmap", p
27360 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
27370 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  me);.          g
27380 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
27390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
273a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
273b0 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pMem = sqlite3_m
273c0 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e  alloc64(szRegion
273d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
273e0 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Mem==0 ){.      
273f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
27400 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
27410 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
27420 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
27430 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
27440 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
27450 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  on);.      }..  
27460 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
27470 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b  ShmPerMap; i++){
27480 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
27490 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
274a0 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d  Node->nRegion+i]
274b0 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d   = &((char*)pMem
274c0 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20  )[szRegion*i];. 
274d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
274e0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b  mNode->nRegion +
274f0 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  = nShmPerMap;.  
27500 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
27510 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
27520 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
27530 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
27540 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
27550 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
27560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
27570 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
27580 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
27590 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
275a0 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
275b0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
275c0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
275d0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
275e0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
275f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
27600 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
27610 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
27620 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
27630 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
27640 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
27650 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
27660 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
27670 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
27680 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
27690 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
276a0 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
276b0 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
276c0 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
276d0 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
276e0 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
276f0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
27700 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
27710 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
27720 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
27730 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
27740 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
27750 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
27760 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
27770 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
27780 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
27790 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
277a0 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
277b0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
277c0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
277d0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
277e0 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
277f0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
27800 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
27810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27820 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
27830 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
27840 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
27850 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
27860 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
27870 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
27880 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
27890 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
278a0 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
278b0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
278c0 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
278d0 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
278e0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
278f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27900 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
27910 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
27920 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
27930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
27950 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
27960 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
27970 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
27980 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
27990 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
279a0 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
279b0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
279c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
279d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
279e0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
279f0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
27a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a10 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
27a20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
27a30 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
27a40 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
27a50 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
27a60 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
27a70 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
27a80 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
27a90 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
27aa0 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
27ab0 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
27ac0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
27ad0 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
27ae0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
27af0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
27b00 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
27b10 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
27b20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
27b30 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
27b40 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
27b50 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
27b60 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
27b70 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
27b80 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
27b90 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
27ba0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
27bb0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
27bc0 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
27bd0 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
27be0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
27bf0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
27c00 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
27c10 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
27c20 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
27c30 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
27c40 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
27c50 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
27c60 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
27c70 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
27c80 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
27c90 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
27ca0 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
27cb0 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
27cc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
27cd0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
27ce0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
27cf0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
27d00 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
27d10 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
27d20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
27d30 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
27d40 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
27d50 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
27d60 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
27d70 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
27d80 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
27d90 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
27da0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
27db0 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
27dc0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
27dd0 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
27de0 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
27df0 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
27e00 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
27e10 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
27e20 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
27e30 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
27e40 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
27e50 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
27e60 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
27e70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
27e80 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
27e90 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c  ock(pDbFd, F_UNL
27ea0 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
27eb0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
27ec0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
27ed0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
27ee0 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20   }..    /* Undo 
27ef0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20  the local locks 
27f00 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
27f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27f20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d    p->exclMask &=
27f30 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d   ~mask;.      p-
27f40 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e  >sharedMask &= ~
27f50 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d  mask;.    } .  }
27f60 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
27f70 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
27f80 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  ED ){.    u16 al
27f90 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a  lShared = 0;  /*
27fa0 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20   Union of locks 
27fb0 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69  held by connecti
27fc0 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22  ons other than "
27fd0 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69  p" */..    /* Fi
27fe0 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61  nd out which sha
27ff0 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c  red locks are al
28000 72 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69  ready held by si
28010 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
28020 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79  s..    ** If any
28030 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79   sibling already
28040 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
28050 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65  ive lock, go ahe
28060 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  ad and return.  
28070 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59    ** SQLITE_BUSY
28080 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
28090 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  (pX=pShmNode->pF
280a0 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d  irst; pX; pX=pX-
280b0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69  >pNext){.      i
280c0 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b  f( (pX->exclMask
280d0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
280e0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
280f0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
28100 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
28110 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20        allShared 
28120 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73  |= pX->sharedMas
28130 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
28140 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   Get shared lock
28150 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
28160 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73  level, if necess
28170 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ary */.    if( r
28180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28190 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68        if( (allSh
281a0 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20  ared & mask)==0 
281b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
281c0 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
281d0 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b  k(pDbFd, F_RDLCK
281e0 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
281f0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
28200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
28210 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28220 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
28230 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63    /* Get the loc
28240 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20  al shared locks 
28250 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
28260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28270 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
28280 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  |= mask;.    }. 
28290 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d   }else{.    /* M
282a0 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c  ake sure no sibl
282b0 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
282c0 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20  hold locks that 
282d0 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a  will block this.
282e0 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66      ** lock.  If
282f0 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20   any do, return 
28300 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68  SQLITE_BUSY righ
28310 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20  t away..    */. 
28320 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
28330 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
28340 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
28350 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78       if( (pX->ex
28360 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  clMask & mask)!=
28370 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64  0 || (pX->shared
28380 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
28390 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
283a0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
283b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
283c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
283d0 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c   /* Get the excl
283e0 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74  usive locks at t
283f0 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e  he system level.
28400 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73    Then if succes
28410 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f  sful.    ** also
28420 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20   mark the local 
28430 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65  connection as be
28440 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20  ing locked..    
28450 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
28460 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28470 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
28480 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
28490 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_WRLCK, ofst+UN
284a0 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
284b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
284c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
284d0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e      assert( (p->
284e0 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
284f0 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  k)==0 );.       
28500 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
28510 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mask;.      }.  
28520 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
28530 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
28540 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
28550 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
28560 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
28570 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25  id-%d got %03x,%
28580 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  03x\n",.        
28590 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70     p->id, osGetp
285a0 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64  id(0), p->shared
285b0 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73  Mask, p->exclMas
285c0 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  k));.  return rc
285d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
285e0 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61  ment a memory ba
285f0 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20  rrier or memory 
28600 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20  fence on shared 
28610 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20  memory.  .**.** 
28620 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74  All loads and st
28630 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72  ores begun befor
28640 65 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75  e the barrier mu
28650 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f  st complete befo
28660 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f  re.** any load o
28670 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66  r store begun af
28680 74 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e  ter the barrier.
28690 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
286a0 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a  unixShmBarrier(.
286b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
286c0 66 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  fd              
286d0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
286e0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  le holding the s
286f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
28700 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
28710 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c  METER(fd);.  sql
28720 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65  ite3MemoryBarrie
28730 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  r();         /* 
28740 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64  compiler-defined
28750 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20   memory barrier 
28760 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  */.  assert( uni
28770 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74 68 65 6c  xFileMutexNothel
28780 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 29  d((unixFile*)fd)
28790 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   );.  unixEnterM
287a0 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20 20  utex();         
287b0 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75        /* Also mu
287c0 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61  tex, for redunda
287d0 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61  ncy */.  unixLea
287e0 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a  veMutex();.}../*
287f0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e  .** Close a conn
28800 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64  ection to shared
28810 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65  -memory.  Delete
28820 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
28830 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64  .** storage if d
28840 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72 75  eleteFlag is tru
28850 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  e..**.** If ther
28860 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d  e is no shared m
28870 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
28880 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63   with the connec
28890 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a  tion then this.*
288a0 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68  * routine is a h
288b0 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a  armless no-op..*
288c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
288d0 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c  xShmUnmap(.  sql
288e0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
288f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28900 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
28910 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
28920 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67    int deleteFlag
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28940 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72    /* Delete shar
28950 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75  ed-memory if tru
28960 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68  e */.){.  unixSh
28970 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  m *p;           
28980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
28990 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
289a0 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e  e closed */.  un
289b0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
289c0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
289d0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
289e0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
289f0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  le */.  unixShm 
28a00 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20 20  **pp;           
28a10 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
28a20 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c  ooping over sibl
28a30 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ing connections 
28a40 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
28a50 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20  DbFd;           
28a60 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
28a70 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
28a80 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64  file */..  pDbFd
28a90 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
28aa0 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ;.  p = pDbFd->p
28ab0 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  Shm;.  if( p==0 
28ac0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
28ad0 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  OK;.  pShmNode =
28ae0 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20   p->pShmNode;.. 
28af0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
28b00 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
28b10 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
28b20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
28b30 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
28b40 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a  >pInode );..  /*
28b50 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69   Remove connecti
28b60 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65  on p from the se
28b70 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  t of connections
28b80 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a   associated.  **
28b90 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a   with pShmNode *
28ba0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
28bb0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
28bc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28  ->mutex);.  for(
28bd0 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  pp=&pShmNode->pF
28be0 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20  irst; (*pp)!=p; 
28bf0 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65  pp = &(*pp)->pNe
28c00 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d  xt){}.  *pp = p-
28c10 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72  >pNext;..  /* Fr
28c20 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ee the connectio
28c30 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  n p */.  sqlite3
28c40 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46  _free(p);.  pDbF
28c50 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73  d->pShm = 0;.  s
28c60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
28c70 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
28c80 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53  ex);..  /* If pS
28c90 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73  hmNode->nRef has
28ca0 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e   reached 0, then
28cb0 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72   close the under
28cc0 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65  lying.  ** share
28cd0 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74  d-memory file, t
28ce0 6f 6f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  oo */.  assert( 
28cf0 75 6e 69 78 46 69 6c 65 4d 75 74 65 78 4e 6f 74  unixFileMutexNot
28d00 68 65 6c 64 28 70 44 62 46 64 29 20 29 3b 0a 20  held(pDbFd) );. 
28d10 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
28d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
28d30 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b  mNode->nRef>0 );
28d40 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  .  pShmNode->nRe
28d50 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e  f--;.  if( pShmN
28d60 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  ode->nRef==0 ){.
28d70 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c      if( deleteFl
28d80 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e  ag && pShmNode->
28d90 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  h>=0 ){.      os
28da0 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
28db0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
28dc0 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75   }.    unixShmPu
28dd0 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
28de0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
28df0 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
28e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
28e10 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
28e20 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
28e30 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
28e40 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
28e50 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
28e60 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
28e70 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
28e80 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
28e90 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
28ea0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
28eb0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
28ec0 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
28ed0 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
28ee0 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
28ef0 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
28f00 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
28f10 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
28f20 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
28f30 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
28f40 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
28f50 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
28f60 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
28f70 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
28f80 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
28f90 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
28fa0 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
28fb0 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
28fc0 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
28fd0 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
28fe0 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
28ff0 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
29000 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
29010 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
29020 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
29030 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
29040 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
29050 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
29060 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
29070 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
29080 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
29090 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
290a0 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
290b0 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
290c0 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
290d0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
290e0 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
290f0 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
29100 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
29110 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
29120 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
29130 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
29140 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
29150 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
29160 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
29170 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
29180 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
29190 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
291a0 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
291b0 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
291c0 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
291d0 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
291e0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
291f0 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
29200 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
29210 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
29220 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
29230 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
29240 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
29270 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
29280 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
29290 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
292a0 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
292d0 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
292e0 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
292f0 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
29300 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
29310 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
29320 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
29330 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
29340 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
29350 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
29360 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
29370 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
29380 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
29390 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
293a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
293b0 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
293c0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
293d0 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
293e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
293f0 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
29400 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
29410 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
29420 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
29430 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
29440 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
29450 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
29460 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
29470 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
29480 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
29490 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
294a0 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
294b0 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
294c0 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
294d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
294e0 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
294f0 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
29500 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
29510 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
29520 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
29530 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
29540 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56  pOrig ){.#if HAV
29550 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34  E_MREMAP.    i64
29560 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d   nReuse = pFd->m
29570 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20  mapSize;.#else. 
29580 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
29590 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61  yspage = osGetpa
295a0 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
295b0 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
295c0 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
295d0 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e  Syspage-1));.#en
295e0 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71  dif.    u8 *pReq
295f0 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
29600 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
29610 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
29620 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
29630 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
29640 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
29650 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
29660 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
29670 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
29680 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
29690 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
296a0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
296b0 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
296c0 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
296d0 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
296e0 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
296f0 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
29700 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
29710 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
29720 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
29730 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
29740 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
29750 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
29760 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
29770 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
29780 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
29790 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
297a0 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
297b0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
297c0 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
297d0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
297e0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
297f0 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
29800 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
29810 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
29820 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
29830 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
29840 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
29850 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
29860 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
29870 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
29880 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
29890 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
298a0 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
298b0 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
298c0 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
298d0 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
298e0 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
298f0 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
29900 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
29910 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
29920 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
29930 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
29940 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
29950 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
29960 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
29970 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
29980 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
29990 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
299a0 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
299b0 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
299c0 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
299d0 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
299e0 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
299f0 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
29a00 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
29a10 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
29a20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
29a30 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
29a40 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
29a50 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
29a60 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
29a70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
29a80 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
29a90 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
29aa0 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
29ab0 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
29ac0 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
29ad0 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
29ae0 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
29af0 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
29b00 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
29b10 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
29b20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
29b30 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
29b40 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
29b50 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
29b60 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
29b70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
29b80 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
29b90 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
29ba0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
29bb0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
29bc0 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
29bd0 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
29be0 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
29bf0 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
29c00 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
29c10 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
29c20 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
29c30 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
29c40 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
29c50 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
29c60 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
29c70 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
29c80 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
29c90 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
29ca0 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
29cb0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
29cc0 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
29cd0 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
29ce0 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
29cf0 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
29d00 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
29d10 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
29d20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
29d30 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
29d40 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
29d50 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
29d60 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
29d70 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
29d80 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
29d90 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
29da0 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
29db0 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
29dc0 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
29dd0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
29de0 2c 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61  , i64 nMap){.  a
29df0 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
29e00 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
29e10 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29e20 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d   nMap>0 || (pFd-
29e30 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20  >mmapSize==0 && 
29e40 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
29e50 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64  =0) );.  if( pFd
29e60 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
29e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29e80 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
29e90 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
29ea0 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
29eb0 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
29ec0 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
29ed0 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73  on */.    if( os
29ee0 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
29ef0 74 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20  tatbuf) ){.     
29f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
29f10 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
29f20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61  }.    nMap = sta
29f30 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20  tbuf.st_size;.  
29f40 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
29f50 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
29f60 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
29f70 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
29f80 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  }..  assert( nMa
29f90 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
29fa0 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
29fb0 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
29fc0 29 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70  );.  if( nMap!=p
29fd0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
29fe0 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
29ff0 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
2a000 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
2a010 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
2a020 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
2a030 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
2a040 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
2a050 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
2a060 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
2a070 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
2a080 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
2a090 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
2a0a0 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
2a0b0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
2a0c0 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
2a0d0 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
2a0e0 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
2a0f0 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
2a100 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
2a110 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
2a120 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
2a130 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
2a140 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
2a150 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
2a160 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
2a170 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
2a180 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
2a190 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2a1a0 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
2a1b0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
2a1c0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
2a1d0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
2a1e0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
2a1f0 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
2a200 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
2a210 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
2a220 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20  lly .** release 
2a230 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
2a240 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66   calling unixUnf
2a250 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
2a260 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28  c int unixFetch(
2a270 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2a280 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
2a290 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
2a2a0 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
2a2b0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
2a2c0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
2a2d0 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
2a2e0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
2a2f0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
2a300 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
2a310 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54   = 0;..#if SQLIT
2a320 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2a330 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  0.  if( pFd->mma
2a340 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20  pSizeMax>0 ){.  
2a350 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
2a360 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  egion==0 ){.    
2a370 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d    int rc = unixM
2a380 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
2a390 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2a3a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2a3b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2a3c0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
2a3d0 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
2a3e0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
2a3f0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
2a400 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
2a410 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
2a420 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
2a430 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2a440 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2a450 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
2a460 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
2a470 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
2a480 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
2a490 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e  es a .** referen
2a4a0 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
2a4b0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
2a4c0 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54  o unixFetch(). T
2a4d0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
2a4e0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
2a4f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
2a500 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
2a510 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
2a520 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
2a530 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
2a540 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68  to the unixFetch
2a550 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a  () invocation. .
2a560 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
2a570 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
2a580 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
2a590 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
2a5a0 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  eing called .** 
2a5b0 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
2a5c0 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
2a5d0 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
2a5e0 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
2a5f0 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e  apping .** may n
2a600 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
2a610 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
2a620 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
2a630 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28  int unixUnfetch(
2a640 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2a650 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64  , i64 iOff, void
2a660 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
2a670 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
2a680 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
2a690 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
2a6a0 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
2a6b0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
2a6c0 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44  file */.  UNUSED
2a6d0 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
2a6e0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  ;..  /* If p==0 
2a6f0 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
2a700 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
2a710 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
2a720 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
2a730 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
2a740 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
2a750 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
2a760 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
2a770 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
2a780 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
2a790 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
2a7a0 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
2a7b0 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
2a7c0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
2a7d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
2a7e0 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
2a7f0 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
2a800 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
2a810 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
2a820 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
2a830 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28  [iOff] );..  if(
2a840 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
2a850 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
2a860 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
2a870 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
2a880 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
2a890 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
2a8a0 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
2a8b0 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
2a8c0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2a8d0 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
2a8e0 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
2a8f0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
2a900 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2a910 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
2a920 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2a930 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
2a940 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
2a950 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2a960 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
2a970 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
2a980 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
2a990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9a0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2a9b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
2a9f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
2aa00 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
2aa10 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
2aa20 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2aa30 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
2aa40 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
2aa50 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
2aa60 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
2aa70 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
2aa80 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
2aa90 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
2aaa0 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
2aab0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2aac0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
2aad0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
2aae0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
2aaf0 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
2ab00 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
2ab10 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
2ab20 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
2ab30 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
2ab40 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
2ab50 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
2ab60 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
2ab70 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
2ab80 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
2ab90 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
2aba0 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
2abb0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
2abc0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
2abd0 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
2abe0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
2abf0 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
2ac00 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
2ac10 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
2ac20 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
2ac30 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
2ac40 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
2ac50 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
2ac60 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
2ac70 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
2ac80 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
2ac90 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
2aca0 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  nction F, two ob
2acb0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
2acc0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
2acd0 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
2ace0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
2acf0 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
2ad00 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
2ad10 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
2ad20 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
2ad30 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
2ad40 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
2ad50 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
2ad60 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
2ad70 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
2ad80 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
2ad90 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
2ada0 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
2adb0 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
2adc0 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
2add0 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
2ade0 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
2adf0 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
2ae00 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
2ae10 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
2ae20 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
2ae30 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
2ae40 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
2ae50 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
2ae60 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
2ae70 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
2ae80 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
2ae90 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
2aea0 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
2aeb0 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
2aec0 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
2aed0 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
2aee0 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
2aef0 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
2af00 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
2af10 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
2af20 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
2af30 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
2af40 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
2af50 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
2af60 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
2af70 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
2af80 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f  ODS(FINDER,METHO
2af90 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c  D,VERSION,CLOSE,
2afa0 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f  LOCK,UNLOCK,CKLO
2afb0 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c  CK,SHMMAP)     \
2afc0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2afd0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2afe0 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
2aff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b010 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b030 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
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 20 20 20 20 20 20 5c 0a 20               \. 
2b060 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
2b070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b080 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b0b0 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0d0 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2b100 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
2b110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b120 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
2b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b140 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2b150 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
2b160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
2b170 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2b1a0 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
2b1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
2b1c0 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
2b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2b1f0 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
2b200 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
2b210 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
2b220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b230 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
2b240 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b250 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2b260 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2b270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b280 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
2b290 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
2b2a0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2b2b0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2d0 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
2b2e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b2f0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
2b300 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b320 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
2b330 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
2b340 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
2b350 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
2b380 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
2b390 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
2b3a0 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3c0 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
2b3d0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
2b3e0 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
2b3f0 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
2b400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b410 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20   \.   SHMMAP,   
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
2b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b460 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
2b470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b480 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
2b490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2b4b0 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
2b4c0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2b4d0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
2b4e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2b500 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c     unixShmUnmap,
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b520 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
2b530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b540 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2b550 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20    unixFetch,    
2b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b570 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20   xFetch */      
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b590 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2b5a0 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20   unixUnfetch,   
2b5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b5c0 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20  xUnfetch */     
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
2b5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b630 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
2b640 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2b650 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
2b660 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
2b670 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
2b680 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
2b690 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
2b6a0 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
2b6b0 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
2b6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6d0 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
2b6e0 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
2b6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b720 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
2b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b770 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
2b780 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
2b790 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
2b7a0 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
2b7b0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
2b7c0 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
2b7d0 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
2b7e0 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
2b7f0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
2b800 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
2b810 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
2b820 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
2b830 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
2b840 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
2b850 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
2b860 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
2b870 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
2b880 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
2b890 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
2b8a0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b8b0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b8c0 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
2b8d0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
2b8e0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2b8f0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2b900 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
2b910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b920 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2b930 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
2b940 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
2b950 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
2b960 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2b970 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
2b980 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2b990 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2b9a0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
2b9b0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
2b9c0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2b9d0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
2b9e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2b9f0 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
2ba00 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2ba10 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61  d */.  unixShmMa
2ba20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
2ba30 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2ba40 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
2ba50 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
2ba60 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
2ba70 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2ba80 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
2ba90 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
2baa0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2bab0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2bac0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
2bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bae0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2baf0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70   memory and mmap
2bb00 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a   are enabled */.
2bb10 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20    nolockClose,  
2bb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2bb30 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2bb40 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20    nolockLock,   
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2bb60 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2bb70 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20   nolockUnlock,  
2bb80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2bb90 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2bba0 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73    nolockCheckRes
2bbb0 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78  ervedLock,  /* x
2bbc0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2bbd0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bbf0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2bc00 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49  ap method */.).I
2bc10 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c  OMETHODS(.  dotl
2bc20 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
2bc30 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2bc40 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2bc50 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  .  dotlockIoMeth
2bc60 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ods,         /* 
2bc70 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2bc80 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2bc90 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2bca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bcb0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2bcc0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2bcd0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
2bce0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2bcf0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2bd00 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
2bd10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2bd20 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
2bd30 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
2bd40 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2bd50 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2bd60 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
2bd70 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68  rvedLock, /* xCh
2bd80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2bd90 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bdb0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2bdc0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69   method */.)..#i
2bdd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2bde0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2bdf0 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b  METHODS(.  flock
2be00 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
2be10 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2be20 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2be30 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73    flockIoMethods
2be40 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
2be50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2be60 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2be70 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2be80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be90 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2bea0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66   disabled */.  f
2beb0 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20  lockClose,      
2bec0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2bed0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  se method */.  f
2bee0 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20  lockLock,       
2bef0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2bf00 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
2bf10 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  ockUnlock,      
2bf20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2bf30 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66  ck method */.  f
2bf40 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
2bf50 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
2bf60 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2bf70 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf90 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2bfa0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2bfb0 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  if..#if OS_VXWOR
2bfc0 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  KS.IOMETHODS(.  
2bfd0 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  semIoFinder,    
2bfe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2bff0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2c000 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68  e */.  semIoMeth
2c010 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2c020 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2c030 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2c040 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
2c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c060 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2c070 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2c080 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20  /.  semXClose,  
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c0a0 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2c0b0 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20  /.  semXLock,   
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c0d0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2c0e0 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20  .  semXUnlock,  
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c100 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2c110 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73  /.  semXCheckRes
2c120 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a  ervedLock,    /*
2c130 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2c140 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2c150 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2c160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2c170 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2c180 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
2c190 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
2c1a0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
2c1b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
2c1c0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
2c1d0 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2c1e0 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2c1f0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2c200 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
2c210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c220 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2c230 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2c240 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2c250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c260 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2c270 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2c280 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  afpClose,       
2c290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2c2a0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2c2b0 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  afpLock,        
2c2c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2c2d0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
2c2e0 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fpUnlock,       
2c2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2c300 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2c310 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64  afpCheckReserved
2c320 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
2c330 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2c340 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2c350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c360 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2c370 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2c380 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
2c390 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
2c3a0 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
2c3b0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
2c3c0 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
2c3d0 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
2c3e0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
2c3f0 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
2c400 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
2c410 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
2c420 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
2c430 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
2c440 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
2c450 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
2c460 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
2c470 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
2c480 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
2c490 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
2c4a0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
2c4b0 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
2c4c0 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
2c4d0 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
2c4e0 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
2c4f0 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
2c500 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c510 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
2c520 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
2c530 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
2c540 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
2c550 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
2c560 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
2c570 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
2c580 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
2c590 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2c5a0 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
2c5b0 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
2c5c0 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
2c5d0 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
2c5e0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
2c5f0 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
2c600 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
2c610 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
2c620 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2c630 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2c640 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2c650 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
2c660 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
2c670 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
2c680 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
2c690 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
2c6a0 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
2c6b0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
2c6c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
2c6d0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
2c6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c6f0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2c700 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2c710 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c  led */.  proxyCl
2c720 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
2c730 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
2c740 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f  hod */.  proxyLo
2c750 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2c760 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2c770 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c  od */.  proxyUnl
2c780 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2c790 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2c7a0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68  hod */.  proxyCh
2c7b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2c7c0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
2c7d0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
2c7e0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
2c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c800 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
2c810 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
2c820 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53   nfs lockd on OS
2c830 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20  X 10.3+ doesn't 
2c840 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b  clear write lock
2c850 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f  s when a read lo
2c860 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66  ck is set */.#if
2c870 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c880 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2c890 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2c8a0 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  LE.IOMETHODS(.  
2c8b0 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  nfsIoFinder,    
2c8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2c8d0 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
2c8e0 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74  me */.  nfsIoMet
2c8f0 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
2c900 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2c910 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2c920 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2c930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c940 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2c950 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2c960 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
2c970 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c980 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2c990 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
2c9a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c9b0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
2c9c0 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63  od */.  nfsUnloc
2c9d0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2c9e0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
2c9f0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68  thod */.  unixCh
2ca00 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
2ca10 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
2ca20 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2ca30 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca50 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
2ca60 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
2ca70 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2ca80 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2ca90 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2caa0 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68  _STYLE./* .** Th
2cab0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2cac0 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
2cad0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
2cae0 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  est locking stra
2caf0 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65  tegy .** for the
2cb00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22   database file "
2cb10 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74  filePath".  It t
2cb20 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  hen returns the 
2cb30 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2cb40 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61  ds.** object tha
2cb50 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61  t implements tha
2cb60 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a  t strategy..**.*
2cb70 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61  * This is for Ma
2cb80 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74  cOSX only..*/.st
2cb90 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2cba0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61  e3_io_methods *a
2cbb0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
2cbc0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
2cbd0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
2cbe0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
2cbf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2cc00 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
2cc10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70             /* op
2cc20 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66  en file object f
2cc30 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
2cc40 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61  file */.){.  sta
2cc50 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2cc60 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63   Mapping {.    c
2cc70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2cc80 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20  system;         
2cc90 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74       /* Filesyst
2cca0 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a  em type name */.
2ccb0 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65      const sqlite
2ccc0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d  3_io_methods *pM
2ccd0 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70  ethods;   /* App
2cce0 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67  ropriate locking
2ccf0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61   method */.  } a
2cd00 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Map[] = {.    { 
2cd10 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "hfs",    &posix
2cd20 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2cd30 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f   { "ufs",    &po
2cd40 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2cd50 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20      { "afpfs",  
2cd60 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2cd70 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20  .    { "smbfs", 
2cd80 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
2cd90 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22  ,.    { "webdav"
2cda0 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  , &nolockIoMetho
2cdb0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30  ds },.    { 0, 0
2cdc0 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b   }.  };.  int i;
2cdd0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
2cde0 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63   fsInfo;.  struc
2cdf0 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
2ce00 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
2ce10 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
2ce20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
2ce30 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
2ce40 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
2ce50 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
2ce60 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
2ce70 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
2ce80 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
2ce90 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
2cea0 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28  thods;.  }.  if(
2ceb0 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68   statfs(filePath
2cec0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
2ced0 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e   ){.    if( fsIn
2cee0 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54  fo.f_flags & MNT
2cef0 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20  _RDONLY ){.     
2cf00 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2cf10 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
2cf20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61      for(i=0; aMa
2cf30 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2cf40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
2cf50 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e  ( strcmp(fsInfo.
2cf60 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d  f_fstypename, aM
2cf70 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
2cf80 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  m)==0 ){.       
2cf90 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e   return aMap[i].
2cfa0 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20  pMethods;.      
2cfb0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2cfc0 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20  * Default case. 
2cfd0 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74  Handles, amongst
2cfe0 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a   others, "nfs"..
2cff0 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72    ** Test byte-r
2d000 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20  ange lock using 
2d010 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20  fcntl(). If the 
2d020 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a  call succeeds, .
2d030 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74    ** assume that
2d040 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
2d050 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20   supports POSIX 
2d060 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20  style locks. .  
2d070 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
2d080 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
2d090 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
2d0a0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
2d0b0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
2d0c0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
2d0d0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
2d0e0 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
2d0f0 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
2d100 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
2d110 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2d120 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2d130 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29  ame, "nfs")==0 )
2d140 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2d150 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  nfsIoMethods;.  
2d160 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2d170 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
2d180 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2d190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
2d1a0 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  rn &dotlockIoMet
2d1b0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2d1c0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2d1d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2d1e0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
2d1f0 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
2d200 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2d210 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
2d220 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2d230 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   /* defined(__AP
2d240 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2d250 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d260 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53  STYLE */..#if OS
2d270 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54  _VXWORKS./*.** T
2d280 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
2d290 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b  ction for VxWork
2d2a0 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  s checks to see 
2d2b0 69 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  if posix advisor
2d2c0 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  y.** locking wor
2d2d0 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c  ks.  If it does,
2d2e0 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68   then that is wh
2d2f0 61 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  at is used.  If 
2d300 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77  it does not.** w
2d310 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61  ork, then fallba
2d320 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61  ck to named sema
2d330 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  phore locking..*
2d340 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  /.static const s
2d350 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2d360 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64  s *vxworksIoFind
2d370 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2d380 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2d390 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2d3a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2d3b0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2d3c0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2d3d0 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
2d3e0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
2d3f0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2d400 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2d410 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2d420 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2d430 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2d440 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2d450 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2d460 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2d470 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2d480 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2d490 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2d4a0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
2d4b0 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
2d4c0 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
2d4d0 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
2d4e0 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
2d4f0 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
2d500 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
2d510 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
2d520 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
2d530 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
2d540 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
2d550 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
2d560 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
2d570 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
2d580 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
2d590 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
2d5a0 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
2d5b0 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
2d5c0 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
2d5d0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
2d5e0 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
2d5f0 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
2d600 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
2d610 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2d620 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
2d630 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49  (*const vxworksI
2d640 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2d650 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2d660 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  = vxworksIoFinde
2d670 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f  rImpl;..#endif /
2d680 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
2d690 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61  ./*.** An abstra
2d6a0 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f  ct type for a po
2d6b0 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d  inter to an IO m
2d6c0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
2d6d0 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65  ction:.*/.typede
2d6e0 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  f const sqlite3_
2d6f0 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69  io_methods *(*fi
2d700 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74  nder_type)(const
2d710 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2d720 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  );.../**********
2d730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d770 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
2d780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2d790 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68  sqlite3_vfs meth
2d7a0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
2d7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2d7c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69  .**.** This divi
2d7d0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68  sion contains th
2d7e0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2d7f0 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74   of methods on t
2d800 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  he.** sqlite3_vf
2d810 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a  s object..*/../*
2d820 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
2d830 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2d840 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2d850 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
2d860 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74   by pId..*/.stat
2d870 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69  ic int fillInUni
2d880 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  xFile(.  sqlite3
2d890 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
2d8a0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76   /* Pointer to v
2d8b0 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  fs object */.  i
2d8c0 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20  nt h,           
2d8d0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
2d8e0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2d8f0 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  f file being ope
2d900 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ned */.  sqlite3
2d910 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20  _file *pId,     
2d920 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65   /* Write to the
2d930 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
2d940 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
2d950 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
2d960 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ame,  /* Name of
2d970 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2d980 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20  opened */.  int 
2d990 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20  ctrlFlags       
2d9a0 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d      /* Zero or m
2d9b0 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76  ore UNIXFILE_* v
2d9c0 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f  alues */.){.  co
2d9d0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2d9e0 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67  ethods *pLocking
2d9f0 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c  Style;.  unixFil
2da00 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46  e *pNew = (unixF
2da10 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74  ile *)pId;.  int
2da20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2da30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77  ..  assert( pNew
2da40 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29  ->pInode==NULL )
2da50 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  ;..  /* No locki
2da60 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
2da70 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
2da80 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2da90 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
2daa0 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2dab0 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
2dac0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
2dad0 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
2dae0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
2daf0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
2db00 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
2db10 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
2db20 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
2db30 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2db40 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
2db50 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
2db60 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
2db70 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
2db80 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
2db90 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
2dba0 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
2dbb0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
2dbc0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2dbd0 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
2dbe0 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
2dbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc00 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
2dc10 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
2dc20 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
2dc30 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2dc40 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
2dc50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
2dc60 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
2dc70 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
2dc80 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
2dc90 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2dca0 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
2dcb0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
2dcc0 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
2dcd0 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
2dce0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
2dcf0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
2dd00 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
2dd10 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
2dd20 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
2dd30 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
2dd40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
2dd50 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49   ctrlFlags & UNI
2dd60 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a  XFILE_NOLOCK ){.
2dd70 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2dd80 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  e = &nolockIoMet
2dd90 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2dda0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2ddb0 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79   = (**(finder_ty
2ddc0 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61  pe*)pVfs->pAppDa
2ddd0 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ta)(zFilename, p
2dde0 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  New);.#if SQLITE
2ddf0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2de00 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63  STYLE.    /* Cac
2de10 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20  he zFilename in 
2de20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  the locking cont
2de30 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74  ext (AFP and dot
2de40 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66  lock override) f
2de50 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c  or.    ** proxyL
2de60 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69  ock activation i
2de70 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f  s possible (remo
2de80 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65  te proxy is base
2de90 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20  d on db name).  
2dea0 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72    ** zFilename r
2deb0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
2dec0 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  il file is close
2ded0 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f  d, to support */
2dee0 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
2def0 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69  ngContext = (voi
2df00 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65  d*)zFilename;.#e
2df10 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ndif.  }..  if( 
2df20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2df30 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2df40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2df50 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2df60 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2df70 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c  _STYLE.    || pL
2df80 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2df90 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e  nfsIoMethods.#en
2dfa0 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69  dif.  ){.    uni
2dfb0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2dfc0 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
2dfd0 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
2dfe0 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
2dff0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e000 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  K ){.      /* If
2e010 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72   an error occurr
2e020 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49  ed in findInodeI
2e030 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65  nfo(), close the
2e040 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2e050 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69  .      ** immedi
2e060 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65  ately, before re
2e070 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65  leasing the mute
2e080 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  x. findInodeInfo
2e090 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20  () may fail.    
2e0a0 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e    ** in two scen
2e0b0 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  arios:.      **.
2e0c0 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41        **   (a) A
2e0d0 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29   call to fstat()
2e0e0 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2e0f0 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63  *   (b) A malloc
2e100 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a   failed..      *
2e110 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61  *.      ** Scena
2e120 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79  rio (b) may only
2e130 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72   occur if the pr
2e140 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67  ocess is holding
2e150 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20   no other.      
2e160 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
2e170 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ors open on the 
2e180 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68  same file. If th
2e190 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66  ere were other f
2e1a0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
2e1b0 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73  criptors on this
2e1c0 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d   file, then no m
2e1d0 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72  alloc would be r
2e1e0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
2e1f0 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   ** findInodeInf
2e200 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20  o(). If this is 
2e210 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20  the case, it is 
2e220 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c  quite safe to cl
2e230 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e  ose.      ** han
2e240 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73  dle h - as it is
2e250 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74   guaranteed that
2e260 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20   no posix locks 
2e270 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64  will be released
2e280 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69  .      ** by doi
2e290 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a  ng so..      **.
2e2a0 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e        ** If scen
2e2b0 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20  ario (a) caused 
2e2c0 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74  the error then t
2e2d0 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f  hings are not so
2e2e0 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20   safe. The.     
2e2f0 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73   ** implicit ass
2e300 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20  umption here is 
2e310 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20  that if fstat() 
2e320 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72  fails, things ar
2e330 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75  e in.      ** su
2e340 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61  ch bad shape tha
2e350 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63  t dropping a loc
2e360 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74  k or two doesn't
2e370 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20   matter much..  
2e380 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62      */.      rob
2e390 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2e3a0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2e3b0 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
2e3c0 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2e3d0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66  utex();.  }..#if
2e3e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2e3f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
2e400 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2e410 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c  _).  else if( pL
2e420 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26  ockingStyle == &
2e430 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  afpIoMethods ){.
2e440 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69      /* AFP locki
2e450 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65  ng uses the file
2e460 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64   path so it need
2e470 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64  s to be included
2e480 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61   in.    ** the a
2e490 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2e4a0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70  ..    */.    afp
2e4b0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2e4c0 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  pCtx;.    pNew->
2e4d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2e4e0 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
2e4f0 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
2e500 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69  (*pCtx) );.    i
2e510 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20  f( pCtx==0 ){.  
2e520 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2e530 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
2e540 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2e550 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
2e560 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
2e570 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
2e580 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
2e590 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
2e5a0 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
2e5b0 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
2e5c0 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
2e5d0 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
2e5e0 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
2e5f0 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
2e600 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
2e610 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
2e620 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
2e630 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
2e640 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
2e650 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2e660 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
2e670 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2e680 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2e690 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e6a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e6b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2e6c0 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2e6d0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  xt);.        rob
2e6e0 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2e6f0 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2e700 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2e710 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78      }.      unix
2e720 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
2e730 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
2e740 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
2e750 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2e760 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
2e770 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2e780 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
2e790 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2e7a0 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2e7b0 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2e7c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
2e7d0 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
2e7e0 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
2e7f0 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
2e800 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
2e810 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46  ;.    assert( zF
2e820 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ilename!=0 );.  
2e830 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
2e840 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
2e850 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
2e860 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
2e870 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2e880 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  64(nFilename);. 
2e890 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
2e8a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2e8b0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
2e8c0 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  KPT;.    }else{.
2e8d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2e8e0 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
2e8f0 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
2e900 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
2e910 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
2e920 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
2e930 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
2e940 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
2e950 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2e960 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
2e970 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
2e980 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2e990 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
2e9a0 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
2e9b0 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
2e9c0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
2e9d0 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
2e9e0 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
2e9f0 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
2ea00 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2ea10 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
2ea20 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
2ea30 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
2ea40 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
2ea50 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
2ea60 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2ea70 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
2ea80 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
2ea90 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
2eaa0 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
2eab0 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
2eac0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
2ead0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
2eae0 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
2eaf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eb00 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
2eb10 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
2eb20 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
2eb30 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
2eb40 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
2eb50 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
2eb60 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
2eb70 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
2eb80 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2eb90 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
2eba0 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
2ebb0 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
2ebc0 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
2ebd0 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
2ebe0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
2ebf0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2ec00 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  M_BKPT;.        
2ec10 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53  pNew->pInode->aS
2ec20 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27  emName[0] = '\0'
2ec30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ec40 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2ec50 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ex();.  }.#endif
2ec60 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74 45  .  .  storeLastE
2ec70 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23  rrno(pNew, 0);.#
2ec80 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2ec90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2eca0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d  K ){.    if( h>=
2ecb0 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65  0 ) robust_close
2ecc0 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
2ecd0 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b  __);.    h = -1;
2ece0 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46  .    osUnlink(zF
2ecf0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ilename);.    pN
2ed00 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
2ed10 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
2ed20 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
2ed30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ed40 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2ed50 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2ed60 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2ed70 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  _);.  }else{.   
2ed80 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d   pNew->pMethod =
2ed90 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a   pLockingStyle;.
2eda0 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
2edb0 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44  +1);.    verifyD
2edc0 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d  bFile(pNew);.  }
2edd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ede0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2edf0 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65  e name of a dire
2ee00 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74  ctory in which t
2ee10 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20  o put temporary 
2ee20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20  files..** If no 
2ee30 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61  suitable tempora
2ee40 72 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72  ry file director
2ee50 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20  y can be found, 
2ee60 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
2ee70 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
2ee80 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44  r *unixTempFileD
2ee90 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ir(void){.  stat
2eea0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
2eeb0 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zDirs[] = {.    
2eec0 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
2eed0 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
2eee0 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
2eef0 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
2ef00 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67  ".".  };.  unsig
2ef10 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ned int i = 0;. 
2ef20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
2ef30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2ef40 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74  zDir = sqlite3_t
2ef50 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a  emp_directory;..
2ef60 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d    if( !azDirs[0]
2ef70 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67   ) azDirs[0] = g
2ef80 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d  etenv("SQLITE_TM
2ef90 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61  PDIR");.  if( !a
2efa0 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
2efb0 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54  s[1] = getenv("T
2efc0 4d 50 44 49 52 22 29 3b 0a 20 20 77 68 69 6c 65  MPDIR");.  while
2efd0 28 31 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69  (1){.    if( zDi
2efe0 72 21 3d 30 0a 20 20 20 20 20 26 26 20 6f 73 53  r!=0.     && osS
2eff0 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 3d  tat(zDir, &buf)=
2f000 3d 30 0a 20 20 20 20 20 26 26 20 53 5f 49 53 44  =0.     && S_ISD
2f010 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a  IR(buf.st_mode).
2f020 20 20 20 20 20 26 26 20 6f 73 41 63 63 65 73 73       && osAccess
2f030 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a 20 20  (zDir, 03)==0.  
2f040 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72    ){.      retur
2f050 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a 20 20  n zDir;.    }.  
2f060 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
2f070 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
2f080 7a 44 69 72 73 5b 30 5d 29 20 29 20 62 72 65 61  zDirs[0]) ) brea
2f090 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  k;.    zDir = az
2f0a0 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20  Dirs[i++];.  }. 
2f0b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
2f0c0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2f0d0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2f0e0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2f0f0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2f100 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2f110 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2f120 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2f130 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2f140 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2f150 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2f160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2f170 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2f180 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2f190 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  f){.  const char
2f1a0 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c   *zDir;.  int iL
2f1b0 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  imit = 0;..  /* 
2f1c0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2f1d0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2f1e0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2f1f0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2f200 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2f210 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2f220 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2f230 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2f240 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2f250 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2f260 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20 3d 20   */.  zBuf[0] = 
2f270 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  0;.  SimulateIOE
2f280 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
2f290 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
2f2a0 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
2f2b0 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
2f2c0 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  zDir==0 ) return
2f2d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
2f2e0 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 64 6f 7b  TTEMPPATH;.  do{
2f2f0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
2f300 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2f310 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
2f320 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2f330 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75  Buf>2 );.    zBu
2f340 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20  f[nBuf-2] = 0;. 
2f350 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2f360 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2f370 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
2f380 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c  _FILE_PREFIX"%ll
2f390 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x%c",.          
2f3a0 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
2f3b0 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   r, 0);.    if( 
2f3c0 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20  zBuf[nBuf-2]!=0 
2f3d0 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30  || (iLimit++)>10
2f3e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2f3f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65  _ERROR;.  }while
2f400 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2f410 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2f420 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2f430 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2f440 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2f450 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2f460 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2f470 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2f480 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2f490 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2f4a0 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2f4b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2f4c0 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2f4d0 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2f4e0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2f4f0 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2f500 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2f510 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2f520 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2f530 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2f540 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2f550 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2f560 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2f570 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2f580 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2f590 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2f5a0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2f5b0 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2f5c0 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2f5d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2f5e0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2f5f0 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2f600 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2f610 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2f620 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2f630 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2f640 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2f650 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2f660 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2f670 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2f680 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2f690 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2f6a0 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2f6b0 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2f6c0 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2f6d0 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2f6e0 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2f6f0 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2f700 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2f710 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2f720 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2f730 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2f740 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2f750 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2f760 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2f770 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2f780 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2f790 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2f7a0 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2f7b0 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2f7c0 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2f7d0 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2f7e0 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2f7f0 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2f800 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2f810 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2f820 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2f830 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2f840 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2f850 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2f860 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2f870 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2f880 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2f890 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2f8a0 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2f8b0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2f8c0 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2f8d0 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2f8e0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2f8f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2f900 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2f910 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2f920 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2f930 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2f940 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2f950 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2f960 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2f970 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2f980 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2f990 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2f9a0 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2f9b0 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2f9c0 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2f9d0 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2f9e0 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2f9f0 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2fa00 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2fa10 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2fa20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fa40 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2fa50 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e  () call */..  un
2fa60 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2fa70 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63  .  /* A stat() c
2fa80 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72  all may fail for
2fa90 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73   various reasons
2faa0 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e  . If this happen
2fab0 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c  s, it is.  ** al
2fac0 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61  most certain tha
2fad0 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c  t an open() call
2fae0 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
2faf0 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c  h will also fail
2fb00 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20  ..  ** For this 
2fb10 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72  reason, if an er
2fb20 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ror occurs in th
2fb30 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65  e stat() call he
2fb40 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69  re, it is.  ** i
2fb50 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73  gnored and -1 is
2fb60 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63   returned. The c
2fb70 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74  aller will try t
2fb80 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
2fb90 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f  e.  ** descripto
2fba0 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  r on the same pa
2fbb0 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65  th, fail, and re
2fbc0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f  turn an error to
2fbd0 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20   SQLite..  **.  
2fbe0 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62  ** Even if a sub
2fbf0 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63  sequent open() c
2fc00 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64  all does succeed
2fc10 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63  , the consequenc
2fc20 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73  es of.  ** not s
2fc30 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72  earching for a r
2fc40 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73  eusable file des
2fc50 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20  criptor are not 
2fc60 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  dire.  */.  if( 
2fc70 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 26 26 20  inodeList!=0 && 
2fc80 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
2fc90 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2fca0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
2fcb0 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e 6f  Inode;..    pIno
2fcc0 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
2fcd0 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64      while( pInod
2fce0 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69  e && (pInode->fi
2fcf0 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e  leId.dev!=sStat.
2fd00 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20  st_dev.         
2fd10 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70              || p
2fd20 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
2fd30 6f 21 3d 28 75 36 34 29 73 53 74 61 74 2e 73 74  o!=(u64)sStat.st
2fd40 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
2fd50 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
2fd60 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
2fd70 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
2fd80 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
2fd90 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 61  Fd **pp;.      a
2fda0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
2fdb0 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 49 6e  utex_notheld(pIn
2fdc0 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
2fdd0 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
2fde0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 49  3_mutex_enter(pI
2fdf0 6e 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78  node->pLockMutex
2fe00 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  );.      for(pp=
2fe10 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
2fe20 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
2fe30 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
2fe40 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
2fe50 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
2fe60 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
2fe70 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
2fe80 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
2fe90 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
2fea0 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
2feb0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 49 6e  _mutex_leave(pIn
2fec0 6f 64 65 2d 3e 70 4c 6f 63 6b 4d 75 74 65 78 29  ode->pLockMutex)
2fed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e  ;.    }.  }.  un
2fee0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2fef0 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
2ff00 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
2ff10 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
2ff20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  .}../*.** Find t
2ff30 68 65 20 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64  he mode, uid and
2ff40 20 67 69 64 20 6f 66 20 66 69 6c 65 20 7a 46 69   gid of file zFi
2ff50 6c 65 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  le. .*/.static i
2ff60 6e 74 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 0a  nt getFileMode(.
2ff70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2ff80 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
2ff90 20 20 2f 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a    /* File name *
2ffa0 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
2ffb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2ffc0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
2ffd0 69 73 73 69 6f 6e 73 20 6f 66 20 7a 46 69 6c 65  issions of zFile
2ffe0 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
2fff0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
30000 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
30010 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 20  d of zFile. */. 
30020 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20   gid_t *pGid    
30030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30040 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 6f 66 20   /* OUT: gid of 
30050 7a 46 69 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20 73  zFile. */.){.  s
30060 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
30070 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30080 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74  * Output of stat
30090 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66  () on database f
300a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ile */.  int rc 
300b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
300c0 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 46 69  f( 0==osStat(zFi
300d0 6c 65 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  le, &sStat) ){. 
300e0 20 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61     *pMode = sSta
300f0 74 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37  t.st_mode & 0777
30100 3b 0a 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53  ;.    *pUid = sS
30110 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20  tat.st_uid;.    
30120 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
30130 5f 67 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  _gid;.  }else{. 
30140 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
30150 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a  OERR_FSTAT;.  }.
30160 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
30170 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
30180 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ion is called by
30190 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64   unixOpen() to d
301a0 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69  etermine the uni
301b0 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  x permissions.**
301c0 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66   to create new f
301d0 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f  iles with. If no
301e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
301f0 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  hen SQLITE_OK is
30200 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64   returned.** and
30210 20 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c   a value suitabl
30220 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73  e for passing as
30230 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
30240 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69  ent to open(2) i
30250 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20  s.** written to 
30260 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f  *pMode. If an IO
30270 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
30280 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
30290 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ode is .** retur
302a0 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ned and the valu
302b0 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e  e of *pMode is n
302c0 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a  ot modified..**.
302d0 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73  ** In most cases
302e0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73  , this routine s
302f0 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c  ets *pMode to 0,
30300 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f   which will beco
30310 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74  me.** an indicat
30320 69 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70  ion to robust_op
30330 65 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74  en() to create t
30340 68 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a  he file using.**
30350 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
30360 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53  FILE_PERMISSIONS
30370 20 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65   adjusted by the
30380 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69   umask..** But i
30390 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
303a0 20 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c   opened is a WAL
303b0 20 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72   or regular jour
303c0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a  nal file, then .
303d0 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
303e0 20 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c   queries the fil
303f0 65 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65  e-system for the
30400 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
30410 74 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  the .** correspo
30420 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66  nding database f
30430 69 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d  ile and sets *pM
30440 6f 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75  ode to this valu
30450 65 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20  e. Whenever .** 
30460 70 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e  possible, WAL an
30470 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  d journal files 
30480 61 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e  are created usin
30490 67 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69  g the same permi
304a0 73 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68  ssions .** as th
304b0 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
304c0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
304d0 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
304e0 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53  ENABLE_8_3_NAMES
304f0 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
30500 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ed, then the.** 
30510 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
30520 65 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65  e is unavailable
30530 2e 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53  .  But 8_3_NAMES
30540 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f   is only used fo
30550 72 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73  r.** FAT filesys
30560 74 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73  tems and permiss
30570 69 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74  ions do not matt
30580 65 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73  er there, so jus
30590 74 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66  t use.** the def
305a0 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73  ault permissions
305b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
305c0 66 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f  findCreateFileMo
305d0 64 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de(.  const char
305e0 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
305f0 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
30600 20 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29   file (possibly)
30610 20 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a   being created *
30620 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
30630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30640 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73      /* Flags pas
30650 73 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d  sed as 4th argum
30660 65 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a  ent to xOpen() *
30670 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64  /.  mode_t *pMod
30680 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
30690 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d      /* OUT: Perm
306a0 69 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20  issions to open 
306b0 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
306c0 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20  id_t *pUid,     
306d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
306e0 2a 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65  * OUT: uid to se
306f0 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
30700 0a 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20  .  gid_t *pGid  
30710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30720 20 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74     /* OUT: gid t
30730 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
30740 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
30750 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
30760 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
30770 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70  urn Code */.  *p
30780 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69  Mode = 0;.  *pUi
30790 64 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d  d = 0;.  *pGid =
307a0 20 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20   0;.  if( flags 
307b0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
307c0 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
307d0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
307e0 20 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58      char zDb[MAX
307f0 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20  _PATHNAME+1];   
30800 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69    /* Database fi
30810 6c 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69  le path */.    i
30820 6e 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20  nt nDb;         
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30840 4e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  Number of valid 
30850 62 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a  bytes in zDb */.
30860 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73  .    /* zPath is
30870 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c   a path to a WAL
30880 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
30890 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
308a0 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20  block derives.  
308b0 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f    ** the path to
308c0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
308d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72  database file fr
308e0 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62  om zPath. This b
308f0 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20  lock handles.   
30900 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
30910 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74  g naming convent
30920 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  ions:.    **.   
30930 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
30940 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20  db>-journal".   
30950 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
30960 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20  db>-wal".    ** 
30970 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
30980 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a  journalNN".    *
30990 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
309a0 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a  >-walNN".    **.
309b0 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20      ** where NN 
309c0 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d  is a decimal num
309d0 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69  ber. The NN nami
309e0 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a  ng schemes are .
309f0 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
30a00 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65  he test_multiple
30a10 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20  x.c module..    
30a20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c  */.    nDb = sql
30a30 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61  ite3Strlen30(zPa
30a40 74 68 29 20 2d 20 31 3b 20 0a 20 20 20 20 77 68  th) - 1; .    wh
30a50 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21  ile( zPath[nDb]!
30a60 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ='-' ){.      /*
30a70 20 49 6e 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61   In normal opera
30a80 74 69 6f 6e 2c 20 74 68 65 20 6a 6f 75 72 6e 61  tion, the journa
30a90 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 69 6c 6c  l file name will
30aa0 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e 0a   always contain.
30ab0 20 20 20 20 20 20 2a 2a 20 61 20 27 2d 27 20 63        ** a '-' c
30ac0 68 61 72 61 63 74 65 72 2e 20 20 48 6f 77 65 76  haracter.  Howev
30ad0 65 72 20 69 6e 20 38 2b 33 20 66 69 6c 65 6e 61  er in 8+3 filena
30ae0 6d 65 20 6d 6f 64 65 2c 20 6f 72 20 69 66 20 61  me mode, or if a
30af0 20 63 6f 72 72 75 70 74 0a 20 20 20 20 20 20 2a   corrupt.      *
30b00 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
30b10 61 6c 20 73 70 65 63 69 66 69 65 73 20 61 20 6d  al specifies a m
30b20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 77 69  aster journal wi
30b30 74 68 20 61 20 67 6f 6f 66 79 20 6e 61 6d 65 2c  th a goofy name,
30b40 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74   then.      ** t
30b50 68 65 20 27 2d 27 20 6d 69 67 68 74 20 62 65 20  he '-' might be 
30b60 6d 69 73 73 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  missing. */.    
30b70 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20    if( nDb==0 || 
30b80 7a 50 61 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20  zPath[nDb]=='.' 
30b90 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
30ba0 4f 4b 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b  OK;.      nDb--;
30bb0 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70  .    }.    memcp
30bc0 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
30bd0 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
30be0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 72 63   = '\0';..    rc
30bf0 20 3d 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a   = getFileMode(z
30c00 44 62 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c  Db, pMode, pUid,
30c10 20 70 47 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20   pGid);.  }else 
30c20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
30c30 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
30c40 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d  CLOSE ){.    *pM
30c50 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65  ode = 0600;.  }e
30c60 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
30c70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
30c80 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
30c90 73 20 69 73 20 61 20 6d 61 69 6e 20 64 61 74 61  s is a main data
30ca0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
30cb0 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
30cc0 64 20 75 73 69 6e 67 20 61 20 55 52 49 0a 20 20  d using a URI.  
30cd0 20 20 2a 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 63    ** filename, c
30ce0 68 65 63 6b 20 66 6f 72 20 74 68 65 20 22 6d 6f  heck for the "mo
30cf0 64 65 6f 66 22 20 70 61 72 61 6d 65 74 65 72 2e  deof" parameter.
30d00 20 49 66 20 70 72 65 73 65 6e 74 2c 20 69 6e 74   If present, int
30d10 65 72 70 72 65 74 0a 20 20 20 20 2a 2a 20 69 74  erpret.    ** it
30d20 73 20 76 61 6c 75 65 20 61 73 20 61 20 66 69 6c  s value as a fil
30d30 65 6e 61 6d 65 20 61 6e 64 20 74 72 79 20 74 6f  ename and try to
30d40 20 63 6f 70 79 20 74 68 65 20 6d 6f 64 65 2c 20   copy the mode, 
30d50 75 69 64 20 61 6e 64 20 67 69 64 20 66 72 6f 6d  uid and gid from
30d60 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 66 69 6c  .    ** that fil
30d70 65 2e 20 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  e.  */.    const
30d80 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
30d90 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
30da0 28 7a 50 61 74 68 2c 20 22 6d 6f 64 65 6f 66 22  (zPath, "modeof"
30db0 29 3b 0a 20 20 20 20 69 66 28 20 7a 20 29 7b 0a  );.    if( z ){.
30dc0 20 20 20 20 20 20 72 63 20 3d 20 67 65 74 46 69        rc = getFi
30dd0 6c 65 4d 6f 64 65 28 7a 2c 20 70 4d 6f 64 65 2c  leMode(z, pMode,
30de0 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20 20   pUid, pGid);.  
30df0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
30e00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
30e10 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74  en the file zPat
30e20 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f  h..** .** Previo
30e30 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65  usly, the SQLite
30e40 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74   OS layer used t
30e50 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  hree functions i
30e60 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a  n place of this.
30e70 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  ** one:.**.**   
30e80 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
30e90 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20  eadWrite();.**  
30ea0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
30eb0 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20  ReadOnly();.**  
30ec0 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
30ed0 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a  Exclusive();.**.
30ee0 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63  ** These calls c
30ef0 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65  orrespond to the
30f00 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69   following combi
30f10 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73  nations of flags
30f20 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64  :.**.**     Read
30f30 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28  Write() ->     (
30f40 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
30f50 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f  TE).**     ReadO
30f60 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52  nly()  ->     (R
30f70 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20  EADONLY) .**    
30f80 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
30f90 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c   -> (READWRITE |
30fa0 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53   CREATE | EXCLUS
30fb0 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  IVE).**.** The o
30fc0 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ld OpenExclusive
30fd0 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f  () accepted a bo
30fe0 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d  olean argument -
30ff0 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a   "delFlag". If.*
31000 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65  * true, the file
31010 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   was configured 
31020 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  to be automatica
31030 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e  lly deleted when
31040 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e   the.** file han
31050 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61  dle closed. To a
31060 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20  chieve the same 
31070 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69  effect using thi
31080 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66  s new .** interf
31090 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c  ace, add the DEL
310a0 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20  ETEONCLOSE flag 
310b0 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69  to those specifi
310c0 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a  ed above for .**
310d0 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
310e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
310f0 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69  unixOpen(.  sqli
31100 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
31110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
31120 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68  VFS for which th
31130 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20  is is the xOpen 
31140 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73  method */.  cons
31150 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
31160 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68           /* Path
31170 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  name of file to 
31180 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  be opened */.  s
31190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
311a0 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  le,         /* T
311b0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
311c0 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20  or to be filled 
311d0 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  in */.  int flag
311e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
311f0 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c       /* Input fl
31200 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  ags to control t
31210 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  he opening */.  
31220 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20  int *pOutFlags  
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31240 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74  Output flags ret
31250 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20  urned to SQLite 
31260 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  core */.){.  uni
31270 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78  xFile *p = (unix
31280 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  File *)pFile;.  
31290 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20  int fd = -1;    
312a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
312b0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
312c0 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70  r returned by op
312d0 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  en() */.  int op
312e0 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20  enFlags = 0;    
312f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
31300 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65  s to pass to ope
31310 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79  n() */.  int eTy
31320 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 46  pe = flags&0xFFF
31330 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
31340 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
31350 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b  */.  int noLock;
31360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31370 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
31380 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d  mit locking prim
31390 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20  itives */.  int 
313a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
313b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
313c0 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f  nction Return Co
313d0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c  de */.  int ctrl
313e0 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
313f0 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46 49         /* UNIXFI
31400 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20  LE_* flags */.. 
31410 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65   int isExclusive
31420 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
31430 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
31440 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c  VE);.  int isDel
31450 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73  ete     = (flags
31460 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
31470 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20  ELETEONCLOSE);. 
31480 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20 20   int isCreate   
31490 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
314a0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
314b0 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e  ;.  int isReadon
314c0 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ly   = (flags & 
314d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
314e0 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52  ONLY);.  int isR
314f0 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61  eadWrite  = (fla
31500 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
31510 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66  _READWRITE);.#if
31520 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
31530 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
31540 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20  nt isAutoProxy  
31550 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
31560 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
31570 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
31580 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
31590 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
315a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
315b0 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
315c0 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a  fsInfo;.#endif..
315d0 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e 67    /* If creating
315e0 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61 69   a master or mai
315f0 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20  n-file journal, 
31600 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69  this function wi
31610 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66  ll open.  ** a f
31620 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 6f  ile-descriptor o
31630 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  n the directory 
31640 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20 74  too. The first t
31650 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a 20  ime unixSync(). 
31660 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74 68   ** is called th
31670 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
31680 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c   descriptor will
31690 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61 6e   be fsync()ed an
316a0 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f  d close()d..  */
316b0 0a 20 20 69 6e 74 20 69 73 4e 65 77 4a 72 6e 6c  .  int isNewJrnl
316c0 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20   = (isCreate && 
316d0 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d  (.        eType=
316e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
316f0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
31700 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
31710 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
31720 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54  RNAL .     || eT
31730 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
31740 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  _WAL.  ));..  /*
31750 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61   If argument zPa
31760 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  th is a NULL poi
31770 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74  nter, this funct
31780 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20  ion is required 
31790 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74  to open.  ** a t
317a0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55  emporary file. U
317b0 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74  se this buffer t
317c0 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65  o store the file
317d0 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20   name in..  */. 
317e0 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d   char zTmpname[M
317f0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a  AX_PATHNAME+2];.
31800 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
31810 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20  ame = zPath;..  
31820 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c  /* Check the fol
31830 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74  lowing statement
31840 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a  s are true: .  *
31850 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61  *.  **   (a) Exa
31860 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  ctly one of the 
31870 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45  READWRITE and RE
31880 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73  ADONLY flags mus
31890 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20  t be set, and . 
318a0 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45   **   (b) if CRE
318b0 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  ATE is set, then
318c0 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20   READWRITE must 
318d0 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64  also be set, and
318e0 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45  .  **   (c) if E
318f0 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c  XCLUSIVE is set,
31900 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73   then CREATE mus
31910 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20  t also be set.. 
31920 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c   **   (d) if DEL
31930 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65  ETEONCLOSE is se
31940 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d  t, then CREATE m
31950 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e  ust also be set.
31960 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28  .  */.  assert((
31970 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c  isReadonly==0 ||
31980 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29   isReadWrite==0)
31990 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65   && (isReadWrite
319a0 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29   || isReadonly))
319b0 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65  ;.  assert(isCre
319c0 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64  ate==0 || isRead
319d0 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74  Write);.  assert
319e0 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20  (isExclusive==0 
319f0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20  || isCreate);.  
31a00 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d  assert(isDelete=
31a10 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
31a20 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20  ..  /* The main 
31a30 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  DB, main journal
31a40 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d  , WAL file and m
31a50 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72  aster journal ar
31a60 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75  e never .  ** au
31a70 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
31a80 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65  ted. Nor are the
31a90 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79  y ever temporary
31aa0 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73   files.  */.  as
31ab0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
31ac0 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
31ad0 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
31ae0 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73  _MAIN_DB );.  as
31af0 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
31b00 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
31b10 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
31b20 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b  _MAIN_JOURNAL );
31b30 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44  .  assert( (!isD
31b40 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20  elete && zName) 
31b50 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  || eType!=SQLITE
31b60 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
31b70 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
31b80 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
31b90 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
31ba0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
31bb0 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74   );..  /* Assert
31bc0 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20   that the upper 
31bd0 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e  layer has set on
31be0 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74  e of the "file-t
31bf0 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20  ype" flags. */. 
31c00 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d   assert( eType==
31c10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31c20 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70  _DB      || eTyp
31c30 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
31c40 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c  EMP_DB .       |
31c50 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
31c60 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
31c70 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49  L || eType==SQLI
31c80 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
31c90 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
31ca0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
31cb0 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20  EN_SUBJOURNAL   
31cc0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
31cd0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
31ce0 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20  RNAL .       || 
31cf0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
31d00 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
31d10 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
31d20 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a  _OPEN_WAL.  );..
31d30 20 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70 69    /* Detect a pi
31d40 64 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65 73  d change and res
31d50 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54 68  et the PRNG.  Th
31d60 65 72 65 20 69 73 20 61 20 72 61 63 65 20 63 6f  ere is a race co
31d70 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72  ndition.  ** her
31d80 65 20 73 75 63 68 20 74 68 61 74 20 74 77 6f 20  e such that two 
31d90 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73 20  or more threads 
31da0 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f 70  all trying to op
31db0 65 6e 20 64 61 74 61 62 61 73 65 73 20 61 74 0a  en databases at.
31dc0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69 6e    ** the same in
31dd0 73 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20  stant might all 
31de0 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20  reset the PRNG. 
31df0 20 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72 65   But multiple re
31e00 73 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68 61  sets.  ** are ha
31e10 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  rmless..  */.  i
31e20 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  f( randomnessPid
31e30 21 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29 7b  !=osGetpid(0) ){
31e40 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50  .    randomnessP
31e50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29  id = osGetpid(0)
31e60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61  ;.    sqlite3_ra
31e70 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20  ndomness(0,0);. 
31e80 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30   }.  memset(p, 0
31e90 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
31ea0 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54 79 70  e));..  if( eTyp
31eb0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
31ec0 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e  AIN_DB ){.    Un
31ed0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75  ixUnusedFd *pUnu
31ee0 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73 65 64  sed;.    pUnused
31ef0 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c 65 46   = findReusableF
31f00 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b  d(zName, flags);
31f10 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64  .    if( pUnused
31f20 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d 20 70   ){.      fd = p
31f30 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20  Unused->fd;.    
31f40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 55 6e  }else{.      pUn
31f50 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
31f60 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a  alloc64(sizeof(*
31f70 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 20  pUnused));.     
31f80 20 69 66 28 20 21 70 55 6e 75 73 65 64 20 29 7b   if( !pUnused ){
31f90 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
31fa0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
31fb0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
31fc0 0a 20 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f  .    p->pPreallo
31fd0 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 70 55  catedUnused = pU
31fe0 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44  nused;..    /* D
31ff0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
32000 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72  s are double-zer
32010 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66 20  o terminated if 
32020 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20 20  they are not.   
32030 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70 61   ** URIs with pa
32040 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63 65  rameters.  Hence
32050 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61 79  , they can alway
32060 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74 6f  s be passed into
32070 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
32080 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29 2e  uri_parameter().
32090 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
320a0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
320b0 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61  OPEN_URI) || zNa
320c0 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
320d0 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c  +1]==0 );..  }el
320e0 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b  se if( !zName ){
320f0 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65  .    /* If zName
32100 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70   is NULL, the up
32110 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65 71  per layer is req
32120 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20 66  uesting a temp f
32130 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
32140 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20 21  rt(isDelete && !
32150 69 73 4e 65 77 4a 72 6e 6c 29 3b 0a 20 20 20 20  isNewJrnl);.    
32160 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70  rc = unixGetTemp
32170 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74  name(pVfs->mxPat
32180 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29  hname, zTmpname)
32190 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
321a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
321b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
321c0 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54  }.    zName = zT
321d0 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20  mpname;..    /* 
321e0 47 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72  Generated tempor
321f0 61 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  ary filenames ar
32200 65 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d  e always double-
32210 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a  zero terminated.
32220 20 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62      ** for use b
32230 79 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61  y sqlite3_uri_pa
32240 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20  rameter(). */.  
32250 20 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b    assert( zName[
32260 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
32270 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ==0 );.  }..  /*
32280 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76   Determine the v
32290 61 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67  alue of the flag
322a0 73 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73  s parameter pass
322b0 65 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63  ed to POSIX func
322c0 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29  tion.  ** open()
322d0 2e 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20  . These must be 
322e0 63 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20  calculated even 
322f0 69 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74  if open() is not
32300 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a   called, as.  **
32310 20 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f   they may be sto
32320 72 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  red as part of t
32330 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61  he file handle a
32340 6e 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a  nd used by the .
32350 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65    ** 'conch file
32360 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69  ' locking functi
32370 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a  ons later on.  *
32380 2f 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e  /.  if( isReadon
32390 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20  ly )  openFlags 
323a0 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69  |= O_RDONLY;.  i
323b0 66 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29  f( isReadWrite )
323c0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
323d0 52 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72  RDWR;.  if( isCr
323e0 65 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c  eate )    openFl
323f0 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a  ags |= O_CREAT;.
32400 20 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76    if( isExclusiv
32410 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
32420 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c   (O_EXCL|O_NOFOL
32430 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67  LOW);.  openFlag
32440 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c  s |= (O_LARGEFIL
32450 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20  E|O_BINARY);..  
32460 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
32470 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b  mode_t openMode;
32480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32490 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
324a0 63 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68  create file with
324b0 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69   */.    uid_t ui
324c0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
324d0 20 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20        /* Userid 
324e0 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
324f0 20 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20      gid_t gid;  
32500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32510 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72    /* Groupid for
32520 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
32530 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65   rc = findCreate
32540 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20  FileMode(zName, 
32550 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65  flags, &openMode
32560 2c 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20  , &uid, &gid);. 
32570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
32590 73 65 72 74 28 20 21 70 2d 3e 70 50 72 65 61 6c  sert( !p->pPreal
325a0 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 29 3b  locatedUnused );
325b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65  .      assert( e
325c0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
325d0 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d  N_WAL || eType==
325e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
325f0 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20  _JOURNAL );.    
32600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
32610 20 7d 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75   }.    fd = robu
32620 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f  st_open(zName, o
32630 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
32640 64 65 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  de);.    OSTRACE
32650 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
32660 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
32670 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
32680 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
32690 69 73 45 78 63 6c 75 73 69 76 65 20 7c 7c 20 28  isExclusive || (
326a0 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52  openFlags & O_CR
326b0 45 41 54 29 21 3d 30 20 29 3b 0a 20 20 20 20 69  EAT)!=0 );.    i
326c0 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
326d0 20 69 66 28 20 69 73 4e 65 77 4a 72 6e 6c 20 26   if( isNewJrnl &
326e0 26 20 65 72 72 6e 6f 3d 3d 45 41 43 43 45 53 20  & errno==EACCES 
326f0 26 26 20 6f 73 41 63 63 65 73 73 28 7a 4e 61 6d  && osAccess(zNam
32700 65 2c 20 46 5f 4f 4b 29 20 29 7b 0a 20 20 20 20  e, F_OK) ){.    
32710 20 20 20 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65      /* If unable
32720 20 74 6f 20 63 72 65 61 74 65 20 61 20 6a 6f 75   to create a jou
32730 72 6e 61 6c 20 62 65 63 61 75 73 65 20 74 68 65  rnal because the
32740 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 6e 6f   directory is no
32750 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69  t.        ** wri
32760 74 61 62 6c 65 2c 20 63 68 61 6e 67 65 20 74 68  table, change th
32770 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  e error code to 
32780 69 6e 64 69 63 61 74 65 20 74 68 61 74 2e 20 2a  indicate that. *
32790 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  /.        rc = S
327a0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44  QLITE_READONLY_D
327b0 49 52 45 43 54 4f 52 59 3b 0a 20 20 20 20 20 20  IRECTORY;.      
327c0 7d 65 6c 73 65 20 69 66 28 20 65 72 72 6e 6f 21  }else if( errno!
327d0 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
327e0 64 57 72 69 74 65 20 29 7b 0a 20 20 20 20 20 20  dWrite ){.      
327f0 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f    /* Failed to o
32800 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72  pen the file for
32810 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
32820 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c  ss. Try read-onl
32830 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c  y. */.        fl
32840 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
32850 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
32860 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
32870 45 29 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e  E);.        open
32880 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57  Flags &= ~(O_RDW
32890 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20  R|O_CREAT);.    
328a0 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
328b0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
328c0 59 3b 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46  Y;.        openF
328d0 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59  lags |= O_RDONLY
328e0 3b 0a 20 20 20 20 20 20 20 20 69 73 52 65 61 64  ;.        isRead
328f0 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20  only = 1;.      
32900 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
32910 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c  en(zName, openFl
32920 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a  ags, openMode);.
32930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
32940 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
32950 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 75 6e      int rc2 = un
32960 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
32970 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
32980 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "open", zName);
32990 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
329a0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20  QLITE_OK ) rc = 
329b0 72 63 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  rc2;.      goto 
329c0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
329d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
329e0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
329f0 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20  running as root 
32a00 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67 20  and if creating 
32a10 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20  a new rollback. 
32a20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72     ** journal or
32a30 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20 74   WAL file, set t
32a40 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  he ownership of 
32a50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57  the journal or W
32a60 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  AL to be.    ** 
32a70 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
32a80 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
32a90 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
32aa0 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
32ab0 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
32ac0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
32ad0 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 72 6f  NAL) ){.      ro
32ae0 62 75 73 74 46 63 68 6f 77 6e 28 66 64 2c 20 75  bustFchown(fd, u
32af0 69 64 2c 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a  id, gid);.    }.
32b00 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 66 64    }.  assert( fd
32b10 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 4f 75  >=0 );.  if( pOu
32b20 74 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 2a 70  tFlags ){.    *p
32b30 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  OutFlags = flags
32b40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
32b50 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
32b60 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50  sed ){.    p->pP
32b70 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
32b80 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20 20 20  d->fd = fd;.    
32b90 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
32ba0 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20  Unused->flags = 
32bb0 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
32bc0 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23 69  ( isDelete ){.#i
32bd0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20  f OS_VXWORKS.   
32be0 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a   zPath = zName;.
32bf0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53 51  #elif defined(SQ
32c00 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45  LITE_UNLINK_AFTE
32c10 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61  R_CLOSE).    zPa
32c20 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  th = sqlite3_mpr
32c30 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65  intf("%s", zName
32c40 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74 68  );.    if( zPath
32c50 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62  ==0 ){.      rob
32c60 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
32c70 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
32c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
32c90 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
32ca0 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e  }.#else.    osUn
32cb0 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e  link(zName);.#en
32cc0 64 69 66 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49  dif.  }.#if SQLI
32cd0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
32ce0 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a  G_STYLE.  else{.
32cf0 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73      p->openFlags
32d00 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20   = openFlags;.  
32d10 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69 66 20  }.#endif.  .#if 
32d20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
32d30 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41  _) || SQLITE_ENA
32d40 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32d50 45 0a 20 20 69 66 28 20 66 73 74 61 74 66 73 28  E.  if( fstatfs(
32d60 66 64 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20  fd, &fsInfo) == 
32d70 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c  -1 ){.    storeL
32d80 61 73 74 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e  astErrno(p, errn
32d90 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  o);.    robust_c
32da0 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49  lose(p, fd, __LI
32db0 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65 74 75 72  NE__);.    retur
32dc0 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  n SQLITE_IOERR_A
32dd0 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20  CCESS;.  }.  if 
32de0 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d  (0 == strncmp("m
32df0 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f  sdos", fsInfo.f_
32e00 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29 29 20  fstypename, 5)) 
32e10 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
32e20 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67  *)pFile)->fsFlag
32e30 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c  s |= SQLITE_FSFL
32e40 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20  AGS_IS_MSDOS;.  
32e50 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72  }.  if (0 == str
32e60 6e 63 6d 70 28 22 65 78 66 61 74 22 2c 20 66 73  ncmp("exfat", fs
32e70 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
32e80 65 2c 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75  e, 5)) {.    ((u
32e90 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d  nixFile*)pFile)-
32ea0 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49  >fsFlags |= SQLI
32eb0 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53  TE_FSFLAGS_IS_MS
32ec0 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  DOS;.  }.#endif.
32ed0 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 61 70 70  .  /* Set up app
32ee0 72 6f 70 72 69 61 74 65 20 63 74 72 6c 46 6c 61  ropriate ctrlFla
32ef0 67 73 20 2a 2f 0a 20 20 69 66 28 20 69 73 44 65  gs */.  if( isDe
32f00 6c 65 74 65 20 29 20 20 20 20 20 20 20 20 20 20  lete )          
32f10 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
32f20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
32f30 54 45 3b 0a 20 20 69 66 28 20 69 73 52 65 61 64  TE;.  if( isRead
32f40 6f 6e 6c 79 20 29 20 20 20 20 20 20 20 20 20 20  only )          
32f50 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
32f60 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
32f70 3b 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79  ;.  noLock = eTy
32f80 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
32f90 4d 41 49 4e 5f 44 42 3b 0a 20 20 69 66 28 20 6e  MAIN_DB;.  if( n
32fa0 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20  oLock )         
32fb0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
32fc0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
32fd0 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20 69 73 4e  OLOCK;.  if( isN
32fe0 65 77 4a 72 6e 6c 20 29 20 20 20 20 20 20 20 20  ewJrnl )        
32ff0 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
33000 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52   |= UNIXFILE_DIR
33010 53 59 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67  SYNC;.  if( flag
33020 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
33030 55 52 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20  URI ) ctrlFlags 
33040 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b  |= UNIXFILE_URI;
33050 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
33060 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
33070 45 0a 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45  E.#if SQLITE_PRE
33080 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
33090 47 0a 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20  G.  isAutoProxy 
330a0 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  = 1;.#endif.  if
330b0 28 20 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26  ( isAutoProxy &&
330c0 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26   (zPath!=NULL) &
330d0 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70  & (!noLock) && p
330e0 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20  Vfs->xOpen ){.  
330f0 20 20 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65    char *envforce
33100 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54   = getenv("SQLIT
33110 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
33120 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74  CKING");.    int
33130 20 75 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a   useProxy = 0;..
33140 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
33150 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
33160 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65  G==1 means force
33170 20 61 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78   always use prox
33180 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20  y, 0 means .    
33190 2a 2a 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f  ** never use pro
331a0 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75  xy, NULL means u
331b0 73 65 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e  se proxy for non
331c0 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c  -local files onl
331d0 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  y.  */.    if( e
331e0 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b  nvforce!=NULL ){
331f0 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79 20  .      useProxy 
33200 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29  = atoi(envforce)
33210 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  >0;.    }else{. 
33220 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
33230 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  !(fsInfo.f_flags
33240 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20  &MNT_LOCAL);.   
33250 20 7d 0a 20 20 20 20 69 66 28 20 75 73 65 50 72   }.    if( usePr
33260 6f 78 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20  oxy ){.      rc 
33270 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  = fillInUnixFile
33280 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65  (pVfs, fd, pFile
33290 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61  , zPath, ctrlFla
332a0 67 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  gs);.      if( r
332b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
332c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f          rc = pro
332d0 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46  xyTransformUnixF
332e0 69 6c 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70  ile((unixFile*)p
332f0 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b  File, ":auto:");
33300 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
33310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
33320 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75          /* Use u
33330 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61  nixClose to clea
33340 6e 20 75 70 20 74 68 65 20 72 65 73 6f 75 72 63  n up the resourc
33350 65 73 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c  es added in fill
33360 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20  InUnixFile .    
33370 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65        ** and cle
33380 61 72 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63  ar all the struc
33390 74 75 72 65 27 73 20 72 65 66 65 72 65 6e 63 65  ture's reference
333a0 73 2e 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79  s.  Specifically
333b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  , .          ** 
333c0 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
333d0 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20  will be NULL so 
333e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77  sqlite3OsClose w
333f0 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a  ill be a no-op .
33400 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
33410 20 20 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65         unixClose
33420 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
33430 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
33440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
33450 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f        goto open_
33460 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a  finished;.    }.
33470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
33480 61 73 73 65 72 74 28 20 7a 50 61 74 68 3d 3d 30  assert( zPath==0
33490 20 7c 7c 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f   || zPath[0]=='/
334a0 27 20 0a 20 20 20 20 20 20 7c 7c 20 65 54 79 70  ' .      || eTyp
334b0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
334c0 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c  ASTER_JOURNAL ||
334d0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
334e0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
334f0 20 0a 20 20 29 3b 0a 20 20 72 63 20 3d 20 66 69   .  );.  rc = fi
33500 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56 66  llInUnixFile(pVf
33510 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50  s, fd, pFile, zP
33520 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b  ath, ctrlFlags);
33530 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a  ..open_finished:
33540 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
33550 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
33560 74 65 33 5f 66 72 65 65 28 70 2d 3e 70 50 72 65  te3_free(p->pPre
33570 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 29  allocatedUnused)
33580 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
33590 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  c;.}.../*.** Del
335a0 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74 20  ete the file at 
335b0 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69  zPath. If the di
335c0 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69  rSync argument i
335d0 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a  s true, fsync().
335e0 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ** the directory
335f0 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20   after deleting 
33600 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
33610 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65  tic int unixDele
33620 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  te(.  sqlite3_vf
33630 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20  s *NotUsed,     
33640 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e  /* VFS containin
33650 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78 44  g this as the xD
33660 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  elete method */.
33670 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
33680 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e  ath,        /* N
33690 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
336a0 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69  e deleted */.  i
336b0 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20 20  nt dirSync      
336c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74           /* If t
336d0 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72  rue, fsync() dir
336e0 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c  ectory after del
336f0 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b  eting file */.){
33700 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
33710 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f  TE_OK;.  UNUSED_
33720 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
33730 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
33740 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c  Error(return SQL
33750 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
33760 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e  );.  if( osUnlin
33770 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20 29  k(zPath)==(-1) )
33780 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d  {.    if( errno=
33790 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56  =ENOENT.#if OS_V
337a0 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 20 20 7c  XWORKS.        |
337b0 7c 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74 68  | osAccess(zPath
337c0 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20  ,0)!=0.#endif.  
337d0 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
337e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
337f0 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d  ETE_NOENT;.    }
33800 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
33810 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
33820 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
33830 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61  E, "unlink", zPa
33840 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  th);.    }.    r
33850 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69  eturn rc;.  }.#i
33860 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
33870 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 69  ABLE_DIRSYNC.  i
33880 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31 29  f( (dirSync & 1)
33890 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  !=0 ){.    int f
338a0 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  d;.    rc = osOp
338b0 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61 74  enDirectory(zPat
338c0 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66 28  h, &fd);.    if(
338d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
338e0 7b 0a 20 20 20 20 20 20 69 66 28 20 66 75 6c 6c  {.      if( full
338f0 5f 66 73 79 6e 63 28 66 64 2c 30 2c 30 29 20 29  _fsync(fd,0,0) )
33900 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
33910 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
33920 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
33930 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20 7a 50 61  NC, "fsync", zPa
33940 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
33950 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
33960 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
33970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33980 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
33990 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29  QLITE_CANTOPEN )
339a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
339b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
339c0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
339d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
339e0 65 73 74 20 74 68 65 20 65 78 69 73 74 65 6e 63  est the existenc
339f0 65 20 6f 66 20 6f 72 20 61 63 63 65 73 73 20 70  e of or access p
33a00 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66 20 66 69  ermissions of fi
33a10 6c 65 20 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a  le zPath. The.**
33a20 20 74 65 73 74 20 70 65 72 66 6f 72 6d 65 64 20   test performed 
33a30 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
33a40 61 6c 75 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  alue of flags:.*
33a50 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  *.**     SQLITE_
33a60 41 43 43 45 53 53 5f 45 58 49 53 54 53 3a 20 52  ACCESS_EXISTS: R
33a70 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
33a80 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a 20 20 20  ile exists.**   
33a90 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f    SQLITE_ACCESS_
33aa0 52 45 41 44 57 52 49 54 45 3a 20 52 65 74 75 72  READWRITE: Retur
33ab0 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65 20  n 1 if the file 
33ac0 69 73 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  is read and writ
33ad0 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c  able..**     SQL
33ae0 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 4f  ITE_ACCESS_READO
33af0 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31 20 69 66  NLY: Return 1 if
33b00 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
33b10 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  dable..**.** Oth
33b20 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 30 2e  erwise return 0.
33b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
33b40 6e 69 78 41 63 63 65 73 73 28 0a 20 20 73 71 6c  nixAccess(.  sql
33b50 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
33b60 64 2c 20 20 20 2f 2a 20 54 68 65 20 56 46 53 20  d,   /* The VFS 
33b70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
33b80 78 41 63 63 65 73 73 20 6d 65 74 68 6f 64 20 2a  xAccess method *
33b90 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
33ba0 7a 50 61 74 68 2c 20 20 20 20 20 20 2f 2a 20 50  zPath,      /* P
33bb0 61 74 68 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ath of the file 
33bc0 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20  to examine */.  
33bd0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
33be0 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
33bf0 64 6f 20 77 65 20 77 61 6e 74 20 74 6f 20 6c 65  do we want to le
33c00 61 72 6e 20 61 62 6f 75 74 20 74 68 65 20 7a 50  arn about the zP
33c10 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69  ath file? */.  i
33c20 6e 74 20 2a 70 52 65 73 4f 75 74 20 20 20 20 20  nt *pResOut     
33c30 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
33c40 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68  result boolean h
33c50 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ere */.){.  UNUS
33c60 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
33c70 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
33c80 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
33c90 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43   SQLITE_IOERR_AC
33ca0 43 45 53 53 3b 20 29 3b 0a 20 20 61 73 73 65 72  CESS; );.  asser
33cb0 74 28 20 70 52 65 73 4f 75 74 21 3d 30 20 29 3b  t( pResOut!=0 );
33cc0 0a 0a 20 20 2f 2a 20 54 68 65 20 73 70 65 63 20  ..  /* The spec 
33cd0 73 61 79 73 20 74 68 65 72 65 20 61 72 65 20 74  says there are t
33ce0 68 72 65 65 20 70 6f 73 73 69 62 6c 65 20 76 61  hree possible va
33cf0 6c 75 65 73 20 66 6f 72 20 66 6c 61 67 73 2e 20  lues for flags. 
33d00 20 42 75 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74   But only.  ** t
33d10 77 6f 20 6f 66 20 74 68 65 6d 20 61 72 65 20 61  wo of them are a
33d20 63 74 75 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a  ctually used */.
33d30 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d    assert( flags=
33d40 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45  =SQLITE_ACCESS_E
33d50 58 49 53 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d  XISTS || flags==
33d60 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
33d70 41 44 57 52 49 54 45 20 29 3b 0a 0a 20 20 69 66  ADWRITE );..  if
33d80 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f  ( flags==SQLITE_
33d90 41 43 43 45 53 53 5f 45 58 49 53 54 53 20 29 7b  ACCESS_EXISTS ){
33da0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
33db0 20 62 75 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f   buf;.    *pResO
33dc0 75 74 20 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28  ut = (0==osStat(
33dd0 7a 50 61 74 68 2c 20 26 62 75 66 29 20 26 26 20  zPath, &buf) && 
33de0 62 75 66 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a  buf.st_size>0);.
33df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52    }else{.    *pR
33e00 65 73 4f 75 74 20 3d 20 6f 73 41 63 63 65 73 73  esOut = osAccess
33e10 28 7a 50 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f  (zPath, W_OK|R_O
33e20 4b 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74  K)==0;.  }.  ret
33e30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
33e40 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
33e50 63 20 69 6e 74 20 6d 6b 46 75 6c 6c 50 61 74 68  c int mkFullPath
33e60 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63 68  name(.  const ch
33e70 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20  ar *zPath,      
33e80 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
33e90 20 70 61 74 68 20 2a 2f 0a 20 20 63 68 61 72 20   path */.  char 
33ea0 2a 7a 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20  *zOut,          
33eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
33ec0 74 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 20  tput buffer */. 
33ed0 20 69 6e 74 20 6e 4f 75 74 20 20 20 20 20 20 20   int nOut       
33ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ef0 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69   /* Allocated si
33f00 7a 65 20 6f 66 20 62 75 66 66 65 72 20 7a 4f 75  ze of buffer zOu
33f10 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50  t */.){.  int nP
33f20 61 74 68 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ath = sqlite3Str
33f30 6c 65 6e 33 30 28 7a 50 61 74 68 29 3b 0a 20 20  len30(zPath);.  
33f40 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  int iOff = 0;.  
33f50 69 66 28 20 7a 50 61 74 68 5b 30 5d 21 3d 27 2f  if( zPath[0]!='/
33f60 27 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 73 47  ' ){.    if( osG
33f70 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
33f80 2d 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -2)==0 ){.      
33f90 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
33fa0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
33fb0 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65 74 63 77  PEN_BKPT, "getcw
33fc0 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20  d", zPath);.    
33fd0 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c  }.    iOff = sql
33fe0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75  ite3Strlen30(zOu
33ff0 74 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66  t);.    zOut[iOf
34000 66 2b 2b 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a  f++] = '/';.  }.
34010 20 20 69 66 28 20 28 69 4f 66 66 2b 6e 50 61 74    if( (iOff+nPat
34020 68 2b 31 29 3e 6e 4f 75 74 20 29 7b 0a 20 20 20  h+1)>nOut ){.   
34030 20 2f 2a 20 53 51 4c 69 74 65 20 61 73 73 75 6d   /* SQLite assum
34040 65 73 20 74 68 61 74 20 78 46 75 6c 6c 50 61 74  es that xFullPat
34050 68 6e 61 6d 65 28 29 20 6e 75 6c 2d 74 65 72 6d  hname() nul-term
34060 69 6e 61 74 65 73 20 74 68 65 20 6f 75 74 70 75  inates the outpu
34070 74 20 62 75 66 66 65 72 0a 20 20 20 20 2a 2a 20  t buffer.    ** 
34080 65 76 65 6e 20 69 66 20 69 74 20 72 65 74 75 72  even if it retur
34090 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f  ns an error.  */
340a0 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66 66 5d 20  .    zOut[iOff] 
340b0 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72 65 74 75  = '\0';.    retu
340c0 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
340d0 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  EN_BKPT;.  }.  s
340e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
340f0 6e 4f 75 74 2d 69 4f 66 66 2c 20 26 7a 4f 75 74  nOut-iOff, &zOut
34100 5b 69 4f 66 66 5d 2c 20 22 25 73 22 2c 20 7a 50  [iOff], "%s", zP
34110 61 74 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ath);.  return S
34120 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
34130 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69  ** Turn a relati
34140 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f  ve pathname into
34150 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65   a full pathname
34160 2e 20 54 68 65 20 72 65 6c 61 74 69 76 65 20 70  . The relative p
34170 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64  ath.** is stored
34180 20 61 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e   as a nul-termin
34190 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74  ated string in t
341a0 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
341b0 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68  d to by.** zPath
341c0 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f  . .**.** zOut po
341d0 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
341e0 20 6f 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c   of at least sql
341f0 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e  ite3_vfs.mxPathn
34200 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69  ame bytes .** (i
34210 6e 20 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58  n this case, MAX
34220 5f 50 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29  _PATHNAME bytes)
34230 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20  . The full-path 
34240 69 73 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  is written to.**
34250 20 74 68 69 73 20 62 75 66 66 65 72 20 62 65 66   this buffer bef
34260 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
34270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
34280 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20  xFullPathname(. 
34290 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
342a0 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
342b0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73  * Pointer to vfs
342c0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e   object */.  con
342d0 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
342e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
342f0 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20  ssibly relative 
34300 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20  input path */.  
34310 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20  int nOut,       
34320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34330 20 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20   Size of output 
34340 62 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20  buffer in bytes 
34350 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20  */.  char *zOut 
34360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34370 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66     /* Output buf
34380 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64  fer */.){.#if !d
34390 65 66 69 6e 65 64 28 48 41 56 45 5f 52 45 41 44  efined(HAVE_READ
343a0 4c 49 4e 4b 29 20 7c 7c 20 21 64 65 66 69 6e 65  LINK) || !define
343b0 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a 20 20  d(HAVE_LSTAT).  
343c0 72 65 74 75 72 6e 20 6d 6b 46 75 6c 6c 50 61 74  return mkFullPat
343d0 68 6e 61 6d 65 28 7a 50 61 74 68 2c 20 7a 4f 75  hname(zPath, zOu
343e0 74 2c 20 6e 4f 75 74 29 3b 0a 23 65 6c 73 65 0a  t, nOut);.#else.
343f0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34400 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 42 79 74  E_OK;.  int nByt
34410 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e 6b 20 3d  e;.  int nLink =
34420 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   1;             
34430 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
34440 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 66  symbolic links f
34450 6f 6c 6c 6f 77 65 64 20 73 6f 20 66 61 72 20 2a  ollowed so far *
34460 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
34470 7a 49 6e 20 3d 20 7a 50 61 74 68 3b 20 20 20 20  zIn = zPath;    
34480 20 20 2f 2a 20 49 6e 70 75 74 20 70 61 74 68 20    /* Input path 
34490 66 6f 72 20 65 61 63 68 20 69 74 65 72 61 74 69  for each iterati
344a0 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20  on of loop */.  
344b0 63 68 61 72 20 2a 7a 44 65 6c 20 3d 20 30 3b 0a  char *zDel = 0;.
344c0 0a 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d  .  assert( pVfs-
344d0 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58  >mxPathname==MAX
344e0 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55  _PATHNAME );.  U
344f0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34500 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 49 74 27  pVfs);..  /* It'
34510 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
34520 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
34530 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
34540 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
34550 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
34560 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
34570 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
34580 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
34590 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
345a0 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73 20  n failing. This 
345b0 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66  function could f
345c0 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61 6d  ail if, for exam
345d0 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75  ple, the.  ** cu
345e0 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69  rrent working di
345f0 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65 6e  rectory has been
34600 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a   unlinked..  */.
34610 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
34620 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
34630 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 64 6f 20  _ERROR );..  do 
34640 7b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73  {..    /* Call s
34650 74 61 74 28 29 20 6f 6e 20 70 61 74 68 20 7a 49  tat() on path zI
34660 6e 2e 20 53 65 74 20 62 4c 69 6e 6b 20 74 6f 20  n. Set bLink to 
34670 74 72 75 65 20 69 66 20 74 68 65 20 70 61 74 68  true if the path
34680 20 69 73 20 61 20 73 79 6d 62 6f 6c 69 63 0a 20   is a symbolic. 
34690 20 20 20 2a 2a 20 6c 69 6e 6b 2c 20 6f 72 20 66     ** link, or f
346a0 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20  alse otherwise. 
346b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 4c 69 6e   */.    int bLin
346c0 6b 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 75 63  k = 0;.    struc
346d0 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
346e0 69 66 28 20 6f 73 4c 73 74 61 74 28 7a 49 6e 2c  if( osLstat(zIn,
346f0 20 26 62 75 66 29 21 3d 30 20 29 7b 0a 20 20 20   &buf)!=0 ){.   
34700 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e     if( errno!=EN
34710 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  OENT ){.        
34720 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
34730 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r(SQLITE_CANTOPE
34740 4e 5f 42 4b 50 54 2c 20 22 6c 73 74 61 74 22 2c  N_BKPT, "lstat",
34750 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20   zIn);.      }. 
34760 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
34770 62 4c 69 6e 6b 20 3d 20 53 5f 49 53 4c 4e 4b 28  bLink = S_ISLNK(
34780 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20  buf.st_mode);.  
34790 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 62 4c 69    }..    if( bLi
347a0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nk ){.      if( 
347b0 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zDel==0 ){.     
347c0 20 20 20 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65     zDel = sqlite
347d0 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b 0a  3_malloc(nOut);.
347e0 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c          if( zDel
347f0 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
34800 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
34810 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 2b 2b      }else if( ++
34820 6e 4c 69 6e 6b 3e 53 51 4c 49 54 45 5f 4d 41 58  nLink>SQLITE_MAX
34830 5f 53 59 4d 4c 49 4e 4b 53 20 29 7b 0a 20 20 20  _SYMLINKS ){.   
34840 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
34850 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
34860 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
34870 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
34880 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 79 74   ){.        nByt
34890 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a  e = osReadlink(z
348a0 49 6e 2c 20 7a 44 65 6c 2c 20 6e 4f 75 74 2d 31  In, zDel, nOut-1
348b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
348c0 42 79 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  Byte<0 ){.      
348d0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
348e0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
348f0 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61  TOPEN_BKPT, "rea
34900 64 6c 69 6e 6b 22 2c 20 7a 49 6e 29 3b 0a 20 20  dlink", zIn);.  
34910 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
34920 20 20 20 20 20 20 20 69 66 28 20 7a 44 65 6c 5b         if( zDel[
34930 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  0]!='/' ){.     
34940 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
34950 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 6e 20            for(n 
34960 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
34970 30 28 7a 49 6e 29 3b 20 6e 3e 30 20 26 26 20 7a  0(zIn); n>0 && z
34980 49 6e 5b 6e 2d 31 5d 21 3d 27 2f 27 3b 20 6e 2d  In[n-1]!='/'; n-
34990 2d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -);.            
349a0 69 66 28 20 6e 42 79 74 65 2b 6e 2b 31 3e 6e 4f  if( nByte+n+1>nO
349b0 75 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ut ){.          
349c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
349d0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
349e0 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
349f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
34a00 6d 65 6d 6d 6f 76 65 28 26 7a 44 65 6c 5b 6e 5d  memmove(&zDel[n]
34a10 2c 20 7a 44 65 6c 2c 20 6e 42 79 74 65 2b 31 29  , zDel, nByte+1)
34a20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
34a30 6d 65 6d 63 70 79 28 7a 44 65 6c 2c 20 7a 49 6e  memcpy(zDel, zIn
34a40 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , n);.          
34a50 20 20 20 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a      nByte += n;.
34a60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
34a70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34a80 20 20 20 20 7a 44 65 6c 5b 6e 42 79 74 65 5d 20      zDel[nByte] 
34a90 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20  = '\0';.        
34aa0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
34ab0 20 7a 49 6e 20 3d 20 7a 44 65 6c 3b 0a 20 20 20   zIn = zDel;.   
34ac0 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20   }..    assert( 
34ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
34ae0 20 7a 49 6e 21 3d 7a 4f 75 74 20 7c 7c 20 7a 49   zIn!=zOut || zI
34af0 6e 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 20  n[0]=='/' );.   
34b00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
34b10 4f 4b 20 26 26 20 7a 49 6e 21 3d 7a 4f 75 74 20  OK && zIn!=zOut 
34b20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6b  ){.      rc = mk
34b30 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 49 6e  FullPathname(zIn
34b40 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 20  , zOut, nOut);. 
34b50 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 4c 69     }.    if( bLi
34b60 6e 6b 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  nk==0 ) break;. 
34b70 20 20 20 7a 49 6e 20 3d 20 7a 4f 75 74 3b 0a 20     zIn = zOut;. 
34b80 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
34b90 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c  ITE_OK );..  sql
34ba0 69 74 65 33 5f 66 72 65 65 28 7a 44 65 6c 29 3b  ite3_free(zDel);
34bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
34bc0 6e 64 69 66 20 20 20 2f 2a 20 48 41 56 45 5f 52  ndif   /* HAVE_R
34bd0 45 41 44 4c 49 4e 4b 20 26 26 20 48 41 56 45 5f  EADLINK && HAVE_
34be0 4c 53 54 41 54 20 2a 2f 0a 7d 0a 0a 0a 23 69 66  LSTAT */.}...#if
34bf0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
34c00 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
34c10 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73  /*.** Interfaces
34c20 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73   for opening a s
34c30 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66  hared library, f
34c40 69 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69  inding entry poi
34c50 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68  nts.** within th
34c60 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
34c70 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68  , and closing th
34c80 65 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  e shared library
34c90 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64  ..*/.#include <d
34ca0 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76  lfcn.h>.static v
34cb0 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28  oid *unixDlOpen(
34cc0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
34cd0 55 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72  Used, const char
34ce0 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
34cf0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
34d00 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  (NotUsed);.  ret
34d10 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65  urn dlopen(zFile
34d20 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c  name, RTLD_NOW |
34d30 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d   RTLD_GLOBAL);.}
34d40 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63  ../*.** SQLite c
34d50 61 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69  alls this functi
34d60 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61  on immediately a
34d70 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75  fter a call to u
34d80 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a  nixDlSym() or.**
34d90 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61   unixDlOpen() fa
34da0 69 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e  ils (returns a n
34db0 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66  ull pointer). If
34dc0 20 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64   a more detailed
34dd0 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67   error.** messag
34de0 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  e is available, 
34df0 69 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  it is written to
34e00 20 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20   zBufOut. If no 
34e10 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
34e20 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a   is available, z
34e30 42 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75  BufOut is left u
34e40 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51  nmodified and SQ
34e50 4c 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61  Lite uses a defa
34e60 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73  ult.** error mes
34e70 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sage..*/.static 
34e80 76 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72  void unixDlError
34e90 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
34ea0 74 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c  tUsed, int nBuf,
34eb0 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
34ec0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
34ed0 45 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  Err;.  UNUSED_PA
34ee0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
34ef0 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  ;.  unixEnterMut
34f00 65 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64  ex();.  zErr = d
34f10 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  lerror();.  if( 
34f20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69  zErr ){.    sqli
34f30 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75  te3_snprintf(nBu
34f40 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22  f, zBufOut, "%s"
34f50 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75  , zErr);.  }.  u
34f60 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
34f70 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  .}.static void (
34f80 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74  *unixDlSym(sqlit
34f90 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
34fa0 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20   void *p, const 
34fb0 63 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64  char*zSym))(void
34fc0 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43  ){.  /* .  ** GC
34fd0 43 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63  C with -pedantic
34fe0 2d 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61  -errors says tha
34ff0 74 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61  t C90 does not a
35000 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20  llow a void* to 
35010 62 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74  be.  ** cast int
35020 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  o a pointer to a
35030 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20   function.  And 
35040 79 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20  yet the library 
35050 64 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a  dlsym() routine.
35060 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76    ** returns a v
35070 6f 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65  oid* which is re
35080 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
35090 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53  o a function.  S
350a0 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a  o how do we.  **
350b0 20 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74   use dlsym() wit
350c0 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f  h -pedantic-erro
350d0 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61  rs?.  **.  ** Va
350e0 72 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69  riable x below i
350f0 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
35100 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
35110 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20  unction taking. 
35120 20 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76   ** parameters v
35130 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63  oid* and const c
35140 68 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69  har* and returni
35150 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ng a pointer to 
35160 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a  a function..  **
35170 20 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78   We initialize x
35180 20 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74   by assigning it
35190 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
351a0 65 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69  e dlsym() functi
351b0 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61  on..  ** (That a
351c0 73 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  ssignment requir
351d0 65 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65  es a cast.)  The
351e0 6e 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75  n we call the fu
351f0 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a  nction that.  **
35200 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a   x points to.  .
35210 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77    **.  ** This w
35220 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e  ork-around is un
35230 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63  likely to work c
35240 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20  orrectly on any 
35250 73 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a  system where.  *
35260 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e  * you really can
35270 6e 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74  not cast a funct
35280 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f  ion pointer into
35290 20 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65   void*.  But the
352a0 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f  n, on the.  ** o
352b0 74 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d  ther hand, dlsym
352c0 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  () will not work
352d0 20 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65   on such a syste
352e0 6d 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20  m either, so we 
352f0 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65  have.  ** not re
35300 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69  ally lost anythi
35310 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20  ng..  */.  void 
35320 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e  (*(*x)(void*,con
35330 73 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29  st char*))(void)
35340 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
35350 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
35360 20 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28   x = (void(*(*)(
35370 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72  void*,const char
35380 2a 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b  *))(void))dlsym;
35390 0a 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70  .  return (*x)(p
353a0 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69  , zSym);.}.stati
353b0 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f  c void unixDlClo
353c0 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  se(sqlite3_vfs *
353d0 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70  NotUsed, void *p
353e0 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45  Handle){.  UNUSE
353f0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
35400 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28  sed);.  dlclose(
35410 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73  pHandle);.}.#els
35420 65 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f  e /* if SQLITE_O
35430 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
35440 4f 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a  ON is defined: *
35450 2f 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  /.  #define unix
35460 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66  DlOpen  0.  #def
35470 69 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20  ine unixDlError 
35480 30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78  0.  #define unix
35490 44 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66  DlSym   0.  #def
354a0 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20  ine unixDlClose 
354b0 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
354c0 57 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  Write nBuf bytes
354d0 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20   of random data 
354e0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
354f0 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
35500 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52  static int unixR
35510 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
35520 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
35530 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
35540 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f  zBuf){.  UNUSED_
35550 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
35560 64 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69  d);.  assert((si
35570 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65  ze_t)nBuf>=(size
35580 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f  of(time_t)+sizeo
35590 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20  f(int)));..  /* 
355a0 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69  We have to initi
355b0 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72  alize zBuf to pr
355c0 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66  event valgrind f
355d0 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20  rom reporting.  
355e0 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20  ** errors.  The 
355f0 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62  reports issued b
35600 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69  y valgrind are i
35610 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f  ncorrect - we wo
35620 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20  uld.  ** prefer 
35630 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e  that the randomn
35640 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64  ess be increased
35650 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f   by making use o
35660 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69  f the.  ** unini
35670 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69  tialized space i
35680 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c  n zBuf - but val
35690 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e  grind errors ten
356a0 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20  d to worry.  ** 
356b0 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74  some users.  Rat
356c0 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20  her than argue, 
356d0 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20  it seems easier 
356e0 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69  just to initiali
356f0 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c  ze.  ** the whol
35700 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65  e array and sile
35710 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76  nce valgrind, ev
35720 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73  en if that means
35730 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73   less randomness
35740 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e  .  ** in the ran
35750 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20  dom seed..  **. 
35760 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67   ** When testing
35770 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a  , initializing z
35780 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73  Buf[] to zero is
35790 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61   all we do.  Tha
357a0 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61  t means.  ** tha
357b0 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  t we always use 
357c0 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20  the same random 
357d0 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e  number sequence.
357e0 20 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65    This makes the
357f0 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65  .  ** tests repe
35800 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d  atable..  */.  m
35810 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e  emset(zBuf, 0, n
35820 42 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65  Buf);.  randomne
35830 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64  ssPid = osGetpid
35840 28 30 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69  (0);  .#if !defi
35850 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
35860 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
35870 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e  ITE_OMIT_RANDOMN
35880 45 53 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74  ESS).  {.    int
35890 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64   fd, got;.    fd
358a0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22   = robust_open("
358b0 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f  /dev/urandom", O
358c0 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
358d0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
358e0 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20     time_t t;.   
358f0 20 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20     time(&t);.   
35900 20 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20     memcpy(zBuf, 
35910 26 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a  &t, sizeof(t));.
35920 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42        memcpy(&zB
35930 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26  uf[sizeof(t)], &
35940 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73  randomnessPid, s
35950 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73  izeof(randomness
35960 50 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73  Pid));.      ass
35970 65 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73  ert( sizeof(t)+s
35980 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73  izeof(randomness
35990 50 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42  Pid)<=(size_t)nB
359a0 75 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66  uf );.      nBuf
359b0 20 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73   = sizeof(t) + s
359c0 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73  izeof(randomness
359d0 50 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Pid);.    }else{
359e0 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d  .      do{ got =
359f0 20 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66   osRead(fd, zBuf
35a00 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28  , nBuf); }while(
35a10 20 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d   got<0 && errno=
35a20 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
35a30 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
35a40 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
35a50 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
35a60 20 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d    return nBuf;.}
35a70 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  .../*.** Sleep f
35a80 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
35a90 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
35aa0 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
35ab0 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75  ept..** The argu
35ac0 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62  ment is the numb
35ad0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
35ae0 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c  ds we want to sl
35af0 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  eep..** The retu
35b00 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
35b10 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73  number of micros
35b20 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20  econds of sleep 
35b30 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75  actually.** requ
35b40 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75  ested from the u
35b50 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74  nderlying operat
35b60 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75  ing system, a nu
35b70 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69  mber which.** mi
35b80 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74  ght be greater t
35b90 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
35ba0 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75  the argument, bu
35bb0 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68  t not less.** th
35bc0 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  an the argument.
35bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
35be0 6e 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33  nixSleep(sqlite3
35bf0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
35c00 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29  nt microseconds)
35c10 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
35c20 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
35c30 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f  ec sp;..  sp.tv_
35c40 73 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e  sec = microsecon
35c50 64 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20  ds / 1000000;.  
35c60 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69  sp.tv_nsec = (mi
35c70 63 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30  croseconds % 100
35c80 30 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20  0000) * 1000;.  
35c90 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e  nanosleep(&sp, N
35ca0 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ULL);.  UNUSED_P
35cb0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
35cc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72  );.  return micr
35cd0 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20  oseconds;.#elif 
35ce0 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c  defined(HAVE_USL
35cf0 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c  EEP) && HAVE_USL
35d00 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63  EEP.  usleep(mic
35d10 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e  roseconds);.  UN
35d20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
35d30 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
35d40 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a  n microseconds;.
35d50 23 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f  #else.  int seco
35d60 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f  nds = (microseco
35d70 6e 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30  nds+999999)/1000
35d80 30 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63  000;.  sleep(sec
35d90 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
35da0 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
35db0 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63  d);.  return sec
35dc0 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65  onds*1000000;.#e
35dd0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ndif.}../*.** Th
35de0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
35df0 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20  able, if set to 
35e00 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
35e10 2c 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64  , is interpreted
35e20 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   as.** the numbe
35e30 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e  r of seconds sin
35e40 63 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75  ce 1970 and is u
35e50 73 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72  sed to set the r
35e60 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69  esult of.** sqli
35e70 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
35e80 28 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  () during testin
35e90 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
35ea0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
35eb0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
35ec0 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20  e = 0;  /* Fake 
35ed0 73 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73  system time in s
35ee0 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37  econds since 197
35ef0 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a  0. */.#endif../*
35f00 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72  .** Find the cur
35f10 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e  rent time (in Un
35f20 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61  iversal Coordina
35f30 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74  ted Time).  Writ
35f40 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a  e into *piNow.**
35f50 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
35f60 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20  e and date as a 
35f70 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65  Julian Day numbe
35f80 72 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30  r times 86_400_0
35f90 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72  00.  In.** other
35fa0 20 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e   words, write in
35fb0 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75  to *piNow the nu
35fc0 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
35fd0 6f 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a  onds since the J
35fe0 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f  ulian.** epoch o
35ff0 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77  f noon in Greenw
36000 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20  ich on November 
36010 32 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63  24, 4714 B.C acc
36020 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a  ording to the.**
36030 20 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f   proleptic Grego
36040 72 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a  rian calendar..*
36050 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
36060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
36070 4b 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  K.  Return SQLIT
36080 45 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74  E_ERROR if the t
36090 69 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a  ime and date .**
360a0 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
360b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
360c0 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49  unixCurrentTimeI
360d0 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73  nt64(sqlite3_vfs
360e0 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74   *NotUsed, sqlit
360f0 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29  e3_int64 *piNow)
36100 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
36110 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75   sqlite3_int64 u
36120 6e 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35  nixEpoch = 24405
36130 38 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74  875*(sqlite3_int
36140 36 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e  64)8640000;.  in
36150 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
36160 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  ;.#if defined(NO
36170 5f 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f  _GETTOD).  time_
36180 74 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b  t t;.  time(&t);
36190 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71  .  *piNow = ((sq
361a0 6c 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31  lite3_int64)t)*1
361b0 30 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b  000 + unixEpoch;
361c0 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b  .#elif OS_VXWORK
361d0 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  S.  struct times
361e0 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63  pec sNow;.  cloc
361f0 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f  k_gettime(CLOCK_
36200 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29  REALTIME, &sNow)
36210 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69  ;.  *piNow = uni
36220 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
36230 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
36240 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
36250 74 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b  tv_nsec/1000000;
36260 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
36270 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20  timeval sNow;.  
36280 28 76 6f 69 64 29 67 65 74 74 69 6d 65 6f 66 64  (void)gettimeofd
36290 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f  ay(&sNow, 0);  /
362a0 2a 20 43 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69  * Cannot fail gi
362b0 76 65 6e 20 76 61 6c 69 64 20 61 72 67 75 6d 65  ven valid argume
362c0 6e 74 73 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20  nts */.  *piNow 
362d0 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30  = unixEpoch + 10
362e0 30 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  00*(sqlite3_int6
362f0 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20  4)sNow.tv_sec + 
36300 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30  sNow.tv_usec/100
36310 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  0;.#endif..#ifde
36320 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
36330 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72  if( sqlite3_curr
36340 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
36350 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73  *piNow = 1000*(s
36360 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c  qlite3_int64)sql
36370 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
36380 65 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20  e + unixEpoch;. 
36390 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53   }.#endif.  UNUS
363a0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
363b0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
363c0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
363d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
363e0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  CATED./*.** Find
363f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
36400 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
36410 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
36420 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
36430 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
36440 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
36450 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
36460 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
36470 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
36480 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
36490 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
364a0 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
364b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
364c0 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
364d0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
364e0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
364f0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
36500 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
36510 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
36520 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
36530 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54  c = unixCurrentT
36540 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b  imeInt64(0, &i);
36550 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36  .  *prNow = i/86
36560 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75  400000.0;.  retu
36570 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
36580 20 64 65 66 69 6e 65 20 75 6e 69 78 43 75 72 72   define unixCurr
36590 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e 64 69 66  entTime 0.#endif
365a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78 47 65 74  ../*.** The xGet
365b0 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68  LastError() meth
365c0 6f 64 20 69 73 20 64 65 73 69 67 6e 65 64 20 74  od is designed t
365d0 6f 20 72 65 74 75 72 6e 20 61 20 62 65 74 74 65  o return a bette
365e0 72 0a 2a 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 65  r.** low-level e
365f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
36600 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73 79 73 74  n operating-syst
36610 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65  em problems come
36620 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51   up.** during SQ
36630 4c 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  Lite operation. 
36640 20 4f 6e 6c 79 20 74 68 65 20 69 6e 74 65 67 65   Only the intege
36650 72 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  r return code is
36660 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73   currently.** us
36670 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
36680 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72  t unixGetLastErr
36690 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  or(sqlite3_vfs *
366a0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
366b0 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74  Used2, char *Not
366c0 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44  Used3){.  UNUSED
366d0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
366e0 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed);.  UNUSED_PA
366f0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32  RAMETER(NotUsed2
36700 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
36710 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b  METER(NotUsed3);
36720 0a 20 20 72 65 74 75 72 6e 20 65 72 72 6e 6f 3b  .  return errno;
36730 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../*.********
36740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36750 20 45 6e 64 20 6f 66 20 73 71 6c 69 74 65 33 5f   End of sqlite3_
36760 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a  vfs methods ****
36770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36780 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
36790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367d0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
367e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
367f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36820 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
36830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36840 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f 78 79 20  *** Begin Proxy 
36850 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
36860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
36870 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
36880 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
36890 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d  a "uber-locking-
368a0 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 69 73 20  method" in this 
368b0 73 65 6e 73 65 3a 20 20 49 74 20 75 73 65 73 20  sense:  It uses 
368c0 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63  the.** other loc
368d0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
368e0 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66  secondary lock f
368f0 69 6c 65 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63  iles.  Proxy loc
36900 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74  king is a.** met
36910 61 2d 6c 61 79 65 72 20 6f 76 65 72 20 74 6f 70  a-layer over top
36920 20 6f 66 20 74 68 65 20 70 72 69 6d 69 74 69 76   of the primitiv
36930 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d  e locking implem
36940 65 6e 74 65 64 20 61 62 6f 76 65 2e 20 20 46 6f  ented above.  Fo
36950 72 0a 2a 2a 20 74 68 69 73 20 72 65 61 73 6f 6e  r.** this reason
36960 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74  , the division t
36970 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f  hat implements o
36980 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  f proxy locking 
36990 69 73 20 64 65 66 65 72 72 65 64 0a 2a 2a 20 75  is deferred.** u
369a0 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20 74 68 65  ntil late in the
369b0 20 66 69 6c 65 20 28 68 65 72 65 29 20 61 66 74   file (here) aft
369c0 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74  er all of the ot
369d0 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20  her I/O methods 
369e0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66  have.** been def
369f0 69 6e 65 64 20 2d 20 73 6f 20 74 68 61 74 20 74  ined - so that t
36a00 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
36a10 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 61 72 65  king methods are
36a20 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73   available.** as
36a30 20 73 65 72 76 69 63 65 73 20 74 6f 20 68 65 6c   services to hel
36a40 70 20 77 69 74 68 20 74 68 65 20 69 6d 70 6c 65  p with the imple
36a50 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f  mentation of pro
36a60 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  xy locking..**.*
36a70 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ***.**.** The de
36a80 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63  fault locking sc
36a90 68 65 6d 65 73 20 69 6e 20 53 51 4c 69 74 65 20  hemes in SQLite 
36aa0 75 73 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  use byte-range l
36ab0 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64  ocks on the.** d
36ac0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
36ad0 63 6f 6f 72 64 69 6e 61 74 65 20 73 61 66 65 2c  coordinate safe,
36ae0 20 63 6f 6e 63 75 72 72 65 6e 74 20 61 63 63 65   concurrent acce
36af0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 72  ss by multiple r
36b00 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72  eaders.** and wr
36b10 69 74 65 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71  iters [http://sq
36b20 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67  lite.org/locking
36b30 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66  v3.html].  The f
36b40 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ive file locking
36b50 0a 2a 2a 20 73 74 61 74 65 73 20 28 55 4e 4c 4f  .** states (UNLO
36b60 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53  CKED, PENDING, S
36b70 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c  HARED, RESERVED,
36b80 20 45 58 43 4c 55 53 49 56 45 29 20 61 72 65 20   EXCLUSIVE) are 
36b90 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61  implemented.** a
36ba0 73 20 50 4f 53 49 58 20 72 65 61 64 20 26 20 77  s POSIX read & w
36bb0 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20  rite locks over 
36bc0 66 69 78 65 64 20 73 65 74 20 6f 66 20 6c 6f 63  fixed set of loc
36bd0 61 74 69 6f 6e 73 20 28 76 69 61 20 66 73 63 74  ations (via fsct
36be0 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e  l),.** on AFP an
36bf0 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75  d SMB only exclu
36c00 73 69 76 65 20 62 79 74 65 2d 72 61 6e 67 65 20  sive byte-range 
36c10 6c 6f 63 6b 73 20 61 72 65 20 61 76 61 69 6c 61  locks are availa
36c20 62 6c 65 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a  ble via fsctl.**
36c30 20 77 69 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c   with _IOWR('z',
36c40 20 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65   23, struct Byte
36c50 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f  RangeLockPB2) to
36c60 20 74 72 61 63 6b 20 74 68 65 20 73 61 6d 65 20   track the same 
36c70 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20  5 states..** To 
36c80 73 69 6d 75 6c 61 74 65 20 61 20 46 5f 52 44 4c  simulate a F_RDL
36c90 43 4b 20 6f 6e 20 74 68 65 20 73 68 61 72 65 64  CK on the shared
36ca0 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61   range, on AFP a
36cb0 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74   randomly select
36cc0 65 64 0a 2a 2a 20 61 64 64 72 65 73 73 20 69 6e  ed.** address in
36cd0 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
36ce0 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72 20 61  e is taken for a
36cf0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
36d00 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72  e entire.** shar
36d10 65 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65  ed range is take
36d20 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c 55 53 49  n for an EXCLUSI
36d30 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20  VE lock):.**.** 
36d40 20 20 20 20 20 50 45 4e 44 49 4e 47 5f 42 59 54       PENDING_BYT
36d50 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30  E        0x40000
36d60 30 30 30 0a 2a 2a 20 20 20 20 20 20 52 45 53 45  000.**      RESE
36d70 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20 20  RVED_BYTE       
36d80 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20 20  0x40000001.**   
36d90 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45 20     SHARED_RANGE 
36da0 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30         0x4000000
36db0 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30 0a  2 -> 0x40000200.
36dc0 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73  **.** This works
36dd0 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   well on the loc
36de0 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20  al file system, 
36df0 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61 72  but shows a near
36e00 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64  ly 100x.** slowd
36e10 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72 66  own in read perf
36e20 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20 62  ormance on AFP b
36e30 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20 63  ecause the AFP c
36e40 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a  lient disables.*
36e50 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68 65  * the read cache
36e60 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67 65   when byte-range
36e70 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73 65   locks are prese
36e80 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74 68  nt.  Enabling th
36e90 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65 20  e read.** cache 
36ea0 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65 20  exposes a cache 
36eb0 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c 65  coherency proble
36ec0 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e  m that is presen
36ed0 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a  t on all OS X.**
36ee0 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77 6f   supported netwo
36ef0 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e  rk file systems.
36f00 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62 6f    NFS and AFP bo
36f10 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a 2a  th observe the.*
36f20 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20  * close-to-open 
36f30 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65 6e  semantics for en
36f40 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f 68  suring cache coh
36f50 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a  erency.** [http:
36f60 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72 67  //nfs.sourceforg
36f70 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20  e.net/#faq_a8], 
36f80 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20 65  which does not e
36f90 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64  ffectively.** ad
36fa0 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69 72  dress the requir
36fb0 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75  ements for concu
36fc0 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 61  rrent database a
36fd0 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
36fe0 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e 64  e.** readers and
36ff0 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74   writers.** [htt
37000 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63  p://www.nabble.c
37010 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53  om/SQLite-on-NFS
37020 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63 79  -cache-coherency
37030 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d 6c  -td15655701.html
37040 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72  ]..**.** To addr
37050 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d 61  ess the performa
37060 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63 6f  nce and cache co
37070 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c 20  herency issues, 
37080 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  proxy file locki
37090 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 68  ng.** changes th
370a0 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20 61  e way database a
370b0 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c  ccess is control
370c0 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67 20  led by limiting 
370d0 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73  access to a.** s
370e0 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61 20  ingle host at a 
370f0 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20  time and moving 
37100 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f  file locks off o
37110 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
37120 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20  ile.** and onto 
37130 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20  a proxy file on 
37140 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73  the local file s
37150 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a  ystem.  .**.**.*
37160 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f  * Using proxy lo
37170 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  cks.** ---------
37180 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43  --------.**.** C
37190 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c   APIs.**.**  sql
371a0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
371b0 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51  l(db, dbname, SQ
371c0 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c  LITE_FCNTL_SET_L
371d0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a  OCKPROXYFILE,.**
371e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371f0 20 20 20 20 20 20 20 3c 70 72 6f 78 79 5f 70 61         <proxy_pa
37200 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b  th> | ":auto:");
37210 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .**  sqlite3_fil
37220 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62  e_control(db, db
37230 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  name, SQLITE_FCN
37240 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_GET_LOCKPROXY
37250 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20  FILE,.**        
37260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
37270 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a  <proxy_path>);.*
37280 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67  *.**.** SQL prag
37290 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d  mas.**.**  PRAGM
372a0 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63  A [database.]loc
372b0 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72  k_proxy_file=<pr
372c0 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74  oxy_path> | :aut
372d0 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  o:.**  PRAGMA [d
372e0 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
372f0 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53  oxy_file.**.** S
37300 70 65 63 69 66 79 69 6e 67 20 22 3a 61 75 74 6f  pecifying ":auto
37310 3a 22 20 6d 65 61 6e 73 20 74 68 61 74 20 69 66  :" means that if
37320 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6e 63   there is a conc
37330 68 20 66 69 6c 65 20 77 69 74 68 20 61 20 6d 61  h file with a ma
37340 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49  tching.** host I
37350 44 20 69 6e 20 69 74 2c 20 74 68 65 20 70 72 6f  D in it, the pro
37360 78 79 20 70 61 74 68 20 69 6e 20 74 68 65 20 63  xy path in the c
37370 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62  onch file will b
37380 65 20 75 73 65 64 2c 20 6f 74 68 65 72 77 69 73  e used, otherwis
37390 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20 70 61 74  e.** a proxy pat
373a0 68 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 75  h based on the u
373b0 73 65 72 27 73 20 74 65 6d 70 20 64 69 72 0a 2a  ser's temp dir.*
373c0 2a 20 28 76 69 61 20 63 6f 6e 66 73 74 72 28 5f  * (via confstr(_
373d0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
373e0 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69  EMP_DIR,...)) wi
373f0 6c 6c 20 62 65 20 75 73 65 64 20 61 6e 64 20 74  ll be used and t
37400 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f  he.** actual pro
37410 78 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  xy file name is 
37420 67 65 6e 65 72 61 74 65 64 20 66 72 6f 6d 20 74  generated from t
37430 68 65 20 6e 61 6d 65 20 61 6e 64 20 70 61 74 68  he name and path
37440 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
37450 61 73 65 20 66 69 6c 65 2e 20 20 46 6f 72 20 65  ase file.  For e
37460 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  xample:.**.**   
37470 20 20 20 20 46 6f 72 20 64 61 74 61 62 61 73 65      For database
37480 20 70 61 74 68 20 22 2f 55 73 65 72 73 2f 6d 65   path "/Users/me
37490 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20  /foo.db" .**    
374a0 20 20 20 54 68 65 20 6c 6f 63 6b 20 70 61 74 68     The lock path
374b0 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69   will be "<tmpdi
374c0 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f  r>/sqliteplocks/
374d0 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62  _Users_me_foo.db
374e0 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f  :auto:").**.** O
374f0 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79  nce a lock proxy
37500 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 66   is configured f
37510 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
37520 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e  nnection, it can
37530 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76   not.** be remov
37540 65 64 2c 20 68 6f 77 65 76 65 72 20 69 74 20 6d  ed, however it m
37550 61 79 20 62 65 20 73 77 69 74 63 68 65 64 20 74  ay be switched t
37560 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 70 72  o a different pr
37570 6f 78 79 20 70 61 74 68 20 76 69 61 0a 2a 2a 20  oxy path via.** 
37580 74 68 65 20 61 62 6f 76 65 20 41 50 49 73 20 28  the above APIs (
37590 61 73 73 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e  assuming the con
375a0 63 68 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 62  ch file is not b
375b0 65 69 6e 67 20 68 65 6c 64 20 62 79 20 61 6e 6f  eing held by ano
375c0 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  ther.** connecti
375d0 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73 29 2e 20  on or process). 
375e0 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72  .**.**.** How pr
375f0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  oxy locking work
37600 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  s.** -----------
37610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
37620 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f  ** Proxy file lo
37630 63 6b 69 6e 67 20 72 65 6c 69 65 73 20 70 72 69  cking relies pri
37640 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65  marily on two ne
37650 77 20 73 75 70 70 6f 72 74 69 6e 67 20 66 69 6c  w supporting fil
37660 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  es: .**.**   *  
37670 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f 20 6c 69  conch file to li
37680 6d 69 74 20 61 63 63 65 73 73 20 74 6f 20 74 68  mit access to th
37690 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
376a0 74 6f 20 61 20 73 69 6e 67 6c 65 20 68 6f 73 74  to a single host
376b0 0a 2a 2a 20 20 20 20 20 20 61 74 20 61 20 74 69  .**      at a ti
376c0 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72  me.**.**   *  pr
376d0 6f 78 79 20 66 69 6c 65 20 74 6f 20 61 63 74 20  oxy file to act 
376e0 61 73 20 61 20 70 72 6f 78 79 20 66 6f 72 20 74  as a proxy for t
376f0 68 65 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  he advisory lock
37700 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20  s normally.**   
37710 20 20 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20     taken on the 
37720 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54  database.**.** T
37730 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20  he conch file - 
37740 74 6f 20 75 73 65 20 61 20 70 72 6f 78 79 20 66  to use a proxy f
37750 69 6c 65 2c 20 73 71 6c 69 74 65 20 6d 75 73 74  ile, sqlite must
37760 20 66 69 72 73 74 20 22 68 6f 6c 64 20 74 68 65   first "hold the
37770 20 63 6f 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61   conch".** by ta
37780 6b 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 2d 73  king an sqlite-s
37790 74 79 6c 65 20 73 68 61 72 65 64 20 6c 6f 63 6b  tyle shared lock
377a0 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
377b0 6c 65 2c 20 72 65 61 64 69 6e 67 20 74 68 65 0a  le, reading the.
377c0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20  ** contents and 
377d0 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 68 6f  comparing the ho
377e0 73 74 27 73 20 75 6e 69 71 75 65 20 68 6f 73 74  st's unique host
377f0 20 49 44 20 28 73 65 65 20 62 65 6c 6f 77 29 20   ID (see below) 
37800 61 6e 64 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78  and lock.** prox
37810 79 20 70 61 74 68 20 61 67 61 69 6e 73 74 20 74  y path against t
37820 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
37830 20 69 6e 20 74 68 65 20 63 6f 6e 63 68 2e 20 20   in the conch.  
37840 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69  The conch file i
37850 73 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 74  s.** stored in t
37860 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
37870 79 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  y as the databas
37880 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
37890 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70  ile name.** is p
378a0 61 74 74 65 72 6e 65 64 20 61 66 74 65 72 20 74  atterned after t
378b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
378c0 20 6e 61 6d 65 20 61 73 20 22 2e 3c 64 61 74 61   name as ".<data
378d0 62 61 73 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22  basename>-conch"
378e0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6e 63  ..** If the conc
378f0 68 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  h file does not 
37900 65 78 69 73 74 2c 20 6f 72 20 69 74 73 20 63 6f  exist, or its co
37910 6e 74 65 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  ntents do not ma
37920 74 63 68 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20  tch the.** host 
37930 49 44 20 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20  ID and/or proxy 
37940 70 61 74 68 2c 20 74 68 65 6e 20 74 68 65 20 6c  path, then the l
37950 6f 63 6b 20 69 73 20 65 73 63 61 6c 61 74 65 64  ock is escalated
37960 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65   to an exclusive
37970 0a 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65  .** lock and the
37980 20 63 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74   conch file cont
37990 65 6e 74 73 20 69 73 20 75 70 64 61 74 65 64 20  ents is updated 
379a0 77 69 74 68 20 74 68 65 20 68 6f 73 74 20 49 44  with the host ID
379b0 20 61 6e 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61   and proxy.** pa
379c0 74 68 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  th and the lock 
379d0 69 73 20 64 6f 77 6e 67 72 61 64 65 64 20 74 6f  is downgraded to
379e0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61   a shared lock a
379f0 67 61 69 6e 2e 20 20 49 66 20 74 68 65 20 63 6f  gain.  If the co
37a00 6e 63 68 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62  nch.** is held b
37a10 79 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  y another proces
37a20 73 20 28 77 69 74 68 20 61 20 73 68 61 72 65 64  s (with a shared
37a30 20 6c 6f 63 6b 29 2c 20 74 68 65 20 65 78 63 6c   lock), the excl
37a40 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69  usive lock.** wi
37a50 6c 6c 20 66 61 69 6c 20 61 6e 64 20 53 51 4c 49  ll fail and SQLI
37a60 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
37a70 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ned..**.** The p
37a80 72 6f 78 79 20 66 69 6c 65 20 2d 20 61 20 73 69  roxy file - a si
37a90 6e 67 6c 65 2d 62 79 74 65 20 66 69 6c 65 20 75  ngle-byte file u
37aa0 73 65 64 20 66 6f 72 20 61 6c 6c 20 61 64 76 69  sed for all advi
37ab0 73 6f 72 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a  sory file locks.
37ac0 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65  ** normally take
37ad0 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
37ae0 65 20 66 69 6c 65 2e 20 20 20 54 68 69 73 20 61  e file.   This a
37af0 6c 6c 6f 77 73 20 66 6f 72 20 73 61 66 65 20 73  llows for safe s
37b00 68 61 72 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65  haring.** of the
37b10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
37b20 6f 72 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  or multiple read
37b30 65 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 20  ers and writers 
37b40 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68  on the same.** h
37b50 6f 73 74 20 28 74 68 65 20 63 6f 6e 63 68 20 65  ost (the conch e
37b60 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 79  nsures that they
37b70 20 61 6c 6c 20 75 73 65 20 74 68 65 20 73 61 6d   all use the sam
37b80 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c  e local lock fil
37b90 65 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73  e)..**.** Reques
37ba0 74 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 70 72  ting the lock pr
37bb0 6f 78 79 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d  oxy does not imm
37bc0 65 64 69 61 74 65 6c 79 20 74 61 6b 65 20 74 68  ediately take th
37bd0 65 20 63 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a  e conch, it is.*
37be0 2a 20 6f 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65  * only taken whe
37bf0 6e 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75  n the first requ
37c00 65 73 74 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61  est to lock data
37c10 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 61 64  base file is mad
37c20 65 2e 20 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74  e.  .** This mat
37c30 63 68 65 73 20 74 68 65 20 73 65 6d 61 6e 74 69  ches the semanti
37c40 63 73 20 6f 66 20 74 68 65 20 74 72 61 64 69 74  cs of the tradit
37c50 69 6f 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65  ional locking be
37c60 68 61 76 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a  havior, where.**
37c70 20 6f 70 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65   opening a conne
37c80 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61 62  ction to a datab
37c90 61 73 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  ase file does no
37ca0 74 20 74 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e  t take a lock on
37cb0 20 69 74 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72   it..** The shar
37cc0 65 64 20 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f  ed lock and an o
37cd0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
37ce0 74 6f 72 20 61 72 65 20 6d 61 69 6e 74 61 69 6e  tor are maintain
37cf0 65 64 20 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65  ed until .** the
37d00 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
37d10 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
37d20 6c 6f 73 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  losed. .**.** Th
37d30 65 20 70 72 6f 78 79 20 66 69 6c 65 20 61 6e 64  e proxy file and
37d40 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
37d50 72 65 20 6e 65 76 65 72 20 64 65 6c 65 74 65 64  re never deleted
37d60 20 73 6f 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65   so they only ne
37d70 65 64 0a 2a 2a 20 74 6f 20 62 65 20 63 72 65 61  ed.** to be crea
37d80 74 65 64 20 74 68 65 20 66 69 72 73 74 20 74 69  ted the first ti
37d90 6d 65 20 74 68 65 79 20 61 72 65 20 75 73 65 64  me they are used
37da0 2e 0a 2a 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ..**.** Configur
37db0 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a  ation options.**
37dc0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
37dd0 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51  ------.**.**  SQ
37de0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
37df0 59 5f 4c 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20  Y_LOCKING.**.** 
37e00 20 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66        Database f
37e10 69 6c 65 73 20 61 63 63 65 73 73 65 64 20 6f 6e  iles accessed on
37e20 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20   non-local file 
37e30 73 79 73 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20  systems are.**  
37e40 20 20 20 20 20 61 75 74 6f 6d 61 74 69 63 61 6c       automatical
37e50 6c 79 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f  ly configured fo
37e60 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c  r proxy locking,
37e70 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 72 65 0a   lock files are.
37e80 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 64 20 61  **       named a
37e90 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 75 73 69  utomatically usi
37ea0 6e 67 20 74 68 65 20 73 61 6d 65 20 6c 6f 67 69  ng the same logi
37eb0 63 20 61 73 0a 2a 2a 20 20 20 20 20 20 20 50 52  c as.**       PR
37ec0 41 47 4d 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f  AGMA lock_proxy_
37ed0 66 69 6c 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a  file=":auto:".**
37ee0 20 20 20 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f      .**  SQLITE_
37ef0 50 52 4f 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a  PROXY_DEBUG.**.*
37f00 2a 20 20 20 20 20 20 20 45 6e 61 62 6c 65 73 20  *       Enables 
37f10 74 68 65 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65  the logging of e
37f20 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 64 75  rror messages du
37f30 72 69 6e 67 20 68 6f 73 74 20 69 64 20 66 69 6c  ring host id fil
37f40 65 0a 2a 2a 20 20 20 20 20 20 20 72 65 74 72 69  e.**       retri
37f50 65 76 61 6c 20 61 6e 64 20 63 72 65 61 74 69 6f  eval and creatio
37f60 6e 0a 2a 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f  n.**.**  LOCKPRO
37f70 58 59 44 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20  XYDIR.**.**     
37f80 20 20 4f 76 65 72 72 69 64 65 73 20 74 68 65 20    Overrides the 
37f90 64 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72  default director
37fa0 79 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20  y used for lock 
37fb0 70 72 6f 78 79 20 66 69 6c 65 73 20 74 68 61 74  proxy files that
37fc0 0a 2a 2a 20 20 20 20 20 20 20 61 72 65 20 6e 61  .**       are na
37fd0 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  med automaticall
37fe0 79 20 76 69 61 20 74 68 65 20 22 3a 61 75 74 6f  y via the ":auto
37ff0 3a 22 20 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a  :" setting.**.**
38000 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54    SQLITE_DEFAULT
38010 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53  _PROXYDIR_PERMIS
38020 53 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20  SIONS.**.**     
38030 20 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f    Permissions to
38040 20 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69   use when creati
38050 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 66  ng a directory f
38060 6f 72 20 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a  or storing the.*
38070 2a 20 20 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f  *       lock pro
38080 78 79 20 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75  xy files, only u
38090 73 65 64 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f  sed when LOCKPRO
380a0 58 59 44 49 52 20 69 73 20 6e 6f 74 20 73 65 74  XYDIR is not set
380b0 2e 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a  ..**    .**    .
380c0 2a 2a 20 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20  ** As mentioned 
380d0 61 62 6f 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70  above, when comp
380e0 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54 45  iled with SQLITE
380f0 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f  _PREFER_PROXY_LO
38100 43 4b 49 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e  CKING,.** settin
38110 67 20 74 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e  g the environmen
38120 74 20 76 61 72 69 61 62 6c 65 20 53 51 4c 49 54  t variable SQLIT
38130 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f  E_FORCE_PROXY_LO
38140 43 4b 49 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a  CKING to 1 will.
38150 2a 2a 20 66 6f 72 63 65 20 70 72 6f 78 79 20 6c  ** force proxy l
38160 6f 63 6b 69 6e 67 20 74 6f 20 62 65 20 75 73 65  ocking to be use
38170 64 20 66 6f 72 20 65 76 65 72 79 20 64 61 74 61  d for every data
38180 62 61 73 65 20 66 69 6c 65 20 6f 70 65 6e 65 64  base file opened
38190 2c 20 61 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20  , and 0.** will 
381a0 66 6f 72 63 65 20 61 75 74 6f 6d 61 74 69 63 20  force automatic 
381b0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f  proxy locking to
381c0 20 62 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72   be disabled for
381d0 20 61 6c 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a   all database.**
381e0 20 66 69 6c 65 73 20 28 65 78 70 6c 69 63 69 74   files (explicit
381f0 6c 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20 53  ly calling the S
38200 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
38210 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 70 72  LOCKPROXYFILE pr
38220 61 67 6d 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74  agma or.** sqlit
38230 65 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41  e_file_control A
38240 50 49 20 69 73 20 6e 6f 74 20 61 66 66 65 63 74  PI is not affect
38250 65 64 20 62 79 20 53 51 4c 49 54 45 5f 46 4f 52  ed by SQLITE_FOR
38260 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  CE_PROXY_LOCKING
38270 29 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f  )..*/../*.** Pro
38280 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  xy locking is on
38290 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
382a0 4d 61 63 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64  MacOSX .*/.#if d
382b0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
382c0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
382d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
382e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ../*.** The prox
382f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
38300 68 61 73 20 74 68 65 20 70 61 74 68 20 61 6e 64  has the path and
38310 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 73   file structures
38320 20 66 6f 72 20 74 68 65 20 72 65 6d 6f 74 65 20   for the remote 
38330 0a 2a 2a 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72  .** and local pr
38340 6f 78 79 20 66 69 6c 65 73 20 69 6e 20 69 74 0a  oxy files in it.
38350 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
38360 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
38370 6e 74 65 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69  ntext proxyLocki
38380 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
38390 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  t proxyLockingCo
383a0 6e 74 65 78 74 20 7b 0a 20 20 75 6e 69 78 46 69  ntext {.  unixFi
383b0 6c 65 20 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20  le *conchFile;  
383c0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63         /* Open c
383d0 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63  onch file */.  c
383e0 68 61 72 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61  har *conchFilePa
383f0 74 68 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  th;         /* N
38400 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68  ame of the conch
38410 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
38420 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20  ile *lockProxy; 
38430 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
38440 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20  proxy lock file 
38450 2a 2f 0a 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50  */.  char *lockP
38460 72 6f 78 79 50 61 74 68 3b 20 20 20 20 20 20 20  roxyPath;       
38470 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
38480 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65   proxy lock file
38490 20 2a 2f 0a 20 20 63 68 61 72 20 2a 64 62 50 61   */.  char *dbPa
384a0 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
384b0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
384c0 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  e open file */. 
384d0 20 69 6e 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20   int conchHeld; 
384e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
384f0 20 31 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20   1 if the conch 
38500 69 73 20 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c  is held, -1 if l
38510 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74  ockless */.  int
38520 20 6e 46 61 69 6c 73 3b 20 20 20 20 20 20 20 20   nFails;        
38530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
38540 62 65 72 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b  ber of conch tak
38550 69 6e 67 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a  ing failures */.
38560 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69    void *oldLocki
38570 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f  ngContext;     /
38580 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69  * Original locki
38590 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65 73  ngcontext to res
385a0 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  tore on close */
385b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  .  sqlite3_io_me
385c0 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c  thods const *pOl
385d0 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20  dMethod;     /* 
385e0 4f 72 69 67 69 6e 61 6c 20 49