/ Hex Artifact Content
Login

Artifact e853b5922c4b4bc04bd181289bc2b9756f4bb0a3b5861554bc31937abb0e7a7b:


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 2f 0a 73 74 61 74 69 63 20 73  ve().*/.static s
5ce0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 75 6e  qlite3_mutex *un
5cf0: 69 78 42 69 67 4c 6f 63 6b 20 3d 20 30 3b 0a 73  ixBigLock = 0;.s
5d00: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
5d10: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
5d20: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
5d30: 5f 65 6e 74 65 72 28 75 6e 69 78 42 69 67 4c 6f  _enter(unixBigLo
5d40: 63 6b 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ck);.}.static vo
5d50: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
5d60: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
5d70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 75  e3_mutex_leave(u
5d80: 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a 23  nixBigLock);.}.#
5d90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
5da0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
5db0: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
5dc0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
5dd0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
5de0: 75 6e 69 78 42 69 67 4c 6f 63 6b 29 3b 0a 7d 0a  unixBigLock);.}.
5df0: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
5e00: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
5e10: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  RACE./*.** Helpe
5e20: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
5e30: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
5e40: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
5e50: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
5e60: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
5e70: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
5e80: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
5e90: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
5ea0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
5eb0: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
5ec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
5ed0: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
5ee0: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
5ef0: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
5f00: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
5f10: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
5f20: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
5f30: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
5f40: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
5f50: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
5f60: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
5f70: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
5f80: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
5f90: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
5fa0: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
5fb0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
5fc0: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
5fd0: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
5fe0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
5ff0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
6000: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
6010: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6020: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
6030: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
6040: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
6050: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
6060: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
6070: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
6080: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
6090: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
60a0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
60b0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
60c0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
60d0: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
60e0: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
60f0: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
6100: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
6110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
6120: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
6130: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
6140: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
6150: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
6160: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
6170: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
6180: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
6190: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
61a0: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
61b0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
61c0: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
61d0: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
61e0: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
61f0: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
6200: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
6210: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
6220: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
6230: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
6240: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
6250: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
6260: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
6270: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
6280: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
6290: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
62a0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
62b0: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
62c0: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
62d0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
62e0: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
62f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
6300: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
6310: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
6320: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
6330: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
6340: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
6350: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
6360: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
6370: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
6380: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
6390: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
63a0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
63b0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
63c0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
63d0: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
63e0: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
63f0: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
6400: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
6410: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
6420: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
6430: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
6440: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
6450: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
6460: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
6470: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
6480: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
6490: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
64a0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
64b0: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
64c0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
64d0: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
64e0: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
64f0: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
6500: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
6510: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
6520: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
6530: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
6540: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
6550: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
6560: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
6570: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
6580: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
6590: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
65a0: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
65b0: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
65c0: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
65d0: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
65e0: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
65f0: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
6600: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
6610: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
6620: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6630: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
6640: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
6650: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
6660: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
6670: 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61  NTR.**.** All ca
6680: 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65  lls to ftruncate
6690: 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  () within this f
66a0: 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  ile should be ma
66b0: 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  de through.** th
66c0: 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20  is wrapper.  On 
66d0: 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74  the Android plat
66e0: 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20  form, bypassing 
66f0: 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a  the logic below.
6700: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
6710: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
6720: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
6730: 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  nt robust_ftrunc
6740: 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74  ate(int h, sqlit
6750: 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20  e3_int64 sz){.  
6760: 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
6770: 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20  _ANDROID__.  /* 
6780: 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75  On Android, ftru
6790: 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75  ncate() always u
67a0: 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65  ses 32-bit offse
67b0: 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a  ts, even if .  *
67c0: 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42  * _FILE_OFFSET_B
67d0: 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65  ITS=64 is define
67e0: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74  d. This means it
67f0: 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74   is unsafe to at
6800: 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72  tempt to.  ** tr
6810: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
6820: 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72   any size larger
6830: 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65   than 2GiB. Sile
6840: 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a  ntly ignore any.
6850: 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70    ** such attemp
6860: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a  ts.  */.  if( sz
6870: 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  >(sqlite3_int64)
6880: 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20  0x7FFFFFFF ){.  
6890: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
68a0: 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
68b0: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
68c0: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
68d0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
68e0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
68f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6900: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6910: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
6920: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
6930: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
6940: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
6950: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
6960: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
6970: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
6980: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
6990: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
69a0: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
69b0: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
69c0: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
69d0: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
69e0: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
69f0: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
6a00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6a10: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
6a20: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
6a30: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
6a40: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
6a50: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
6a60: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
6a70: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
6a80: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
6a90: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
6aa0: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
6ab0: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
6ac0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
6ad0: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
6ae0: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
6af0: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
6b00: 72 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20  rr) {.  assert( 
6b10: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6b20: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
6b30: 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  K) || .         
6b40: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
6b50: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
6b60: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
6b70: 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72      (sqliteIOErr
6b80: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
6b90: 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20  _RDLOCK) ||.    
6ba0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45        (sqliteIOE
6bb0: 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  rr == SQLITE_IOE
6bc0: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
6bd0: 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74 63  LOCK) );.  switc
6be0: 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b  h (posixError) {
6bf0: 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a 20  .  case EACCES: 
6c00: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
6c10: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
6c20: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
6c30: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
6c40: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
6c50: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
6c60: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
6c70: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
6c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
6c90: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
6ca0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
6cb0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
6cc0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
6cd0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
6ce0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
6cf0: 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20 20   case EPERM: .  
6d00: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6d10: 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65 66  PERM;.    .  def
6d20: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
6d30: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
6d40: 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
6d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6d90: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
6da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
6db0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
6dc0: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
6dd0: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
6de0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
6df0: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
6e00: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
6e10: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
6e20: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
6e30: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
6e40: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
6e50: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
6e60: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
6e70: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
6e80: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
6e90: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
6ea0: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
6eb0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
6ec0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
6ed0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
6ee0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
6ef0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
6f00: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
6f10: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
6f20: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
6f30: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
6f40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
6f50: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
6f60: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
6f70: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
6f80: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
6f90: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
6fa0: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
6fb0: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
6fc0: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
6fd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
6fe0: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
6ff0: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
7000: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
7010: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
7020: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
7030: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
7040: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
7050: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
7060: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
7070: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
7080: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
7090: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
70a0: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
70b0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
70c0: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
70d0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
70e0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
70f0: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
7100: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
7110: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
7120: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7130: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
7140: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
7150: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
7160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7170: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
7180: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
7190: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
71a0: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
71b0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
71c0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
71d0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
71e0: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
71f0: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
7200: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
7210: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
7220: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
7230: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
7240: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
7250: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
7260: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
7270: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
7280: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
7290: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
72a0: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
72b0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
72c0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
72d0: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
72e0: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
72f0: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
7300: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
7310: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
7320: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
7330: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
7340: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
7350: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
7360: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
7370: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
7380: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
7390: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
73a0: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
73b0: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
73c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
73d0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
73e0: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
73f0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
7400: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
7410: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
7420: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
7430: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
7440: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
7450: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
7460: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
7470: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
7480: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
7490: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
74a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
74b0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
74c0: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
74d0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
74e0: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
74f0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
7500: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
7510: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
7520: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
7530: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
7540: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
7550: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
7560: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
7570: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
7580: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
7590: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
75a0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
75b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
75c0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
75d0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
75e0: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
75f0: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
7600: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
7610: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
7620: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
7630: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
7640: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
7650: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
7660: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
7670: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
7680: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
7690: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
76a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
76b0: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
76c0: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
76d0: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
76e0: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
76f0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
7700: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
7710: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
7720: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
7730: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
7740: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
7750: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
7760: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
7770: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
7780: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7790: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
77a0: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
77b0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
77c0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
77d0: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
77e0: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
77f0: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
7800: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
7810: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
7820: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
7830: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
7840: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
7850: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
7860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
7880: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
7890: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
78a0: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
78b0: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
78c0: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
78d0: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
78e0: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
78f0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
7900: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
7910: 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20   (n+1) );.  if( 
7920: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
7930: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e   0;.  pNew->zCan
7940: 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68  onicalName = (ch
7950: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
7960: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61  memcpy(pNew->zCa
7970: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62  nonicalName, zAb
7980: 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29  soluteName, n+1)
7990: 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53  ;.  n = vxworksS
79a0: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77  implifyName(pNew
79b0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
79c0: 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  , n);..  /* Sear
79d0: 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
79e0: 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  ng entry that ma
79f0: 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e  tching the canon
7a00: 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  ical name..  ** 
7a10: 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d  If found, increm
7a20: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
7a30: 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75  e count and retu
7a40: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
7a50: 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e    ** the existin
7a60: 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a  g file ID..  */.
7a70: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
7a80: 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69  ();.  for(pCandi
7a90: 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65  date=vxworksFile
7aa0: 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65  List; pCandidate
7ab0: 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61  ; pCandidate=pCa
7ac0: 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b  ndidate->pNext){
7ad0: 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64  .    if( pCandid
7ae0: 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20  ate->nName==n . 
7af0: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43      && memcmp(pC
7b00: 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e  andidate->zCanon
7b10: 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  icalName, pNew->
7b20: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
7b30: 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  n)==0.    ){.   
7b40: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
7b50: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70  (pNew);.       p
7b60: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b  Candidate->nRef+
7b70: 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65  +;.       unixLe
7b80: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
7b90: 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69     return pCandi
7ba0: 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  date;.    }.  }.
7bb0: 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77  .  /* No match w
7bc0: 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69  as found.  We wi
7bd0: 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69  ll make a new fi
7be0: 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d  le ID */.  pNew-
7bf0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65  >nRef = 1;.  pNe
7c00: 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20  w->nName = n;.  
7c10: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78  pNew->pNext = vx
7c20: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20  worksFileList;. 
7c30: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
7c40: 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c   = pNew;.  unixL
7c50: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
7c60: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
7c70: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
7c80: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
7c90: 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46  nt on a vxworksF
7ca0: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46  ileId object.  F
7cb0: 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ree.** the objec
7cc0: 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  t when the refer
7cd0: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
7ce0: 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  es zero..*/.stat
7cf0: 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52  ic void vxworksR
7d00: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72  eleaseFileId(str
7d10: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
7d20: 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45  d *pId){.  unixE
7d30: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
7d40: 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66  ssert( pId->nRef
7d50: 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65  >0 );.  pId->nRe
7d60: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e  f--;.  if( pId->
7d70: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
7d80: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
7d90: 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f  eId **pp;.    fo
7da0: 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c  r(pp=&vxworksFil
7db0: 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70  eList; *pp && *p
7dc0: 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28  p!=pId; pp = &((
7dd0: 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a  *pp)->pNext)){}.
7de0: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d      assert( *pp=
7df0: 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20  =pId );.    *pp 
7e00: 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pId->pNext;.  
7e10: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7e20: 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Id);.  }.  unixL
7e30: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23  eaveMutex();.}.#
7e40: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
7e50: 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RKS */./********
7e60: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55  ******* End of U
7e70: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
7e80: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
7e90: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
7ea0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7eb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ef0: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
7f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f40: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
7f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f60: 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73  **** Posix Advis
7f70: 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ory Locking ****
7f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7f90: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
7fa0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
7fb0: 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62  cks are broken b
7fc0: 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20  y design.  ANSI 
7fd0: 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36  STD 1003.1 (1996
7fe0: 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35  ).** section 6.5
7ff0: 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74  .2.2 lines 483 t
8000: 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69  hrough 490 speci
8010: 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70  fy that when a p
8020: 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f  rocess.** sets o
8030: 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c  r clears a lock,
8040: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
8050: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
8060: 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a  ior locks set.**
8070: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
8080: 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e  cess.  It does n
8090: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61  ot explicitly sa
80a0: 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69  y so, but this i
80b0: 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69  mplies.** that i
80c0: 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b  t overrides lock
80d0: 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d  s set by the sam
80e0: 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20  e process using 
80f0: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  a different.** f
8100: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
8110: 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   Consider this t
8120: 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20  est case:.**.** 
8130: 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20        int fd1 = 
8140: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20  open("./file1", 
8150: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
8160: 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20  0644);.**       
8170: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
8180: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
8190: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
81a0: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
81b0: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
81c0: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
81d0: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
81e0: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
81f0: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
8200: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
8210: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
8220: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
8230: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
8240: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
8250: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
8260: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
8270: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
8280: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
8290: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
82a0: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
82b0: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
82c0: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
82d0: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
82e0: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
82f0: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
8300: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
8310: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
8320: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
8330: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
8340: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
8350: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
8360: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
8370: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
8380: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
8390: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  e names..**.** T
83a0: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
83b0: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53  e cannot use POS
83c0: 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63  IX locks to sync
83d0: 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63  hronize file acc
83e0: 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d  ess.** among com
83f0: 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f  peting threads o
8400: 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  f the same proce
8410: 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73  ss.  POSIX locks
8420: 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a   will work fine.
8430: 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ** to synchroniz
8440: 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72  e access for thr
8450: 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65  eads in separate
8460: 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20   processes, but 
8470: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77  not.** threads w
8480: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ithin the same p
8490: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  rocess..**.** To
84a0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
84b0: 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65   problem, SQLite
84c0: 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66   has to manage f
84d0: 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e  ile locks intern
84e0: 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f  ally.** on its o
84f0: 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20  wn.  Whenever a 
8500: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
8510: 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20  opened, we have 
8520: 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73  to find the.** s
8530: 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66  pecific inode of
8540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8550: 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73  le (the inode is
8560: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
8570: 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64  he.** st_dev and
8580: 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f   st_ino fields o
8590: 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63  f the stat struc
85a0: 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28  ture that fstat(
85b0: 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61  ) fills in).** a
85c0: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63  nd check for loc
85d0: 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ks already exist
85e0: 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64  ing on that inod
85f0: 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61  e.  When locks a
8600: 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72  re.** created or
8610: 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76   removed, we hav
8620: 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72  e to look at our
8630: 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65   own internal re
8640: 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  cord of the.** l
8650: 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ocks to see if a
8660: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
8670: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
8680: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20   a lock on that 
8690: 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a  same.** inode..*
86a0: 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65  *.** (Aside: The
86b0: 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75   use of inode nu
86c0: 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20  mbers as unique 
86d0: 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  IDs does not wor
86e0: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
86f0: 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65   For VxWorks, we
8700: 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65   have to use the
8710: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69   alternative uni
8720: 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61  que ID system ba
8730: 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69  sed on.** canoni
8740: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  cal filename and
8750: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
8760: 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76  the previous div
8770: 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ision.).**.** Th
8780: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
8790: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
87a0: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
87b0: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
87c0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
87d0: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
87e0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
87f0: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
8800: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
8810: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
8820: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
8830: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
8840: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
8850: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
8860: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
8870: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
8880: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
8890: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
88a0: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
88b0: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
88c0: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
88d0: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
88e0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
88f0: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
8900: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
8910: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
8920: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
8930: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
8940: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
8950: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
8960: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
8970: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
8980: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
8990: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
89a0: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
89b0: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
89c0: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
89d0: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
89e0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
89f0: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
8a00: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
8a10: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
8a20: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
8a30: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
8a40: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
8a50: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
8a60: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
8a70: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
8a80: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
8a90: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
8aa0: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
8ab0: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
8ac0: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
8ad0: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
8ae0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
8af0: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
8b00: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
8b10: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a  .**.** But wait:
8b20: 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20    there are yet 
8b30: 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69  more problems wi
8b40: 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  th POSIX advisor
8b50: 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49  y locks..**.** I
8b60: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
8b70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
8b80: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
8b90: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
8ba0: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
8bb0: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
8bc0: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
8bd0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
8be0: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
8bf0: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
8c00: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
8c10: 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64  m, each unixInod
8c20: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  eInfo object.** 
8c30: 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e  maintains a coun
8c40: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
8c50: 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73  of pending locks
8c60: 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a   on tha inode..*
8c70: 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  * When an attemp
8c80: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f  t is made to clo
8c90: 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20  se an unixFile, 
8ca0: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
8cb0: 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f  other unixFile o
8cc0: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
8cd0: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
8ce0: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
8cf0: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
8d00: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
8d10: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
8d20: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
8d30: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
8d40: 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e  r..** The unixIn
8d50: 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  odeInfo structur
8d60: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
8d70: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
8d80: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
8d90: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
8da0: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
8db0: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
8dc0: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
8dd0: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
8de0: 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68  .**.** Yet anoth
8df0: 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e  er problem:  Lin
8e00: 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74  uxThreads do not
8e10: 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20   play well with 
8e20: 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  posix locks..**.
8e30: 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65  ** Many older ve
8e40: 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20  rsions of linux 
8e50: 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72  use the LinuxThr
8e60: 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69  eads library whi
8e70: 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73  ch is.** not pos
8e80: 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55  ix compliant.  U
8e90: 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64  nder LinuxThread
8ea0: 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  s, a lock create
8eb0: 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41  d by thread.** A
8ec0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
8ed0: 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65  ied or overridde
8ee0: 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  n by a different
8ef0: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
8f00: 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ly thread A can 
8f10: 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e  modify the lock.
8f20: 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69    Locking behavi
8f30: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a  or is correct.**
8f40: 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69   if the appliati
8f50: 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65  on uses the newe
8f60: 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54  r Native Posix T
8f70: 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e  hread Library (N
8f80: 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78  PTL).** on linux
8f90: 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c   - with NPTL a l
8fa0: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
8fb0: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
8fc0: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e  ride locks.** in
8fd0: 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20   thread B.  But 
8fe0: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
8ff0: 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  to know at compi
9000: 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a  le-time which.**
9010: 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61   threading libra
9020: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
9030: 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  .  So there is n
9040: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
9050: 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  .** compile-time
9060: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
9070: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
9080: 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  rride locks on t
9090: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20  hread B..** One 
90a0: 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d  has to do a run-
90b0: 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69  time check to di
90c0: 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76  scover the behav
90d0: 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ior of the.** cu
90e0: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a  rrent process..*
90f0: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64  *.** SQLite used
9100: 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75   to support Linu
9110: 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73  xThreads.  But s
9120: 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78  upport for Linux
9130: 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64  Threads.** was d
9140: 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67  ropped beginning
9150: 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e   with version 3.
9160: 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c  7.0.  SQLite wil
9170: 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74  l still work wit
9180: 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64  h.** LinuxThread
9190: 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  s provided that 
91a0: 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (1) there is no 
91b0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
91c0: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72  nnection .** per
91d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
91e0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
91f0: 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62  ss and (2) datab
9200: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
9210: 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61  ** do not move a
9220: 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a  cross threads..*
9230: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
9240: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
9250: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
9260: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
9270: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
9280: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
9290: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
92a0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  bject..*/.struct
92b0: 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20   unixFileId {.  
92c0: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20  dev_t dev;      
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
92e0: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
92f0: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
9300: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9310: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20  ileId *pId;  /* 
9320: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  Unique file ID f
9330: 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23  or vxworks. */.#
9340: 65 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72 65  else.  /* We are
9350: 20 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65 20   told that some 
9360: 76 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64 72  versions of Andr
9370: 6f 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62 75  oid contain a bu
9380: 67 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a 65  g that.  ** size
9390: 73 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79 20  s ino_t at only 
93a0: 33 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64 20  32-bits instead 
93b0: 6f 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65 65  of 64-bits. (See
93c0: 0a 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61 6e  .  ** https://an
93d0: 64 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f 6f  droid-review.goo
93e0: 67 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23 2f  glesource.com/#/
93f0: 63 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74 2f  c/115351/3/dist/
9400: 73 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a 20  sqlite3.c).  ** 
9410: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
9420: 68 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c 6f  his, always allo
9430: 63 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f 72  cate 64-bits for
9440: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
9450: 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d 61  r.  .  ** On sma
9460: 6c 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61 74  ll machines that
9470: 20 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62 69   only have 32-bi
9480: 74 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20 77  t inodes, this w
9490: 61 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a 20  astes 4 bytes,. 
94a0: 20 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68 6f   ** but that sho
94b0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69 67  uld not be a big
94c0: 20 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20 57   deal. */.  /* W
94d0: 41 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  AS:  ino_t ino; 
94e0: 20 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b 20    */.  u64 ino; 
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9500: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
9510: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
9520: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
9530: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
9540: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
9550: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
9560: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
9570: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
9580: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
9590: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
95a0: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
95b0: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
95c0: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
95d0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
95e0: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
95f0: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
9600: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
9610: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
9620: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
9630: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
9640: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
9650: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
9660: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
9670: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
9680: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
9690: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
96a0: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
96b0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20  nixInodeInfo {. 
96c0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
96d0: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
96e0: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
96f0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  ey */.  int nSha
9700: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
9710: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9720: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
9730: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69  s held */.  unsi
9740: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
9750: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ock;        /* O
9760: 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43  ne of SHARED_LOC
9770: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
9780: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67   etc. */.  unsig
9790: 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73  ned char bProces
97a0: 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e  sLock;     /* An
97b0: 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65   exclusive proce
97c0: 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ss lock is held 
97d0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9800: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
9810: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
9820: 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
9830: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
9840: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
9850: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
9860: 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  th this inode */
9870: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
98a0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65  outstanding file
98b0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78   locks */.  Unix
98c0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
98d0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
98e0: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
98f0: 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20  iptors to close 
9900: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
9910: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  fo *pNext;      
9920: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
9930: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
9940: 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75  o objects */.  u
9950: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50  nixInodeInfo *pP
9960: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rev;           /
9970: 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79  *    .... doubly
9980: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53   linked */.#if S
9990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
99a0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73  KING_STYLE.  uns
99b0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
99c0: 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20  sharedByte;  /* 
99d0: 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65  for AFP simulate
99e0: 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  d shared lock */
99f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
9a00: 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a  XWORKS.  sem_t *
9a10: 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pSem;           
9a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
9a30: 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72  d POSIX semaphor
9a40: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d  e */.  char aSem
9a50: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  Name[MAX_PATHNAM
9a60: 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  E+2];  /* Name o
9a70: 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65  f that semaphore
9a80: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9a90: 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20  *.** A lists of 
9aa0: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
9ab0: 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  o objects..*/.st
9ac0: 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e  atic unixInodeIn
9ad0: 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20  fo *inodeList = 
9ae0: 30 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 49  0;  /* All unixI
9af0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73  nodeInfo objects
9b00: 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67   */.static unsig
9b10: 6e 65 64 20 69 6e 74 20 6e 55 6e 75 73 65 64 46  ned int nUnusedF
9b20: 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 6f 74  d = 0;    /* Tot
9b30: 61 6c 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  al unused file d
9b40: 65 73 63 72 69 70 74 6f 72 73 20 2a 2f 0a 0a 2f  escriptors */../
9b50: 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  *.**.** This fun
9b60: 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45  ction - unixLogE
9b70: 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69 73  rrorAtLine(), is
9b80: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
9b90: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
9ba0: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
9bb0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
9bc0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
9bd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
9be0: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
9bf0: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
9c00: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
9c10: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
9c20: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
9c30: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9c40: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
9c50: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
9c60: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
9c70: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
9c80: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
9c90: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
9ca0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
9cb0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
9cc0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
9cd0: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
9ce0: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
9cf0: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
9d00: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
9d10: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
9d20: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
9d30: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9d40: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
9d50: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
9d60: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
9d70: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
9d80: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
9d90: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
9da0: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
9db0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
9dc0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
9dd0: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
9de0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
9df0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
9e00: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
9e10: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
9e20: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
9e30: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
9e40: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
9e50: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
9e60: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
9e70: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
9e80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
9e90: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
9ea0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
9eb0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
9ec0: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
9ed0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
9ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
9ef0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
9f00: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
9f10: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f30: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
9f40: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
9f50: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
9f60: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
9f90: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
9fa0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
9fb0: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
9fc0: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
9fd0: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
9fe0: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
9ff0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
a000: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
a010: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
a020: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
a030: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
a040: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
a050: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
a060: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
a070: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
a080: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
a090: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
a0a0: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
a0b0: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
a0c0: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
a0d0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
a0e0: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
a0f0: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
a100: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
a110: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
a120: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
a130: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
a140: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
a150: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
a160: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
a170: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
a180: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
a190: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
a1a0: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
a1b0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
a1c0: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
a1d0: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
a1e0: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
a1f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
a200: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
a210: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
a220: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
a230: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
a240: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
a250: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
a260: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
a270: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
a280: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
a290: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
a2a0: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
a2b0: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
a2c0: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
a2d0: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
a2e0: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
a2f0: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
a300: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
a310: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
a320: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
a330: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
a340: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
a350: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
a360: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
a370: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
a380: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
a390: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
a3a0: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
a3b0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
a3c0: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
a3d0: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
a3e0: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
a3f0: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
a400: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
a410: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
a420: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
a430: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
a440: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
a450: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
a460: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
a470: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
a480: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
a490: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
a4a0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
a4b0: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
a4c0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
a4d0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
a4e0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
a4f0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
a500: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
a510: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
a520: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
a530: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
a540: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
a550: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
a560: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
a570: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
a580: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
a590: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
a5a0: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
a5b0: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
a5c0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
a5d0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
a5e0: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
a5f0: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
a600: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
a610: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
a620: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
a630: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
a640: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
a650: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
a660: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
a670: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
a680: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
a690: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
a6a0: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
a6b0: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
a6c0: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
a6d0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
a6e0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
a6f0: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
a700: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
a710: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
a720: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
a730: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
a740: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
a750: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
a760: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
a770: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
a780: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
a790: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
a7a0: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
a7b0: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
a7c0: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
a7d0: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
a7e0: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
a7f0: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
a800: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
a810: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
a820: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
a830: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
a840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a850: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
a860: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
a870: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
a880: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46  /*.** Set the pF
a890: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20  ile->lastErrno. 
a8a0: 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   Do this in a su
a8b0: 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74  broutine as that
a8c0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63   provides.** a c
a8d0: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
a8e0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
a8f0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
a900: 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72  oid storeLastErr
a910: 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  no(unixFile *pFi
a920: 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a  le, int error){.
a930: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a940: 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f  no = error;.}../
a950: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
a960: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
a970: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
a980: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
a990: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
a9a0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
a9b0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
a9c0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
a9d0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a9e0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a9f0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
aa00: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
aa10: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
aa20: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
aa30: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
aa40: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
aa50: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
aa60: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
aa70: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
aa80: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
aa90: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
aaa0: 20 20 20 6e 55 6e 75 73 65 64 46 64 2d 2d 3b 0a     nUnusedFd--;.
aab0: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55    }.  pInode->pU
aac0: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
aad0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
aae0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
aaf0: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
ab00: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
ab10: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
ab20: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
ab30: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
ab40: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
ab50: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
ab60: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
ab70: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
ab80: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
ab90: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
aba0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c  nodeInfo(unixFil
abb0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
abc0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
abd0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
abe0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
abf0: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
ac00: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
ac10: 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e  node) ){.    pIn
ac20: 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ode->nRef--;.   
ac30: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65   if( pInode->nRe
ac40: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
ac50: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53  sert( pInode->pS
ac60: 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20  hmNode==0 );.   
ac70: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
ac80: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
ac90: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72   if( pInode->pPr
aca0: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ev ){.        as
acb0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50  sert( pInode->pP
acc0: 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f  rev->pNext==pIno
acd0: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
ace0: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
acf0: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  xt = pInode->pNe
ad00: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
ad10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ad20: 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f   inodeList==pIno
ad30: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  de );.        in
ad40: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
ad50: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
ad60: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
ad70: 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  e->pNext ){.    
ad80: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
ad90: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
ada0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
adb0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
adc0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
add0: 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  e->pPrev;.      
ade0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
adf0: 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20  free(pInode);.  
ae00: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
ae10: 28 20 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c  ( inodeList!=0 |
ae20: 7c 20 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29  | nUnusedFd==0 )
ae30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
ae40: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
ae50: 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75  or, locate the u
ae60: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
ae70: 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  ect that.** desc
ae80: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
ae90: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
aea0: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
aeb0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
aec0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
aed0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
aee0: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
aef0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
af00: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
af10: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
af20: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
af30: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
af40: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
af50: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
af60: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
af70: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
af80: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
af90: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
afa0: 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69  InodeInfo(.  uni
afb0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
afd0: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
afe0: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
aff0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69  the key */.  uni
b000: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49  xInodeInfo **ppI
b010: 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52  node        /* R
b020: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e  eturn the unixIn
b030: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68  odeInfo object h
b040: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
b050: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
b060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
b070: 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e  stem call return
b080: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66   code */.  int f
b090: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
b0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
b0b0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b0c0: 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20   for pFile */.  
b0d0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
b0e0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
b0f0: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
b100: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
b110: 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  fo */.  struct s
b120: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
b130: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
b140: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
b150: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  tion */.  unixIn
b160: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
b170: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  = 0;     /* Cand
b180: 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49  idate unixInodeI
b190: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  nfo object */.. 
b1a0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
b1b0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
b1c0: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
b1d0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
b1e0: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
b1f0: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
b200: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
b210: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
b220: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
b230: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
b240: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
b250: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
b260: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
b270: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
b280: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 20  le, errno);.#if 
b290: 64 65 66 69 6e 65 64 28 45 4f 56 45 52 46 4c 4f  defined(EOVERFLO
b2a0: 57 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  W) && defined(SQ
b2b0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
b2c0: 29 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ).    if( pFile-
b2d0: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
b2e0: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
b2f0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
b300: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
b310: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
b320: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
b330: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
b340: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
b350: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
b360: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
b370: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
b380: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
b390: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
b3a0: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
b3b0: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
b3c0: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
b3d0: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
b3e0: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
b3f0: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
b400: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
b410: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
b420: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
b430: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
b440: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
b450: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
b460: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
b470: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
b480: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
b490: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
b4a0: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
b4b0: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
b4c0: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
b4d0: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
b4e0: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
b4f0: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
b500: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
b510: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
b520: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
b530: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
b540: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
b550: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
b560: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
b570: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
b580: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
b590: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
b5a0: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
b5b0: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
b5c0: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
b5d0: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
b5e0: 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65  do{ rc = osWrite
b5f0: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77  (fd, "S", 1); }w
b600: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
b610: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
b620: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
b630: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
b640: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
b650: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b660: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
b670: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46    }.    rc = osF
b680: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
b690: 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
b6a0: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  0 ){.      store
b6b0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b6c0: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
b6d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
b6e0: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
b6f0: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
b700: 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f  fileId, 0, sizeo
b710: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69  f(fileId));.  fi
b720: 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62  leId.dev = statb
b730: 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f  uf.st_dev;.#if O
b740: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65  S_VXWORKS.  file
b750: 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  Id.pId = pFile->
b760: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c  pId;.#else.  fil
b770: 65 49 64 2e 69 6e 6f 20 3d 20 28 75 36 34 29 73  eId.ino = (u64)s
b780: 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23  tatbuf.st_ino;.#
b790: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
b7a0: 69 6e 6f 64 65 4c 69 73 74 21 3d 30 20 7c 7c 20  inodeList!=0 || 
b7b0: 6e 55 6e 75 73 65 64 46 64 3d 3d 30 20 29 3b 0a  nUnusedFd==0 );.
b7c0: 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65    pInode = inode
b7d0: 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20 70  List;.  while( p
b7e0: 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70 28  Inode && memcmp(
b7f0: 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64 65  &fileId, &pInode
b800: 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66  ->fileId, sizeof
b810: 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20 20  (fileId)) ){.   
b820: 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
b830: 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
b840: 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a  f( pInode==0 ){.
b850: 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71 6c      pInode = sql
b860: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
b870: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29  izeof(*pInode) )
b880: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
b890: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
b8a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
b8b0: 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
b8c0: 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20   memset(pInode, 
b8d0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  0, sizeof(*pInod
b8e0: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e));.    memcpy(
b8f0: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
b900: 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66   &fileId, sizeof
b910: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70  (fileId));.    p
b920: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
b930: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
b940: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
b950: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
b960: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
b970: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
b980: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
b990: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
b9a0: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
b9b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
b9c0: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
b9d0: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
b9e0: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
b9f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ba00: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
ba10: 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72  pFile has been r
ba20: 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b  enamed or unlink
ba30: 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ed since it was 
ba40: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f  first opened..*/
ba50: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
ba60: 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c  HasMoved(unixFil
ba70: 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f  e *pFile){.#if O
ba80: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
ba90: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
baa0: 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  !=0 && pFile->pI
bab0: 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  d!=pFile->pInode
bac0: 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65  ->fileId.pId;.#e
bad0: 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61  lse.  struct sta
bae0: 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20  t buf;.  return 
baf0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
bb00: 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61   &&.      (osSta
bb10: 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  t(pFile->zPath, 
bb20: 26 62 75 66 29 21 3d 30 20 0a 20 20 20 20 20 20  &buf)!=0 .      
bb30: 20 20 20 7c 7c 20 28 75 36 34 29 62 75 66 2e 73     || (u64)buf.s
bb40: 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49  t_ino!=pFile->pI
bb50: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
bb60: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  );.#endif.}.../*
bb70: 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78  .** Check a unix
bb80: 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64  File that is a d
bb90: 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79  atabase.  Verify
bba0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
bbb0: 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20  **.** (1) There 
bbc0: 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68  is exactly one h
bbd0: 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20  ard link on the 
bbe0: 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20  file.** (2) The 
bbf0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79  file is not a sy
bc00: 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28  mbolic link.** (
bc10: 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20  3) The file has 
bc20: 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  not been renamed
bc30: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a   or unlinked.**.
bc40: 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33  ** Issue sqlite3
bc50: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
bc60: 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65  ING,...) message
bc70: 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  s if anything is
bc80: 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73   not right..*/.s
bc90: 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66  tatic void verif
bca0: 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65  yDbFile(unixFile
bcb0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75   *pFile){.  stru
bcc0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69  ct stat buf;.  i
bcd0: 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65  nt rc;..  /* The
bce0: 73 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 73  se verifications
bcf0: 20 6f 63 63 75 72 73 20 66 6f 72 20 74 68 65 20   occurs for the 
bd00: 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e  main database on
bd10: 6c 79 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ly */.  if( pFil
bd20: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
bd30: 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
bd40: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 72 63 20 3d   return;..  rc =
bd50: 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
bd60: 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20  h, &buf);.  if( 
bd70: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rc!=0 ){.    sql
bd80: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
bd90: 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74  WARNING, "cannot
bda0: 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25   fstat db file %
bdb0: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
bdc0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
bdd0: 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f   }.  if( buf.st_
bde0: 6e 6c 69 6e 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  nlink==0 ){.    
bdf0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
be00: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
be10: 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65  e unlinked while
be20: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
be30: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
be40: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
be50: 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20   buf.st_nlink>1 
be60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
be70: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
be80: 47 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e  G, "multiple lin
be90: 6b 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c  ks to file: %s",
bea0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
beb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
bec0: 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76    if( fileHasMov
bed0: 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ed(pFile) ){.   
bee0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
bef0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
bf00: 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65  le renamed while
bf10: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
bf20: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72  e->zPath);.    r
bf30: 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  eturn;.  }.}.../
bf40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
bf50: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
bf60: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
bf70: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
bf80: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
bf90: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
bfa0: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
bfb0: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
bfc0: 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
bfd0: 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
bfe0: 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
bff0: 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
c000: 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
c010: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
c020: 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
c030: 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
c040: 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
c050: 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
c060: 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
c070: 74 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63  tic int unixChec
c080: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
c090: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
c0a0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
c0b0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
c0c0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
c0d0: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
c0e0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
c0f0: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
c100: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
c110: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
c120: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
c130: 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73  DLOCK; );..  ass
c140: 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
c150: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
c160: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
c170: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 75 6e 69 78 45  _LOCK );.  unixE
c180: 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
c190: 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
c1a0: 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
c1b0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
c1c0: 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  /..  /* Check if
c1d0: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
c1e0: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
c1f0: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
c200: 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
c210: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  de->eFileLock>SH
c220: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
c230: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
c240: 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69   }..  /* Otherwi
c250: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
c260: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
c270: 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e  ds it..  */.#ifn
c280: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
c290: 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26 26  if( !reserved &&
c2a0: 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d   !pFile->pInode-
c2b0: 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b  >bProcessLock ){
c2c0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
c2d0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b  k lock;.    lock
c2e0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
c2f0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
c300: 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45  _start = RESERVE
c310: 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b  D_BYTE;.    lock
c320: 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20  .l_len = 1;.    
c330: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
c340: 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f  WRLCK;.    if( o
c350: 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c  sFcntl(pFile->h,
c360: 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_GETLK, &lock)
c370: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
c380: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
c390: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
c3a0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
c3b0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
c3c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  );.    } else if
c3d0: 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46  ( lock.l_type!=F
c3e0: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
c3f0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
c400: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
c410: 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
c420: 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
c430: 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25  ("TEST WR-LOCK %
c440: 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c 6e  d %d %d (unix)\n
c450: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
c460: 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20   reserved));..  
c470: 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
c480: 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
c490: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61  ;.}../*.** Set a
c4a0: 20 70 6f 73 69 78 2d 61 64 76 69 73 6f 72 79 2d   posix-advisory-
c4b0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72  lock..**.** Ther
c4c0: 65 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f  e are two versio
c4d0: 6e 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ns of this routi
c4e0: 6e 65 2e 20 20 49 66 20 63 6f 6d 70 69 6c 65 64  ne.  If compiled
c4f0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 49 54 45 5f   with.** SQLITE_
c500: 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d  ENABLE_SETLK_TIM
c510: 45 4f 55 54 20 74 68 65 6e 20 74 68 65 20 72 6f  EOUT then the ro
c520: 75 74 69 6e 65 20 68 61 73 20 61 6e 20 65 78 74  utine has an ext
c530: 72 61 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  ra parameter.** 
c540: 77 68 69 63 68 20 69 73 20 61 20 70 6f 69 6e 74  which is a point
c550: 65 72 20 74 6f 20 61 20 75 6e 69 78 46 69 6c 65  er to a unixFile
c560: 2e 20 20 49 66 20 74 68 65 20 75 6e 69 78 46 69  .  If the unixFi
c570: 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74  le->iBusyTimeout
c580: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 73 65 74  .** value is set
c590: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65  , then it is the
c5a0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
c5b0: 73 65 63 6f 6e 64 73 20 74 6f 20 77 61 69 74 20  seconds to wait 
c5c0: 62 65 66 6f 72 65 0a 2a 2a 20 66 61 69 6c 69 6e  before.** failin
c5d0: 67 20 74 68 65 20 6c 6f 63 6b 2e 20 20 54 68 65  g the lock.  The
c5e0: 20 69 42 75 73 79 54 69 6d 65 6f 75 74 20 76 61   iBusyTimeout va
c5f0: 6c 75 65 20 69 73 20 61 6c 77 61 79 73 20 72 65  lue is always re
c600: 73 65 74 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 7a  set back to.** z
c610: 65 72 6f 20 6f 6e 20 65 61 63 68 20 63 61 6c 6c  ero on each call
c620: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
c630: 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b 5f 54  E_ENABLE_SETLK_T
c640: 49 4d 45 4f 55 54 20 69 73 20 6e 6f 74 20 64 65  IMEOUT is not de
c650: 66 69 6e 65 64 2c 20 74 68 65 6e 20 64 6f 20 61  fined, then do a
c660: 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
c670: 20 61 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   attempt to set 
c680: 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 23 69 66  the lock..*/.#if
c690: 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
c6a0: 4c 45 5f 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54  LE_SETLK_TIMEOUT
c6b0: 0a 23 20 64 65 66 69 6e 65 20 6f 73 53 65 74 50  .# define osSetP
c6c0: 6f 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b  osixAdvisoryLock
c6d0: 28 68 2c 78 2c 74 29 20 6f 73 46 63 6e 74 6c 28  (h,x,t) osFcntl(
c6e0: 68 2c 46 5f 53 45 54 4c 4b 2c 78 29 0a 23 65 6c  h,F_SETLK,x).#el
c6f0: 73 65 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  se.static int os
c700: 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f 72 79  SetPosixAdvisory
c710: 4c 6f 63 6b 28 0a 20 20 69 6e 74 20 68 2c 20 20  Lock(.  int h,  
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c730: 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
c740: 70 74 6f 72 20 6f 6e 20 77 68 69 63 68 20 74 6f  ptor on which to
c750: 20 74 61 6b 65 20 74 68 65 20 6c 6f 63 6b 20 2a   take the lock *
c760: 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  /.  struct flock
c770: 20 2a 70 4c 6f 63 6b 2c 20 20 2f 2a 20 54 68 65   *pLock,  /* The
c780: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
c790: 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  the lock */.  un
c7a0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 20 20  ixFile *pFile   
c7b0: 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
c7c0: 20 68 6f 6c 64 69 6e 67 20 74 69 6d 65 6f 75 74   holding timeout
c7d0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69   value */.){.  i
c7e0: 6e 74 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28  nt rc = osFcntl(
c7f0: 68 2c 46 5f 53 45 54 4c 4b 2c 70 4c 6f 63 6b 29  h,F_SETLK,pLock)
c800: 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3c 30 20  ;.  while( rc<0 
c810: 26 26 20 70 46 69 6c 65 2d 3e 69 42 75 73 79 54  && pFile->iBusyT
c820: 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20 20 20 20  imeout>0 ){.    
c830: 2f 2a 20 4f 6e 20 73 79 73 74 65 6d 73 20 74 68  /* On systems th
c840: 61 74 20 73 75 70 70 6f 72 74 20 73 6f 6d 65 20  at support some 
c850: 6b 69 6e 64 20 6f 66 20 62 6c 6f 63 6b 69 6e 67  kind of blocking
c860: 20 66 69 6c 65 20 6c 6f 63 6b 20 77 69 74 68 20   file lock with 
c870: 61 20 74 69 6d 65 6f 75 74 2c 0a 20 20 20 20 2a  a timeout,.    *
c880: 2a 20 6d 61 6b 65 20 61 70 70 72 6f 70 72 69 61  * make appropria
c890: 74 65 20 63 68 61 6e 67 65 73 20 68 65 72 65 20  te changes here 
c8a0: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 61 74 20 62  to invoke that b
c8b0: 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 20 6c 6f 63  locking file loc
c8c0: 6b 2e 20 20 4f 6e 0a 20 20 20 20 2a 2a 20 67 65  k.  On.    ** ge
c8d0: 6e 65 72 69 63 20 70 6f 73 69 78 2c 20 68 6f 77  neric posix, how
c8e0: 65 76 65 72 2c 20 74 68 65 72 65 20 69 73 20 6e  ever, there is n
c8f0: 6f 20 73 75 63 68 20 41 50 49 2e 20 20 53 6f 20  o such API.  So 
c900: 77 65 20 73 69 6d 70 6c 79 20 74 72 79 20 74 68  we simply try th
c910: 65 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 6f 6e  e.    ** lock on
c920: 63 65 20 65 76 65 72 79 20 6d 69 6c 6c 69 73 65  ce every millise
c930: 63 6f 6e 64 20 75 6e 74 69 6c 20 65 69 74 68 65  cond until eithe
c940: 72 20 74 68 65 20 74 69 6d 65 6f 75 74 20 65 78  r the timeout ex
c950: 70 69 72 65 73 2c 20 6f 72 20 75 6e 74 69 6c 0a  pires, or until.
c960: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
c970: 69 73 20 6f 62 74 61 69 6e 65 64 2e 20 2a 2f 0a  is obtained. */.
c980: 20 20 20 20 75 73 6c 65 65 70 28 31 30 30 30 29      usleep(1000)
c990: 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e  ;.    rc = osFcn
c9a0: 74 6c 28 68 2c 46 5f 53 45 54 4c 4b 2c 70 4c 6f  tl(h,F_SETLK,pLo
c9b0: 63 6b 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  ck);.    pFile->
c9c0: 69 42 75 73 79 54 69 6d 65 6f 75 74 2d 2d 3b 0a  iBusyTimeout--;.
c9d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
c9e0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
c9f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c 4b  ITE_ENABLE_SETLK
ca00: 5f 54 49 4d 45 4f 55 54 20 2a 2f 0a 0a 0a 2f 2a  _TIMEOUT */.../*
ca10: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
ca20: 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b  et a system-lock
ca30: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69   on the file pFi
ca40: 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  le.  The lock is
ca50: 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62   .** described b
ca60: 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  y pLock..**.** I
ca70: 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73 20  f the pFile was 
ca80: 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74  opened read/writ
ca90: 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c  e from unix-excl
caa0: 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20  , then the only 
cab0: 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74  lock.** ever obt
cac0: 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c  ained is an excl
cad0: 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20  usive lock, and 
cae0: 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65  it is obtained e
caf0: 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74  xactly once.** t
cb00: 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e  he first time an
cb10: 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70  y lock is attemp
cb20: 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71  ted.  All subseq
cb30: 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b  uent system lock
cb40: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
cb50: 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e  s become no-ops.
cb60: 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74    Locking operat
cb70: 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65  ions still happe
cb80: 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a  n internally,.**
cb90: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f   in order to coo
cba0: 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20 62  rdinate access b
cbb0: 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65 20  etween separate 
cbc0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
cbd0: 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74  ions.** within t
cbe0: 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74  his process, but
cbf0: 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20   all of that is 
cc00: 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72  handled in memor
cc10: 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65  y and the.** ope
cc20: 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f  rating system do
cc30: 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61  es not participa
cc40: 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  te..**.** This f
cc50: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73  unction is a pas
cc60: 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e  s-through to fcn
cc70: 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70  tl(F_SETLK) if p
cc80: 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a  File is using.**
cc90: 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74   any VFS other t
cca0: 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  han "unix-excl" 
ccb0: 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f  or if pFile is o
ccc0: 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65  pened on "unix-e
ccd0: 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72  xcl".** and is r
cce0: 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20  ead-only..**.** 
ccf0: 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64  Zero is returned
cd00: 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d   if the call com
cd10: 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66 75  pletes successfu
cd20: 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20  lly, or -1 if a 
cd30: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c  call.** to fcntl
cd40: 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69  () fails. In thi
cd50: 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73  s case, errno is
cd60: 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74 65   set appropriate
cd70: 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e  ly (by fcntl()).
cd80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
cd90: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78  nixFileLock(unix
cda0: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72  File *pFile, str
cdb0: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b  uct flock *pLock
cdc0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
cdd0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
cde0: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
cdf0: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
ce00: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
ce10: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
ce20: 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ode!=0 );.  if( 
ce30: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
ce40: 73 20 26 20 28 55 4e 49 58 46 49 4c 45 5f 45 58  s & (UNIXFILE_EX
ce50: 43 4c 7c 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  CL|UNIXFILE_RDON
ce60: 4c 59 29 29 3d 3d 55 4e 49 58 46 49 4c 45 5f 45  LY))==UNIXFILE_E
ce70: 58 43 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  XCL ){.    if( p
ce80: 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
ce90: 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
cea0: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
ceb0: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
cec0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
ced0: 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  0 );.      lock.
cee0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
cef0: 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  SET;.      lock.
cf00: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
cf10: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f  _FIRST;.      lo
cf20: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
cf30: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f  D_SIZE;.      lo
cf40: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
cf50: 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  LCK;.      rc = 
cf60: 6f 73 53 65 74 50 6f 73 69 78 41 64 76 69 73 6f  osSetPosixAdviso
cf70: 72 79 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c  ryLock(pFile->h,
cf80: 20 26 6c 6f 63 6b 2c 20 70 46 69 6c 65 29 3b 0a   &lock, pFile);.
cf90: 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29        if( rc<0 )
cfa0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
cfb0: 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65    pInode->bProce
cfc0: 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20  ssLock = 1;.    
cfd0: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
cfe0: 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
cff0: 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
d000: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
d010: 63 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41 64  c = osSetPosixAd
d020: 76 69 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c 65  visoryLock(pFile
d030: 2d 3e 68 2c 20 70 4c 6f 63 6b 2c 20 70 46 69 6c  ->h, pLock, pFil
d040: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
d050: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
d060: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
d070: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
d080: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
d090: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
d0a0: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
d0b0: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
d0c0: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
d0d0: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
d0e0: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
d0f0: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
d100: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
d110: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
d120: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
d130: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
d140: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
d150: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
d160: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
d170: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
d180: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
d190: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
d1a0: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
d1b0: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
d1c0: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
d1d0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
d1e0: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
d1f0: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
d200: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
d210: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
d220: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
d230: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
d240: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
d250: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
d260: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
d270: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
d280: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
d290: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
d2a0: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
d2b0: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
d2c0: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
d2d0: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
d2e0: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
d2f0: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
d300: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
d310: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
d320: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
d330: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
d340: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
d350: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
d360: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
d370: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
d380: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
d390: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
d3a0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
d3b0: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
d3c0: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
d3d0: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
d3e0: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
d3f0: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
d400: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
d410: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
d420: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
d430: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
d440: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
d450: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
d460: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
d470: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
d480: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
d490: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
d4a0: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
d4b0: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
d4c0: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
d4d0: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
d4e0: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
d4f0: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
d500: 20 57 69 6e 64 6f 77 73 39 35 20 73 79 73 74 65   Windows95 syste
d510: 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c  ms simultaneousl
d520: 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67  y.  ** accessing
d530: 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
d540: 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65  se file, in case
d550: 20 74 68 61 74 20 69 73 20 65 76 65 72 20 72 65   that is ever re
d560: 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  quired..  **.  *
d570: 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65  * Symbols define
d580: 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74  d in os.h indent
d590: 69 66 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67  ify the 'pending
d5a0: 20 62 79 74 65 27 20 61 6e 64 20 74 68 65 20 27   byte' and the '
d5b0: 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79  reserved.  ** by
d5c0: 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65  te', each single
d5d0: 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b   bytes at well k
d5e0: 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e  nown offsets, an
d5f0: 64 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  d the 'shared by
d600: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20  te.  ** range', 
d610: 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62  a range of 510 b
d620: 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b  ytes at a well k
d630: 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a  nown offset..  *
d640: 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e  *.  ** To obtain
d650: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20   a SHARED lock, 
d660: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f  a read-lock is o
d670: 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27  btained on the '
d680: 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74  pending.  ** byt
d690: 65 27 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  e'.  If this is 
d6a0: 73 75 63 63 65 73 73 66 75 6c 2c 20 27 73 68 61  successful, 'sha
d6b0: 72 65 64 20 62 79 74 65 20 72 61 6e 67 65 27 20  red byte range' 
d6c0: 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 0a 20  is read-locked. 
d6d0: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b   ** and the lock
d6e0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
d6f0: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
d700: 20 20 28 4c 65 67 61 63 79 20 6e 6f 74 65 3a 20    (Legacy note: 
d710: 20 57 68 65 6e 0a 20 20 2a 2a 20 53 51 4c 69 74   When.  ** SQLit
d720: 65 20 77 61 73 20 66 69 72 73 74 20 64 65 76 65  e was first deve
d730: 6c 6f 70 65 64 2c 20 57 69 6e 64 6f 77 73 39 35  loped, Windows95
d740: 20 73 79 73 74 65 6d 73 20 77 65 72 65 20 73 74   systems were st
d750: 69 6c 6c 20 76 65 72 79 20 63 6f 6d 6d 6f 6e 2c  ill very common,
d760: 0a 20 20 2a 2a 20 61 6e 64 20 57 69 64 6e 6f 77  .  ** and Widnow
d770: 73 39 35 20 6c 61 63 6b 73 20 61 20 73 68 61 72  s95 lacks a shar
d780: 65 64 2d 6c 6f 63 6b 20 63 61 70 61 62 69 6c 69  ed-lock capabili
d790: 74 79 2e 20 20 53 6f 20 6f 6e 20 57 69 6e 64 6f  ty.  So on Windo
d7a0: 77 73 39 35 2c 20 61 0a 20 20 2a 2a 20 73 69 6e  ws95, a.  ** sin
d7b0: 67 6c 65 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  gle randomly sel
d7c0: 65 63 74 65 64 20 62 79 20 66 72 6f 6d 20 74 68  ected by from th
d7d0: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 20 72  e 'shared byte r
d7e0: 61 6e 67 65 27 20 69 73 20 6c 6f 63 6b 65 64 2e  ange' is locked.
d7f0: 0a 20 20 2a 2a 20 57 69 6e 64 6f 77 73 39 35 20  .  ** Windows95 
d800: 69 73 20 6e 6f 77 20 70 72 65 74 74 79 20 6d 75  is now pretty mu
d810: 63 68 20 65 78 74 69 6e 63 74 2c 20 62 75 74 20  ch extinct, but 
d820: 74 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  this work-around
d830: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6c 61   for the.  ** la
d840: 63 6b 20 6f 66 20 73 68 61 72 65 64 2d 6c 6f 63  ck of shared-loc
d850: 6b 73 20 6f 6e 20 57 69 6e 64 6f 77 73 39 35 20  ks on Windows95 
d860: 6c 69 76 65 73 20 6f 6e 2c 20 66 6f 72 20 62 61  lives on, for ba
d870: 63 6b 77 61 72 64 73 0a 20 20 2a 2a 20 63 6f 6d  ckwards.  ** com
d880: 70 61 74 69 62 69 6c 69 74 79 2e 29 0a 20 20 2a  patibility.).  *
d890: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
d8a0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
d8b0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
d8c0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
d8d0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
d8e0: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
d8f0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
d900: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
d910: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
d920: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
d930: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
d940: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
d950: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
d960: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
d970: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
d980: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
d990: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
d9a0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
d9b0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
d9c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
d9d0: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
d9e0: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
d9f0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
da00: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
da10: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
da20: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
da30: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
da40: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
da50: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
da60: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
da70: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
da80: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
da90: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
daa0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
dab0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
dac0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
dad0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
dae0: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
daf0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
db00: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
db10: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
db20: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
db30: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
db40: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
db50: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
db60: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
db70: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
db80: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
db90: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
dba0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
dbb0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
dbc0: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
dbd0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
dbe0: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
dbf0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
dc00: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
dc10: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
dc20: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
dc30: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
dc40: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
dc50: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
dc60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
dc70: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
dc80: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
dc90: 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
dca0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74  ck lock;.  int t
dcb0: 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  Errno = 0;..  as
dcc0: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
dcd0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
dce0: 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
dcf0: 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %s,%d) pid=%d (u
dd00: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
dd10: 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  h,.      azFileL
dd20: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
dd30: 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
dd40: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
dd50: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
dd60: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
dd70: 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d  ileLock), pFile-
dd80: 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
dd90: 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69 64  ,.      osGetpid
dda0: 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  (0)));..  /* If 
ddb0: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
ddc0: 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20   a lock of this 
ddd0: 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65 73  type or more res
dde0: 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65 0a  trictive on the.
ddf0: 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64    ** unixFile, d
de00: 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74  o nothing. Don't
de10: 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f 63   use the end_loc
de20: 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
de30: 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
de40: 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
de50: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
de60: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
de70: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
de80: 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
de90: 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
dea0: 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
deb0: 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e 22   held) (unix)\n"
dec0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
ded0: 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f          azFileLo
dee0: 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b  ck(eFileLock)));
def0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
df00: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TE_OK;.  }..  /*
df10: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c   Make sure the l
df20: 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20  ocking sequence 
df30: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2a  is correct..  **
df40: 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d    (1) We never m
df50: 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65  ove from unlocke
df60: 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69  d to anything hi
df70: 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65 64  gher than shared
df80: 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29   lock..  **  (2)
df90: 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78   SQLite never ex
dfa0: 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73 74  plicitly request
dfb0: 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e  s a pendig lock.
dfc0: 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61  .  **  (3) A sha
dfd0: 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61  red lock is alwa
dfe0: 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72  ys held when a r
dff0: 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72  eserve lock is r
e000: 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
e010: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
e020: 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f  eFileLock!=NO_LO
e030: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
e040: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
e050: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e060: 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock!=PENDING_LOC
e070: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
e080: 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56  FileLock!=RESERV
e090: 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65  ED_LOCK || pFile
e0a0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
e0b0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f  RED_LOCK );..  /
e0c0: 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
e0d0: 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
e0e0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
e0f0: 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
e100: 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
e110: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
e120: 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
e130: 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
e140: 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
e150: 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
e160: 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
e170: 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
e180: 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
e190: 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
e1a0: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
e1b0: 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
e1c0: 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
e1d0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
e1e0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
e1f0: 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49 6e   .          (pIn
e200: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ode->eFileLock>=
e210: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20  PENDING_LOCK || 
e220: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
e230: 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20 20  _LOCK)).  ){.   
e240: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
e250: 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  Y;.    goto end_
e260: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
e270: 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
e280: 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
e290: 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
e2a0: 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
e2b0: 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
e2c0: 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
e2d0: 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
e2e0: 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
e2f0: 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
e300: 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
e310: 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
e320: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
e330: 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
e340: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
e350: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
e360: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
e370: 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
e380: 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
e390: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
e3a0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e3b0: 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
e3c0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
e3d0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e3e0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
e3f0: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
e400: 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
e410: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
e420: 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
e430: 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
e440: 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  +;.    goto end_
e450: 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a  lock;.  }...  /*
e460: 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
e470: 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72 65  is needed before
e480: 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48 41   acquiring a SHA
e490: 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65 66  RED lock and bef
e4a0: 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72 69  ore.  ** acquiri
e4b0: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  ng an EXCLUSIVE 
e4c0: 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20 53  lock.  For the S
e4d0: 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20  HARED lock, the 
e4e0: 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20 2a  PENDING will.  *
e4f0: 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a 20  * be released.. 
e500: 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e   */.  lock.l_len
e510: 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f   = 1L;.  lock.l_
e520: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e530: 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f  T;.  if( eFileLo
e540: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
e550: 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c 65  .      || (eFile
e560: 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
e570: 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
e580: 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47  FileLock<PENDING
e590: 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20  _LOCK).  ){.    
e5a0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28 65  lock.l_type = (e
e5b0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
e5c0: 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f  _LOCK?F_RDLCK:F_
e5d0: 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b  WRLCK);.    lock
e5e0: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
e5f0: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66 28  NG_BYTE;.    if(
e600: 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
e610: 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20  ile, &lock) ){. 
e620: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
e630: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e640: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e650: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e660: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
e670: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
e680: 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
e690: 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
e6a0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e6b0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
e6c0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
e6d0: 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
e6e0: 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72  ...  /* If contr
e6f0: 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
e700: 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
e710: 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
e720: 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
e730: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
e740: 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
e750: 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
e760: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
e770: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
e780: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
e790: 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
e7a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
e7b0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e7c0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
e7d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
e7e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67  );..    /* Now g
e7f0: 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  et the read-lock
e800: 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73   */.    lock.l_s
e810: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
e820: 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  RST;.    lock.l_
e830: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
e840: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
e850: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
e860: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
e870: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e880: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e890: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
e8a0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
e8b0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
e8c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
e8d0: 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
e8e0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
e8f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
e900: 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
e910: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
e920: 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
e930: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
e940: 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
e950: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
e960: 6f 63 6b 29 20 26 26 20 72 63 3d 3d 53 51 4c 49  ock) && rc==SQLI
e970: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
e980: 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70  * This could hap
e990: 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f  pen with a netwo
e9a0: 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  rk mount */.    
e9b0: 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
e9c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
e9d0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
e9e0: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
e9f0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
ea00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
ea10: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  Y ){.        sto
ea20: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
ea30: 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
ea40: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
ea50: 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  nd_lock;.    }el
ea60: 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
ea70: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
ea80: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
ea90: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
eaa0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
eab0: 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
eac0: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
ead0: 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
eae0: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
eaf0: 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
eb00: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
eb10: 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
eb20: 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
eb30: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
eb40: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
eb50: 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
eb60: 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
eb70: 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
eb80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
eb90: 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
eba0: 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
ebb0: 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
ebc0: 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
ebd0: 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
ebe0: 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
ebf0: 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
ec00: 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
ec10: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
ec20: 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
ec30: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
ec40: 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
ec50: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
ec60: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
ec70: 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  K;..    assert( 
ec80: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
ec90: 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  VED_LOCK || eFil
eca0: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
ecb0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28  _LOCK );.    if(
ecc0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
ecd0: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
ece0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ecf0: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
ed00: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
ed10: 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73  n = 1L;.    }els
ed20: 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  e{.      lock.l_
ed30: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
ed40: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
ed50: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
ed60: 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  SIZE;.    }..   
ed70: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
ed80: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
ed90: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
eda0: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
edb0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
edc0: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
edd0: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ede0: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
edf0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
ee00: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
ee10: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ee20: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
ee30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ee40: 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54    ..#ifdef SQLIT
ee50: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53 65 74  E_DEBUG.  /* Set
ee60: 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74   up the transact
ee70: 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion-counter chan
ee80: 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c 61 67  ge checking flag
ee90: 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e  s when.  ** tran
eea0: 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61  sitioning from a
eeb0: 20 53 48 41 52 45 44 20 74 6f 20 61 20 52 45 53   SHARED to a RES
eec0: 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65  ERVED lock.  The
eed0: 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f   change.  ** fro
eee0: 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45 53 45  m SHARED to RESE
eef0: 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65 20 62  RVED marks the b
ef00: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f  eginning of a no
ef10: 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20  rmal.  ** write 
ef20: 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61  operation (not a
ef30: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot journal rol
ef40: 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69  lback)..  */.  i
ef50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
ef60: 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  .   && pFile->eF
ef70: 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
ef80: 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69 6c 65  LOCK.   && eFile
ef90: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
efa0: 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70 46 69  OCK.  ){.    pFi
efb0: 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
efc0: 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65  g = 0;.    pFile
efd0: 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30 3b 0a  ->dbUpdate = 0;.
efe0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72      pFile->inNor
eff0: 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a 20 20  malWrite = 1;.  
f000: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28  }.#endif...  if(
f010: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f020: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
f030: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
f040: 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
f050: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
f060: 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
f070: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
f080: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
f090: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
f0a0: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
f0b0: 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
f0c0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
f0d0: 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a  DING_LOCK;.  }..
f0e0: 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78  end_lock:.  unix
f0f0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
f100: 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
f110: 20 20 25 64 20 25 73 20 25 73 20 28 75 6e 69 78    %d %s %s (unix
f120: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
f130: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
f140: 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 72 63  Lock), .      rc
f150: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
f160: 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
f170: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
f180: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65 20 66  ./*.** Add the f
f190: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 75  ile descriptor u
f1a0: 73 65 64 20 62 79 20 66 69 6c 65 20 68 61 6e 64  sed by file hand
f1b0: 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68 65 20  le pFile to the 
f1c0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
f1d0: 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a   pUnused list..*
f1e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
f1f0: 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69 78 46  tPendingFd(unixF
f200: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75  ile *pFile){.  u
f210: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
f220: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
f230: 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73  node;.  UnixUnus
f240: 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d  edFd *p = pFile-
f250: 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
f260: 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74  used;.  p->pNext
f270: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73   = pInode->pUnus
f280: 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55  ed;.  pInode->pU
f290: 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69  nused = p;.  pFi
f2a0: 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46  le->h = -1;.  pF
f2b0: 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
f2c0: 65 64 55 6e 75 73 65 64 20 3d 20 30 3b 0a 20 20  edUnused = 0;.  
f2d0: 6e 55 6e 75 73 65 64 46 64 2b 2b 3b 0a 7d 0a 0a  nUnusedFd++;.}..
f2e0: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
f2f0: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
f300: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f310: 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
f320: 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
f330: 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
f340: 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
f350: 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
f360: 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
f370: 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
f380: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
f390: 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
f3a0: 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
f3b0: 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
f3c0: 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
f3d0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a  is a no-op..** .
f3e0: 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55  ** If handleNFSU
f3f0: 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74  nlock is true, t
f400: 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69  hen on downgradi
f410: 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f  ng an EXCLUSIVE_
f420: 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a  LOCK to SHARED.*
f430: 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65  * the byte range
f440: 20 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f   is divided into
f450: 20 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65   2 parts and the
f460: 20 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75   first part is u
f470: 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20  nlocked then.** 
f480: 73 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f  set to a read lo
f490: 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68  ck, then the oth
f4a0: 65 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c  er part is simpl
f4b0: 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69  y unlocked.  Thi
f4c0: 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75  s works .** arou
f4d0: 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20  nd a bug in BSD 
f4e0: 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20  NFS lockd (also 
f4f0: 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31  seen on MacOSX 1
f500: 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73  0.3+) that fails
f510: 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74   to .** remove t
f520: 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
f530: 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61   a region when a
f540: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65   read lock is se
f550: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f560: 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c   posixUnlock(sql
f570: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
f580: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e  nt eFileLock, in
f590: 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  t handleNFSUnloc
f5a0: 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  k){.  unixFile *
f5b0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
f5c0: 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
f5d0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
f5e0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
f5f0: 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ock;.  int rc = 
f600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
f610: 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
f620: 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
f630: 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
f640: 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75  %d,%d) pid=%d (u
f650: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
f660: 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
f670: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
f680: 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
f690: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ode->eFileLock, 
f6a0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
f6b0: 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73  Shared,.      os
f6c0: 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
f6d0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
f6e0: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
f6f0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
f700: 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
f710: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
f720: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
f730: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
f740: 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
f750: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
f760: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
f770: 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
f780: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
f790: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
f7a0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
f7b0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
f7c0: 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
f7d0: 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20  Lock );..#ifdef 
f7e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
f7f0: 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
f800: 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
f810: 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
f820: 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
f830: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
f840: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
f850: 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
f860: 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
f870: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
f880: 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
f890: 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
f8a0: 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
f8b0: 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
f8c0: 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
f8d0: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
f8e0: 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
f8f0: 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
f900: 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
f910: 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
f920: 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
f930: 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
f940: 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
f950: 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
f960: 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
f970: 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
f980: 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
f990: 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
f9a0: 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
f9b0: 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
f9c0: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f  .    pFile->inNo
f9d0: 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23  rmalWrite = 0;.#
f9e0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f  endif..    /* do
f9f0: 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61 20 73  wngrading to a s
fa00: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46  hared lock on NF
fa10: 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72  S involves clear
fa20: 69 6e 67 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ing the write lo
fa30: 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ck.    ** before
fa40: 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20 74 68   establishing th
fa50: 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20  e readlock - to 
fa60: 61 76 6f 69 64 20 61 20 72 61 63 65 20 63 6f 6e  avoid a race con
fa70: 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72  dition we downgr
fa80: 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  ade.    ** the l
fa90: 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c  ock in 2 blocks,
faa0: 20 73 6f 20 74 68 61 74 20 70 61 72 74 20 6f 66   so that part of
fab0: 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c 6c 20   the range will 
fac0: 62 65 20 63 6f 76 65 72 65 64 20 62 79 20 61 20  be covered by a 
fad0: 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f  .    ** write lo
fae0: 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72 65 73  ck until the res
faf0: 74 20 69 73 20 63 6f 76 65 72 65 64 20 62 79 20  t is covered by 
fb00: 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20  a read lock:.   
fb10: 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57 57 57   **  1:   [WWWWW
fb20: 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b  ].    **  2:   [
fb30: 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33  ....W].    **  3
fb40: 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20 20 20  :   [RRRRW].    
fb50: 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d  **  4:   [RRRR.]
fb60: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
fb70: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
fb80: 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64  D_LOCK ){.#if !d
fb90: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
fba0: 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41  ) || !SQLITE_ENA
fbb0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
fbc0: 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29 68 61  E.      (void)ha
fbd0: 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20  ndleNFSUnlock;. 
fbe0: 20 20 20 20 20 61 73 73 65 72 74 28 20 68 61 6e       assert( han
fbf0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20  dleNFSUnlock==0 
fc00: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  );.#endif.#if de
fc10: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
fc20: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
fc30: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
fc40: 20 20 20 20 20 20 69 66 28 20 68 61 6e 64 6c 65        if( handle
fc50: 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20  NFSUnlock ){.   
fc60: 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b       int tErrno;
fc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fc80: 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  * Error code fro
fc90: 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72  m system call er
fca0: 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  rors */.        
fcb0: 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20 3d 20  off_t divSize = 
fcc0: 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b  SHARED_SIZE - 1;
fcd0: 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
fce0: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
fcf0: 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_UNLCK;.       
fd00: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
fd10: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
fd20: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
fd30: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
fd40: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
fd50: 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
fd60: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
fd70: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
fd80: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
fd90: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
fda0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
fdb0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
fdc0: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
fdd0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
fde0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
fdf0: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  no);.          g
fe00: 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
fe10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fe20: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
fe30: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
fe40: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
fe50: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
fe60: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
fe70: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
fe80: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
fe90: 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20  en = divSize;.  
fea0: 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
feb0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
fec0: 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)==(-1) ){.  
fed0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
fee0: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
fef0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
ff00: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
ff10: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
ff20: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20  IOERR_RDLOCK);. 
ff30: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
ff40: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
ff50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
ff60: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
ff70: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
ff80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ff90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
ffa0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
ffb0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
ffc0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
ffd0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
ffe0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
fff0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
10000 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
10010 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20  ST+divSize;.    
10020 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
10030 20 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76   SHARED_SIZE-div
10040 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66  Size;.        if
10050 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
10060 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  File, &lock)==(-
10070 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
10080 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10090 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
100a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
100b0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
100c0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
100d0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
100e0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
100f0 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
10100 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
10110 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
10120 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
10130 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
10140 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
10150 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
10160 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
10170 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
10180 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
10190 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
101a0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
101b0 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
101c0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
101d0 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
101e0 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
101f0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
10200 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ck) ){.         
10210 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
10220 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  he call to unixF
10230 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74  ileLock() cannot
10240 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e   fail because an
10250 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  other.          
10260 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  ** process is ho
10270 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61  lding an incompa
10280 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69  tible lock. If i
10290 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20  t does, this .  
102a0 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63          ** indic
102b0 61 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74  ates that the ot
102c0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
102d0 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ot following the
102e0 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20   locking.       
102f0 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20     ** protocol. 
10300 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
10310 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
10320 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74  OERR_RDLOCK. Ret
10330 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  urning.         
10340 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   ** SQLITE_BUSY 
10350 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68  would confuse th
10360 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69  e upper layer (i
10370 6e 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61  n practice it ca
10380 75 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20  uses .          
10390 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20  ** an assert to 
103a0 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20  fail). */ .     
103b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
103c0 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20  _IOERR_RDLOCK;. 
103d0 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
103e0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
103f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
10400 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
10410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10420 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
10430 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
10440 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
10450 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
10460 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
10470 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
10480 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
10490 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
104a0 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
104b0 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
104c0 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  );.    if( unixF
104d0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
104e0 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
104f0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
10500 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10510 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
10520 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10530 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
10540 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
10550 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
10560 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
10570 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20  _unlock;.    }. 
10580 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f   }.  if( eFileLo
10590 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20  ck==NO_LOCK ){. 
105a0 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20     /* Decrement 
105b0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
105c0 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73  counter.  Releas
105d0 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67  e the lock using
105e0 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61   an.    ** OS ca
105f0 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c  ll only when all
10600 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73   threads in this
10610 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61   same process ha
10620 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  ve released.    
10630 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20  ** the lock..   
10640 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   */.    pInode->
10650 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69  nShared--;.    i
10660 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  f( pInode->nShar
10670 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ed==0 ){.      l
10680 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
10690 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  NLCK;.      lock
106a0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
106b0 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
106c0 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
106d0 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
106e0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
106f0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
10700 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
10710 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
10720 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
10730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
10750 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
10760 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10770 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
10780 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
10790 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
107a0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
107b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
107c0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
107d0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
107e0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f  Decrement the co
107f0 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61  unt of locks aga
10800 69 6e 73 74 20 74 68 69 73 20 73 61 6d 65 20 66  inst this same f
10810 69 6c 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20  ile.  When the. 
10820 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63     ** count reac
10830 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20  hes zero, close 
10840 61 6e 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64  any other file d
10850 65 73 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65  escriptors whose
10860 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61   close.    ** wa
10870 73 20 64 65 66 65 72 72 65 64 20 62 65 63 61 75  s deferred becau
10880 73 65 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  se of outstandin
10890 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a  g locks..    */.
108a0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
108b0 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
108c0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
108d0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  0 );.    if( pIn
108e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
108f0 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64  .      closePend
10900 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20  ingFds(pFile);. 
10910 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e     }.  }..end_un
10920 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
10930 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
10940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
10950 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10960 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
10970 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10980 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
10990 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
109a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
109b0 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
109c0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
109d0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
109e0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
109f0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
10a00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
10a10 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
10a20 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
10a30 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
10a40 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
10a50 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
10a60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
10a70 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
10a80 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f  tic int unixUnlo
10a90 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
10aa0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
10ab0 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ck){.#if SQLITE_
10ac0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
10ad0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10ae0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
10af0 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a   || ((unixFile *
10b00 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d  )id)->nFetchOut=
10b10 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  =0 );.#endif.  r
10b20 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63  eturn posixUnloc
10b30 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  k(id, eFileLock,
10b40 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49   0);.}..#if SQLI
10b50 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
10b60 3e 30 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  >0.static int un
10b70 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69  ixMapfile(unixFi
10b80 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79  le *pFd, i64 nBy
10b90 74 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  te);.static void
10ba0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
10bb0 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23  nixFile *pFd);.#
10bc0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
10bd0 73 20 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f  s function perfo
10be0 72 6d 73 20 74 68 65 20 70 61 72 74 73 20 6f 66  rms the parts of
10bf0 20 74 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65   the "close file
10c00 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20  " operation .** 
10c10 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f  common to all lo
10c20 63 6b 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49  cking schemes. I
10c30 74 20 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72  t closes the dir
10c40 65 63 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a  ectory and file.
10c50 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74  ** handles, if t
10c60 68 65 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61  hey are valid, a
10c70 6e 64 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c  nd sets all fiel
10c80 64 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ds of the unixFi
10c90 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  le.** structure 
10ca0 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69  to 0..**.** It i
10cb0 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72  s *not* necessar
10cc0 79 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75  y to hold the mu
10cd0 74 65 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f  tex when this ro
10ce0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
10cf0 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f  .** even on VxWo
10d00 72 6b 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69  rks.  A mutex wi
10d10 6c 6c 20 62 65 20 61 63 71 75 69 72 65 64 20 6f  ll be acquired o
10d20 6e 20 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65  n VxWorks by the
10d30 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  .** vxworksRelea
10d40 73 65 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69  seFileId() routi
10d50 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ne..*/.static in
10d60 74 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  t closeUnixFile(
10d70 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
10d80 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
10d90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
10da0 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45  *)id;.#if SQLITE
10db0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
10dc0 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  .  unixUnmapfile
10dd0 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  (pFile);.#endif.
10de0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d    if( pFile->h>=
10df0 30 20 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f  0 ){.    robust_
10e00 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69  close(pFile, pFi
10e10 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  le->h, __LINE__)
10e20 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d  ;.    pFile->h =
10e30 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f   -1;.  }.#if OS_
10e40 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46  VXWORKS.  if( pF
10e50 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20  ile->pId ){.    
10e60 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
10e70 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
10e80 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20  DELETE ){.      
10e90 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
10ea0 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
10eb0 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
10ec0 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69  vxworksReleaseFi
10ed0 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29  leId(pFile->pId)
10ee0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64  ;.    pFile->pId
10ef0 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66   = 0;.  }.#endif
10f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
10f10 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53  NLINK_AFTER_CLOS
10f20 45 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  E.  if( pFile->c
10f30 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
10f40 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20  ILE_DELETE ){.  
10f50 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65    osUnlink(pFile
10f60 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71  ->zPath);.    sq
10f70 6c 69 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61  lite3_free(*(cha
10f80 72 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74  r**)&pFile->zPat
10f90 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a  h);.    pFile->z
10fa0 50 61 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65  Path = 0;.  }.#e
10fb0 6e 64 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28  ndif.  OSTRACE((
10fc0 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
10fd0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
10fe0 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
10ff0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
11000 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
11010 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20 20 6d  atedUnused);.  m
11020 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20  emset(pFile, 0, 
11030 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
11040 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11050 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11060 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
11070 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
11080 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
11090 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72  le *id){.  int r
110a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
110b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
110c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
110d0 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c  d;.  verifyDbFil
110e0 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78  e(pFile);.  unix
110f0 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
11100 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  CK);.  unixEnter
11110 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75  Mutex();..  /* u
11120 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69  nixFile.pInode i
11130 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68  s always valid h
11140 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ere. Otherwise, 
11150 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73  a different clos
11160 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28  e.  ** routine (
11170 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  e.g. nolockClose
11180 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c  ()) would be cal
11190 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a  led instead..  *
111a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
111b0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
111c0 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e  >0 || pFile->pIn
111d0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
111e0 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c  k==0 );.  if( AL
111f0 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  WAYS(pFile->pIno
11200 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  de) && pFile->pI
11210 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
11220 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
11230 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
11240 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
11250 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
11260 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
11270 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
11280 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
11290 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
112a0 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
112b0 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
112c0 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70  tor to pInode->p
112d0 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74  Unused list.  It
112e0 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
112f0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20  ically closed . 
11300 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c     ** when the l
11310 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
11320 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
11330 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
11340 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
11350 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
11360 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
11370 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
11380 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
11390 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
113a0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
113b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  * End of the pos
113c0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
113d0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
113e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
113f0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
11400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11440 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
11450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11490 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
114a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114b0 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20  * No-op Locking 
114c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
114e0 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20  **.**.** Of the 
114f0 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20  various locking 
11500 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
11510 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20  available, this 
11520 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a  is by far the.**
11530 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b   simplest:  lock
11540 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ing is ignored. 
11550 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   No attempt is m
11560 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20  ade to lock the 
11570 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
11580 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
11590 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  writing..**.** T
115a0 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  his locking mode
115b0 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 20   is appropriate 
115c0 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d  for use on read-
115d0 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a  only databases.*
115e0 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65 73  * (ex: databases
115f0 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65 64   that are burned
11600 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f   into CD-ROM, fo
11610 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20  r example.)  It 
11620 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75  can.** also be u
11630 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c 69  sed if the appli
11640 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73  cation employs s
11650 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63  ome external mec
11660 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65  hanism to.** pre
11670 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75  vent simultaneou
11680 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65 20  s access of the 
11690 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62 79  same database by
116a0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20   two or more.** 
116b0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
116c0 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65  ions.  But there
116d0 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72 69   is a serious ri
116e0 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a  sk of database.*
116f0 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20  * corruption if 
11700 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  this locking mod
11710 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69 74  e is used in sit
11720 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75  uations where mu
11730 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61  ltiple.** databa
11740 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
11750 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  re accessing the
11760 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
11770 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a  ile at the same.
11780 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20  ** time and one 
11790 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65  or more of those
117a0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
117b0 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74   writing..*/..st
117c0 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43  atic int nolockC
117d0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
117e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
117f0 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65  otUsed, int *pRe
11800 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sOut){.  UNUSED_
11810 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
11820 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  d);.  *pResOut =
11830 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
11840 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63  ITE_OK;.}.static
11850 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28   int nolockLock(
11860 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
11870 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73  tUsed, int NotUs
11880 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2){.  UNUSED_P
11890 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65  ARAMETER2(NotUse
118a0 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20  d, NotUsed2);.  
118b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
118c0 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  ;.}.static int n
118d0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  olockUnlock(sqli
118e0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
118f0 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
11900 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
11910 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
11920 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
11930 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11940 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
11950 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
11960 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65   int nolockClose
11970 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11980 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63 6c  d) {.  return cl
11990 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
119a0 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
119b0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
119c0 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69  the no-op lock i
119d0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
119e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
119f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
11a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a40 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
11a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11a90 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
11aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
11ab0 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f  egin dot-file Lo
11ac0 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
11ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ae0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ****.**.** The d
11af0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  otfile locking i
11b00 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73  mplementation us
11b10 65 73 20 74 68 65 20 65 78 69 73 74 65 6e 63 65  es the existence
11b20 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63   of separate loc
11b30 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c  k.** files (real
11b40 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29 20  ly a directory) 
11b50 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73  to control acces
11b60 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
11b70 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a  e.  This works.*
11b80 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20  * on just about 
11b90 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d  every filesystem
11ba0 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75   imaginable.  Bu
11bb0 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69  t there are seri
11bc0 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a  ous downsides:.*
11bd0 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65  *.**    (1)  The
11be0 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75  re is zero concu
11bf0 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c  rrency.  A singl
11c00 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20  e reader blocks 
11c10 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20  all other.**    
11c20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73       connections
11c30 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72   from reading or
11c40 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
11c50 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
11c60 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74  (2)  An applicat
11c70 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77  ion crash or pow
11c80 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76  er loss can leav
11c90 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c  e stale lock fil
11ca0 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69  es.**         si
11cb0 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61  tting around tha
11cc0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65  t need to be cle
11cd0 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a  ared manually..*
11ce0 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73  *.** Nevertheles
11cf0 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20  s, a dotlock is 
11d00 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c  an appropriate l
11d10 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20  ocking mode for 
11d20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68  use if no.** oth
11d30 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  er locking strat
11d40 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65  egy is available
11d50 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20  ..**.** Dotfile 
11d60 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79  locking works by
11d70 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62 64   creating a subd
11d80 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20  irectory in the 
11d90 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
11da0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
11db0 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73  e and with the s
11dc0 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74  ame name but wit
11dd0 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65  h a ".lock" exte
11de0 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20  nsion added..** 
11df0 54 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66  The existence of
11e00 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72   a lock director
11e10 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43  y implies an EXC
11e20 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c  LUSIVE lock.  Al
11e30 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20  l other.** lock 
11e40 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52  types (SHARED, R
11e50 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47  ESERVED, PENDING
11e60 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74  ) are mapped int
11e70 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a  o EXCLUSIVE..*/.
11e80 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  ./*.** The file 
11e90 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20  suffix added to 
11ea0 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69  the data base fi
11eb0 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20  lename in order 
11ec0 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a  to create the.**
11ed0 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e   lock directory.
11ee0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c  .*/.#define DOTL
11ef0 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63  OCK_SUFFIX ".loc
11f00 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  k"../*.** This r
11f10 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
11f20 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
11f30 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
11f40 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
11f50 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
11f60 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
11f70 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
11f80 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65  lock is held, se
11f90 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f  t *pResOut.** to
11fa0 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
11fb0 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65  e otherwise *pRe
11fc0 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a  sOut is set to z
11fd0 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ero.  The return
11fe0 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
11ff0 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e   to SQLITE_OK un
12000 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f  less an I/O erro
12010 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
12020 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a  lock checking..*
12030 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20  *.** In dotfile 
12040 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20  locking, either 
12050 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72  a lock exists or
12060 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53   it does not.  S
12070 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72  o in this.** var
12080 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52  iation of CheckR
12090 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a  eservedLock(), *
120a0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
120b0 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f  o true if any lo
120c0 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e  ck.** is held on
120d0 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61   the file and fa
120e0 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20  lse if the file 
120f0 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a  is unlocked..*/.
12100 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
12110 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
12120 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
12130 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
12140 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
12150 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
12160 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
12170 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
12180 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
12190 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
121a0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
121b0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
121c0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
121d0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
121e0 69 6c 65 20 29 3b 0a 20 20 72 65 73 65 72 76 65  ile );.  reserve
121f0 64 20 3d 20 6f 73 41 63 63 65 73 73 28 28 63 6f  d = osAccess((co
12200 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d  nst char*)pFile-
12210 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c  >lockingContext,
12220 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43   0)==0;.  OSTRAC
12230 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
12240 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f   %d %d %d (dotlo
12250 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
12260 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
12270 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72  ;.  *pResOut = r
12280 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
12290 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
122a0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
122b0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
122c0 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
122d0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
122e0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
122f0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
12300 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
12310 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
12320 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
12330 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
12340 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
12350 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
12360 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
12370 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
12380 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
12390 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
123a0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
123b0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
123c0 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
123d0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
123e0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
123f0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
12400 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
12410 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
12420 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
12430 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
12440 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
12450 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
12460 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
12470 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
12480 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
12490 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
124a0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
124b0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
124c0 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
124d0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
124e0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
124f0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
12500 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
12510 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
12520 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
12530 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
12540 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
12550 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
12560 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
12570 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
12580 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
12590 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
125a0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
125b0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ng level..**.** 
125c0 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63  With dotfile loc
125d0 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20  king, we really 
125e0 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61  only support sta
125f0 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56  te (4): EXCLUSIV
12600 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61  E..** But we tra
12610 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63  ck the other loc
12620 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65  king levels inte
12630 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rnally..*/.stati
12640 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63  c int dotlockLoc
12650 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
12660 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
12670 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
12680 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12690 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
126a0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
126b0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
126c0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
126d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
126e0 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  ...  /* If we ha
126f0 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ve any lock, the
12700 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20  n the lock file 
12710 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20  already exists. 
12720 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a   All we have.  *
12730 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73  * to do is adjus
12740 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72  t our internal r
12750 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63  ecord of the loc
12760 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20  k level..  */.  
12770 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12780 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29  Lock > NO_LOCK )
12790 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
127a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
127b0 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  ck;.    /* Alway
127c0 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d  s update the tim
127d0 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c  estamp on the ol
127e0 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66  d file */.#ifdef
127f0 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20   HAVE_UTIME.    
12800 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c  utime(zLockFile,
12810 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20   NULL);.#else.  
12820 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69    utimes(zLockFi
12830 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  le, NULL);.#endi
12840 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
12850 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
12860 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
12870 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
12880 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f  rc = osMkdir(zLo
12890 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20  ckFile, 0777);. 
128a0 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20   if( rc<0 ){.   
128b0 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70   /* failed to op
128c0 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f  en/create the lo
128d0 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a  ck directory */.
128e0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
128f0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20   errno;.    if( 
12900 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f  EEXIST == tErrno
12910 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12920 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
12930 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72  } else {.      r
12940 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
12950 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12960 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12970 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
12980 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
12990 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
129a0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
129b0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
129c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
129d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a  return rc;.  } .
129e0 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20    .  /* got it, 
129f0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
12a00 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
12a10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
12a20 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
12a30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12a40 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
12a50 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
12a60 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
12a70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
12a80 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
12a90 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
12aa0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
12ab0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
12ac0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12ad0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
12ae0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
12af0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
12b00 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
12b10 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
12b20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
12b30 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
12b40 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  When the locking
12b50 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e   level reaches N
12b60 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74  O_LOCK, delete t
12b70 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f  he lock file..*/
12b80 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
12b90 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
12ba0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12bb0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
12bc0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
12bd0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
12be0 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c    char *zLockFil
12bf0 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c  e = (char *)pFil
12c00 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
12c10 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
12c20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
12c30 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
12c40 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
12c50 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63  d pid=%d (dotloc
12c60 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
12c70 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
12c80 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
12c90 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69  ileLock, osGetpi
12ca0 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74  d(0)));.  assert
12cb0 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
12cc0 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
12cd0 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
12ce0 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
12cf0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12d00 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
12d10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12d20 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
12d30 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
12d40 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
12d50 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
12d60 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
12d70 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
12d80 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
12d90 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
12da0 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
12db0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
12dc0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
12dd0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12de0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
12df0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12e00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
12e10 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
12e20 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
12e30 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
12e40 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
12e50 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
12e60 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
12e70 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
12e80 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  e);.  if( rc<0 )
12e90 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
12ea0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66   = errno;.    if
12eb0 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  ( tErrno==ENOENT
12ec0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
12ed0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
12ee0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
12ef0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
12f00 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  OCK;.      store
12f10 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12f20 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
12f30 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
12f40 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
12f50 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12f60 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12f70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
12f80 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61  lose a file.  Ma
12f90 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
12fa0 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73   has been releas
12fb0 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e  ed before closin
12fc0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
12fd0 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71   dotlockClose(sq
12fe0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
12ff0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
13000 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
13010 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69  )id;.  assert( i
13020 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63  d!=0 );.  dotloc
13030 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  kUnlock(id, NO_L
13040 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OCK);.  sqlite3_
13050 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
13060 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72  ingContext);.  r
13070 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46  eturn closeUnixF
13080 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a  ile(id);.}./****
13090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
130a0 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69  nd of the dot-fi
130b0 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  le lock implemen
130c0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
130d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
130e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
130f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
13130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13190 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f  ****** Begin flo
131a0 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ck Locking *****
131b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
131d0 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28  * Use the flock(
131e0 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f  ) system call to
131f0 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   do file locking
13200 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20  ..**.** flock() 
13210 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20  locking is like 
13220 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  dot-file locking
13230 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72   in that the var
13240 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61  ious.** fine-gra
13250 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  in locking level
13260 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53  s supported by S
13270 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70  QLite are collap
13280 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69  sed into.** a si
13290 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c  ngle exclusive l
132a0 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ock.  In other w
132b0 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45  ords, SHARED, RE
132c0 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50  SERVED, and.** P
132d0 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65  ENDING locks are
132e0 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20   the same thing 
132f0 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  as an EXCLUSIVE 
13300 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a  lock.  SQLite.**
13310 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65   still works whe
13320 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62  n you do this, b
13330 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69  ut concurrency i
13340 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a  s reduced since.
13350 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  ** only a single
13360 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20   process can be 
13370 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
13380 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a  base at a time..
13390 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20  **.** Omit this 
133a0 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54  section if SQLIT
133b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
133c0 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64  _STYLE is turned
133d0 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49   off.*/.#if SQLI
133e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
133f0 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52  G_STYLE../*.** R
13400 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c  etry flock() cal
13410 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74  ls that fail wit
13420 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65  h EINTR.*/.#ifde
13430 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69  f EINTR.static i
13440 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  nt robust_flock(
13450 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b  int fd, int op){
13460 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b  .  int rc;.  do{
13470 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f   rc = flock(fd,o
13480 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  p); }while( rc<0
13490 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
134a0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
134b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
134c0 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61  e robust_flock(a
134d0 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23  ,b) flock(a,b).#
134e0 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a  endif.     ../*.
134f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13500 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
13510 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
13520 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
13530 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
13540 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
13550 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
13560 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
13570 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
13580 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
13590 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
135a0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
135b0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
135c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
135d0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
135e0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
135f0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
13600 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
13610 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
13620 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b  c int flockCheck
13630 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
13640 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
13650 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
13660 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
13670 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
13680 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
13690 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
136a0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
136b0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
136c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
136d0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
136e0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
136f0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13700 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
13710 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
13720 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
13730 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
13740 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
13750 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
13760 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
13770 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
13780 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
13790 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
137a0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
137b0 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65  . */.  if( !rese
137c0 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61  rved ){.    /* a
137d0 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68  ttempt to get th
137e0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e  e lock */.    in
137f0 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  t lrc = robust_f
13800 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
13810 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
13820 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20  );.    if( !lrc 
13830 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20  ){.      /* got 
13840 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  the lock, unlock
13850 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63   it */.      lrc
13860 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28   = robust_flock(
13870 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
13880 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c  N);.      if ( l
13890 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69  rc ) {.        i
138a0 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
138b0 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e  o;.        /* un
138c0 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68  lock failed with
138d0 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20   an error */.   
138e0 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49 54       lrc = SQLIT
138f0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20  E_IOERR_UNLOCK; 
13900 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
13910 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
13920 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
13930 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
13940 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
13950 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
13960 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
13970 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
13980 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
13990 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74  se might have it
139a0 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20   reserved */.   
139b0 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
139c0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
139d0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
139e0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a  E_IOERR_LOCK); .
139f0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
13a00 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
13a10 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
13a20 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
13a30 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  rrno);.        r
13a40 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
13a50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
13a60 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
13a70 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
13a80 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
13a90 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
13aa0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
13ab0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
13ac0 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
13ad0 20 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20   (rc & 0xff) == 
13ae0 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
13af0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13b00 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
13b10 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
13b20 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
13b30 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13b40 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
13b50 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
13b60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13b70 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
13b80 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
13b90 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
13ba0 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
13bb0 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
13bc0 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
13bd0 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
13be0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
13bf0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
13c00 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
13c10 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
13c20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
13c30 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
13c40 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
13c50 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
13c60 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
13c70 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
13c80 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
13c90 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
13ca0 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
13cb0 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
13cc0 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
13cd0 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
13ce0 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
13cf0 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
13d00 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
13d10 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
13d20 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
13d30 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
13d40 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
13d50 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
13d60 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
13d70 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
13d80 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
13d90 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
13da0 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
13db0 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
13dc0 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
13dd0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
13de0 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
13df0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
13e00 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
13e10 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
13e20 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
13e30 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
13e40 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
13e50 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
13e60 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
13e70 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
13e80 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
13e90 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
13ea0 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
13eb0 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
13ec0 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
13ed0 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
13ee0 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
13ef0 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
13f00 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
13f10 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
13f20 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
13f30 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
13f40 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
13f50 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
13f60 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
13f70 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
13f80 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
13f90 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13fa0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
13fb0 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
13fc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
13fd0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13fe0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
13ff0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
14000 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
14010 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
14020 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
14030 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
14040 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
14050 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
14060 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
14070 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
14080 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
14090 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
140a0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
140b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
140c0 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
140d0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
140e0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
140f0 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f (robust_flock(
14100 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
14110 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
14120 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14130 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
14140 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
14150 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
14160 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
14170 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
14180 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
14190 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
141a0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
141b0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  rc) ){.      sto
141c0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
141d0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
141e0 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
141f0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
14200 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
14210 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46  urn ok */.    pF
14220 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14230 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
14240 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
14250 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c      %d %s %s (fl
14260 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
14270 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
14280 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
14290 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
142a0 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
142b0 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20  iled"));.#ifdef 
142c0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
142d0 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
142e0 20 20 69 66 28 20 28 72 63 20 26 20 30 78 66 66    if( (rc & 0xff
142f0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
14300 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
14310 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23  LITE_BUSY;.  }.#
14320 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
14330 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
14340 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65  K_ERRORS */.  re
14350 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
14360 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
14370 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
14380 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
14390 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
143a0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
143b0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
143c0 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
143d0 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
143e0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
143f0 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
14400 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
14410 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
14420 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
14430 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
14440 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14450 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
14460 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
14470 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14480 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14490 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
144a0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
144b0 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
144c0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
144d0 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
144e0 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
144f0 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e  pid=%d (flock)\n
14500 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
14510 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
14520 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14530 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
14540 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
14550 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
14560 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
14570 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
14580 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
14590 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
145a0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
145b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
145c0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
145d0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
145e0 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
145f0 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
14600 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
14610 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
14620 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
14630 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
14640 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
14650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14660 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
14670 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b  , really, unlock
14680 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75 73  . */.  if( robus
14690 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
146a0 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69  , LOCK_UN) ){.#i
146b0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
146c0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
146d0 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e 20  RORS.    return 
146e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
146f0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
14700 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
14710 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74 75  RORS */.    retu
14720 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
14730 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b  UNLOCK;.  }else{
14740 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14750 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
14760 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14770 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
14780 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
14790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
147a0 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74  flockClose(sqlit
147b0 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20  e3_file *id) {. 
147c0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
147d0 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  ;.  flockUnlock(
147e0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
147f0 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
14800 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65 6e  File(id);.}..#en
14810 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
14820 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
14830 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b  LE && !OS_VXWORK
14840 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */../**********
14850 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14860 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20   the flock lock 
14870 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
14880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14890 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
148a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
148b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
148c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
148d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
148e0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
148f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14930 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
14940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
14950 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70  egin Named Semap
14960 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  hore Locking ***
14970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14980 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65  *****.**.** Name
14990 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
149a0 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70  ing is only supp
149b0 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  orted on VxWorks
149c0 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72  ..**.** Semaphor
149d0 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b  e locking is lik
149e0 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66  e dot-lock and f
149f0 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20  lock in that it 
14a00 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73  really only.** s
14a10 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56  upports EXCLUSIV
14a20 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79  E locking.  Only
14a30 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73   a single proces
14a40 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72  s can read or wr
14a50 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ite.** the datab
14a60 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69  ase file at a ti
14a70 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  me.  This reduce
14a80 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63  s potential conc
14a90 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20  urrency, but.** 
14aa0 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69  makes the lock i
14ab0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75  mplementation mu
14ac0 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69  ch easier..*/.#i
14ad0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a  f OS_VXWORKS../*
14ae0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14af0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
14b00 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
14b10 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
14b20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
14b30 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
14b40 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
14b50 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
14b60 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
14b70 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
14b80 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
14b90 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
14ba0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
14bb0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
14bc0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
14bd0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
14be0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
14bf0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
14c00 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
14c10 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b  ic int semXCheck
14c20 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
14c30 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
14c40 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
14c50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14c60 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
14c70 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
14c80 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
14c90 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
14ca0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
14cb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
14cc0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
14cd0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
14ce0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
14cf0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
14d00 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
14d10 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
14d20 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
14d30 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
14d40 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
14d50 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
14d60 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
14d70 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
14d80 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
14d90 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
14da0 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
14db0 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a  d ){.    sem_t *
14dc0 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
14dd0 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20  node->pSem;..   
14de0 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
14df0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
14e00 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
14e10 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
14e20 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72  ( EAGAIN != tErr
14e30 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  no ){.        rc
14e40 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
14e50 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
14e60 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
14e70 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14e80 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74  OCK);.        st
14e90 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
14ea0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
14eb0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
14ec0 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
14ed0 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b  lse has the lock
14ee0 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20   when we are in 
14ef0 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20  NO_LOCK */.     
14f00 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70     reserved = (p
14f10 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
14f20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  < SHARED_LOCK);.
14f30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14f40 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63  e{.      /* we c
14f50 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20  ould have it if 
14f60 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20  we want it */.  
14f70 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65      sem_post(pSe
14f80 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  m);.    }.  }.  
14f90 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14fa0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14fb0 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14fc0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
14fd0 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
14fe0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
14ff0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15000 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
15010 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
15020 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
15030 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
15040 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
15050 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
15060 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
15070 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
15080 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
15090 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
150a0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
150b0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
150c0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
150d0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
150e0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
150f0 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
15100 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
15110 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
15120 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
15130 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
15140 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
15150 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
15160 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
15170 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
15180 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
15190 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
151a0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
151b0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
151c0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
151d0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
151e0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
151f0 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
15200 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
15210 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
15220 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
15230 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
15240 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
15250 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
15260 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
15270 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
15280 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
15290 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
152a0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
152b0 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c  *.** Semaphore l
152c0 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ocks only really
152d0 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
152e0 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
152f0 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
15300 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
15310 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
15320 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
15330 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
15340 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
15350 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
15360 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
15370 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
15380 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
15390 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
153a0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
153b0 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
153c0 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
153d0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
153e0 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
153f0 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
15400 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
15410 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15420 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33  semXLock(sqlite3
15430 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
15440 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
15450 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15460 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15470 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
15480 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
15490 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
154a0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
154b0 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
154c0 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
154d0 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
154e0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
154f0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
15500 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
15510 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
15520 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
15530 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
15540 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
15550 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
15560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
15570 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
15580 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
15590 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
155a0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
155b0 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
155c0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
155d0 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
155e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
155f0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
15600 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
15610 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
15620 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
15630 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
15640 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
15650 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
15660 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
15670 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15680 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
15690 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
156a0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
156b0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
156c0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
156d0 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
156e0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
156f0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
15700 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
15710 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
15720 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
15730 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
15740 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
15750 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
15760 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
15770 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
15780 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55  static int semXU
15790 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
157a0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
157b0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
157c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
157d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
157e0 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
157f0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
15800 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
15810 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
15820 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  Sem );.  OSTRACE
15830 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
15840 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
15850 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
15860 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20  h, eFileLock,.  
15870 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e           pFile->
15880 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74  eFileLock, osGet
15890 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65  pid(0)));.  asse
158a0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
158b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
158c0 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
158d0 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
158e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
158f0 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
15900 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15910 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
15920 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
15930 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
15940 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
15950 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
15960 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
15970 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
15980 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
15990 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
159a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
159b0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
159c0 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75   /* no, really u
159d0 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28  nlock. */.  if (
159e0 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d   sem_post(pSem)=
159f0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20  =-1 ) {.    int 
15a00 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  rc, tErrno = err
15a10 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  no;.    rc = sql
15a20 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
15a30 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
15a40 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15a50 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
15a60 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
15a70 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
15a80 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
15a90 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20  rrno);.    }.   
15aa0 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d   return rc; .  }
15ab0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
15ac0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
15ad0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15ae0 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f  K;.}../*. ** Clo
15af0 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73  se a file.. */.s
15b00 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c  tatic int semXCl
15b10 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
15b20 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
15b30 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
15b40 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15b50 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
15b60 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  XUnlock(id, NO_L
15b70 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
15b80 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
15b90 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
15ba0 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
15bb0 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
15bc0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
15bd0 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
15be0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
15bf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15c00 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
15c10 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
15c20 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
15c30 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
15c40 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
15c50 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
15c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
15c70 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
15c80 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
15c90 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
15ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
15cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
15d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
15d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
15d70 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
15d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
15da0 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
15db0 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
15dc0 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
15dd0 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
15de0 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
15df0 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
15e00 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
15e10 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
15e20 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
15e30 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
15e40 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
15e50 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
15e60 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
15e70 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
15e80 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
15e90 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
15ea0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
15eb0 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
15ec0 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
15ed0 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
15ee0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
15ef0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
15f00 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
15f10 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
15f20 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
15f30 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
15f40 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
15f50 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
15f60 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
15f70 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
15f80 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
15f90 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
15fa0 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
15fb0 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
15fc0 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
15fd0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
15fe0 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
15ff0 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
16000 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
16010 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
16020 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
16030 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
16040 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
16050 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
16060 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
16070 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
16080 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
16090 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
160a0 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
160b0 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
160c0 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
160d0 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
160e0 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
160f0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
16100 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
16110 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
16120 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
16130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
16150 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
16160 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
16170 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
16180 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
16190 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
161a0 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
161b0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
161c0 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
161d0 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
161e0 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
161f0 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
16200 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
16210 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
16220 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
16230 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
16240 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
16250 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
16260 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
16270 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
16280 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
16290 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
162a0 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
162b0 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
162c0 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
162d0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
162e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
162f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16300 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
16310 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
16320 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
16330 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
16340 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
16350 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
16360 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
16370 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
16380 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
16390 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
163a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
163b0 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
163c0 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
163d0 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
163e0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
163f0 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
16400 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
16410 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
16420 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
16430 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
16440 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
16450 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
16460 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
16470 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
16480 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
16490 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
164a0 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
164b0 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
164c0 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
164d0 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
164e0 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
164f0 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
16500 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
16510 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
16520 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
16530 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
16540 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
16550 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
16560 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
16570 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
16580 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
16590 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
165a0 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
165b0 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
165c0 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
165d0 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
165e0 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
165f0 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
16600 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
16610 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
16620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
16630 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
16640 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
16650 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
16660 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
16670 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
16680 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
16690 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
166a0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
166b0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
166c0 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
166d0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
166e0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
166f0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73  R(rc) ){.      s
16700 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
16710 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
16720 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
16730 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
16740 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16750 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
16760 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
16770 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
16780 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
16790 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
167a0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
167b0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
167c0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
167d0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
167e0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
167f0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
16800 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
16810 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
16820 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
16830 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
16840 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
16850 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
16860 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
16870 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
16880 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
16890 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
168a0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
168b0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
168c0 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
168d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
168e0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
168f0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
16900 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16910 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
16920 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
16930 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  ext;.  .  Simula
16940 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
16950 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
16960 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
16970 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
16980 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e  ( pFile );.  con
16990 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
169a0 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
169b0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
169c0 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
169d0 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
169e0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
169f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16a00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
16a10 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
16a20 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
16a30 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
16a40 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
16a50 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
16a60 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
16a70 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
16a80 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
16a90 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
16aa0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
16ab0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
16ac0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
16ad0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
16ae0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
16af0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
16b00 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
16b10 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
16b20 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
16b30 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
16b40 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
16b50 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
16b60 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16b70 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
16b80 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
16b90 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
16ba0 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
16bb0 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
16bc0 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
16bd0 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
16be0 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
16bf0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
16c00 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
16c10 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
16c20 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
16c30 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
16c40 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
16c50 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
16c60 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
16c70 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
16c80 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
16c90 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
16ca0 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
16cb0 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
16cc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
16cd0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
16ce0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
16cf0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
16d00 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
16d10 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
16d20 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
16d30 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
16d40 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
16d50 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
16d60 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
16d70 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
16d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
16d90 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
16da0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
16db0 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
16dc0 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
16dd0 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16de0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
16df0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
16e00 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
16e10 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
16e20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
16e30 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
16e40 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
16e50 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
16e60 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
16e70 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
16e80 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
16e90 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
16ea0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
16eb0 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
16ec0 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
16ed0 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
16ee0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
16ef0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
16f00 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
16f10 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
16f20 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
16f30 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
16f40 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
16f50 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
16f60 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
16f70 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
16f80 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
16f90 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
16fa0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
16fb0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
16fc0 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
16fd0 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
16fe0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
16ff0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
17000 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
17010 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
17020 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
17030 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
17040 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
17050 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
17060 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
17070 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
17080 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
17090 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
170a0 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
170b0 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
170c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
170d0 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
170e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
170f0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
17100 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
17110 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
17120 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
17130 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
17140 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
17150 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
17160 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
17170 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
17180 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
17190 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
171a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
171b0 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
171c0 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
171d0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
171e0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
171f0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
17200 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
17210 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
17220 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
17230 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
17240 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
17250 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
17260 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
17270 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
17280 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
17290 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
172a0 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
172b0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
172c0 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
172d0 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
172e0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65   afp_end_lock: e
172f0 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
17300 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
17310 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
17320 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
17330 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
17340 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
17350 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
17360 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
17370 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
17380 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  d) (afp)\n", pFi
17390 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20  le->h,.         
173a0 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
173b0 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
173c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
173d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
173e0 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
173f0 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
17400 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57  rect.  **  (1) W
17410 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f  e never move fro
17420 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e  m unlocked to an
17430 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68  ything higher th
17440 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a  an shared lock..
17450 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65    **  (2) SQLite
17460 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c   never explicitl
17470 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e  y requests a pen
17480 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  dig lock..  **  
17490 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63  (3) A shared loc
174a0 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64  k is always held
174b0 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20   when a reserve 
174c0 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
174d0 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
174e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
174f0 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65  ck!=NO_LOCK || e
17500 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17510 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
17520 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45  t( eFileLock!=PE
17530 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20  NDING_LOCK );.  
17540 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
17550 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k!=RESERVED_LOCK
17560 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   || pFile->eFile
17570 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17580 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69  K );.  .  /* Thi
17590 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65  s mutex is neede
175a0 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d  d because pFile-
175b0 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
175c0 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
175d0 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
175e0 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
175f0 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
17600 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d  de;..  /* If som
17610 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
17620 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f  his PID has a lo
17630 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65  ck via a differe
17640 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a  nt unixFile*.  *
17650 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72  * handle that pr
17660 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75  ecludes the requ
17670 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75  ested lock, retu
17680 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20  rn BUSY..  */.  
17690 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c  if( (pFile->eFil
176a0 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65  eLock!=pInode->e
176b0 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20  FileLock && .   
176c0 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
176d0 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
176e0 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
176f0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
17700 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d       ){.    rc =
17710 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
17720 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
17730 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
17740 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
17750 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
17760 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
17770 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
17780 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
17790 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
177a0 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
177b0 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
177c0 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
177d0 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
177e0 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
177f0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
17800 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
17810 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
17820 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
17830 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c   || pInode->eFil
17840 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f  eLock==RESERVED_
17850 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73  LOCK) ){.    ass
17860 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
17870 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
17880 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
17890 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
178a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
178b0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20  node->nShared>0 
178c0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  );.    pFile->eF
178d0 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
178e0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
178f0 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20  e->nShared++;.  
17900 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b    pInode->nLock+
17910 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  +;.    goto afp_
17920 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
17930 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e    .  /* A PENDIN
17940 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64  G lock is needed
17950 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
17960 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20  g a SHARED lock 
17970 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  and before.  ** 
17980 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43  acquiring an EXC
17990 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f  LUSIVE lock.  Fo
179a0 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63  r the SHARED loc
179b0 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77  k, the PENDING w
179c0 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65  ill.  ** be rele
179d0 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ased..  */.  if(
179e0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
179f0 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
17a00 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
17a10 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
17a20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17a30 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
17a40 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c   ){.    int fail
17a50 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d  ed;.    failed =
17a60 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17a70 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17a80 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
17a90 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20  , 1, 1);.    if 
17aa0 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20  (failed) {.     
17ab0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
17ac0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
17ad0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _lock;.    }.  }
17ae0 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  .  .  /* If cont
17af0 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
17b00 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
17b10 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
17b20 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
17b30 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
17b40 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
17b50 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
17b60 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
17b70 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
17b80 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c  .    int lrc1, l
17b90 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d  rc2, lrc1Errno =
17ba0 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c   0;.    long lk,
17bb0 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20   mask;.    .    
17bc0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17bd0 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20  nShared==0 );.  
17be0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
17bf0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29  ->eFileLock==0 )
17c00 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d  ;.        .    m
17c10 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f  ask = (sizeof(lo
17c20 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53  ng)==8) ? LARGES
17c30 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66  T_INT64 : 0x7fff
17c40 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77  ffff;.    /* Now
17c50 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f   get the read-lo
17c60 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  ck SHARED_LOCK *
17c70 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68  /.    /* note th
17c80 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f  at the quality o
17c90 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  f the randomness
17ca0 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
17cb0 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20  that much */.   
17cc0 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20   lk = random(); 
17cd0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61  .    pInode->sha
17ce0 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20  redByte = (lk & 
17cf0 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49  mask)%(SHARED_SI
17d00 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63  ZE - 1);.    lrc
17d10 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  1 = afpSetLock(c
17d20 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
17d30 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
17d40 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70    SHARED_FIRST+p
17d50 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
17d60 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  e, 1, 1);.    if
17d70 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17d80 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c  lrc1) ){.      l
17d90 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65  rc1Errno = pFile
17da0 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
17db0 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74   }.    /* Drop t
17dc0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e  he temporary PEN
17dd0 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  DING lock */.   
17de0 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f   lrc2 = afpSetLo
17df0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17e00 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
17e10 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
17e20 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f      .    if( IS_
17e30 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
17e40 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65   ) {.      store
17e50 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
17e60 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20   lrc1Errno);.   
17e70 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
17e80 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
17e90 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
17ea0 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52  e if( IS_LOCK_ER
17eb0 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20  ROR(lrc2) ){.   
17ec0 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20     rc = lrc2;.  
17ed0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
17ee0 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73  _lock;.    } els
17ef0 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51  e if( lrc1 != SQ
17f00 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20  LITE_OK ) {.    
17f10 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
17f20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
17f30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17f40 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
17f50 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
17f60 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
17f70 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
17f80 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
17f90 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
17fa0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
17fb0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
17fc0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
17fd0 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
17fe0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
17ff0 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
18000 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
18010 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73   ** same process
18020 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e   is still holdin
18030 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  g a shared lock.
18040 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   */.    rc = SQL
18050 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73  ITE_BUSY;.  }els
18060 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
18070 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20  quest was for a 
18080 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
18090 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20  USIVE lock.  It 
180a0 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65  is.    ** assume
180b0 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  d that there is 
180c0 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61  a SHARED or grea
180d0 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
180e0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65  file.    ** alre
180f0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
18100 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a  int failed = 0;.
18110 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70      assert( 0!=p
18120 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18130 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65  );.    if (eFile
18140 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44  Lock >= RESERVED
18150 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
18160 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45  eFileLock < RESE
18170 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  RVED_LOCK) {.   
18180 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
18190 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
181a0 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
181b0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
181c0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
181d0 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
181e0 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20  BYTE, 1,1);.    
181f0 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b    if( !failed ){
18200 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
18210 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a  ->reserved = 1;.
18220 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18230 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26    if (!failed &&
18240 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58   eFileLock == EX
18250 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a  CLUSIVE_LOCK) {.
18260 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
18270 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
18280 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20  ck */.        . 
18290 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74       /* Remove t
182a0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62  he shared lock b
182b0 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65  efore trying the
182c0 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e   range.  we'll n
182d0 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  eed to .      **
182e0 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
182f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20   shared lock if 
18300 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65  we can't get the
18310 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20    afpUnlock.    
18320 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
18330 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74  (failed = afpSet
18340 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
18350 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
18360 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20  RED_FIRST +.    
18370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18380 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61       pInode->sha
18390 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20  redByte, 1, 0)) 
183a0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
183b0 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f  ailed2 = SQLITE_
183c0 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e  OK;.        /* n
183d0 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67  ow attemmpt to g
183e0 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
183f0 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
18400 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20         failed = 
18410 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
18420 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
18430 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
18440 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18460 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29   SHARED_SIZE, 1)
18470 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61  ;.        if( fa
18480 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32  iled && (failed2
18490 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
184a0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
184b0 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
184d0 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e  ARED_FIRST + pIn
184e0 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c  ode->sharedByte,
184f0 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20   1, 1)) ){.     
18500 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65       /* Can't re
18510 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
18520 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69  ared lock.  Sqli
18530 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74  te can't deal, t
18540 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20  his is.         
18550 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49   ** a critical I
18560 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20  /O error.       
18570 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
18580 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20  rc = ((failed & 
18590 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45 5f  0xff) == SQLITE_
185a0 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65 64 32  IOERR) ? failed2
185b0 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   : .            
185c0 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f     SQLITE_IOERR_
185d0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  LOCK;.          
185e0 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63  goto afp_end_loc
185f0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20  k;.        } .  
18600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18610 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 20     rc = failed; 
18620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18630 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 29 7b     if( failed ){
18640 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c  .      rc = fail
18650 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ed;.    }.  }.  
18660 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
18680 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
18690 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
186a0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
186b0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
186c0 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
186d0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
186e0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
186f0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
18700 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
18710 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
18720 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
18730 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e 64 5f  .  }.  .afp_end_
18740 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76  lock:.  unixLeav
18750 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52  eMutex();.  OSTR
18760 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
18770 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e 22 2c   %s %s (afp)\n",
18780 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
18790 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
187a0 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63 3d 3d  , .         rc==
187b0 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22  SQLITE_OK ? "ok"
187c0 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20   : "failed"));. 
187d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
187e0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
187f0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
18800 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
18810 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
18820 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
18830 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
18840 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
18850 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
18860 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
18870 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
18880 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
18890 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
188a0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
188b0 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
188c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
188d0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
188e0 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e 6c 6f  atic int afpUnlo
188f0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
18900 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
18910 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
18920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
18930 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18940 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18950 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
18960 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63  pInode;.  afpLoc
18970 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
18980 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
18990 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
189a0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
189b0 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70 53 68  xt;.  int skipSh
189c0 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64 65 66  ared = 0;.#ifdef
189d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
189e0 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  nt h = pFile->h;
189f0 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
18a00 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
18a10 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
18a20 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
18a30 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
18a40 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
18a50 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
18a60 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
18a70 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49  eLock, pFile->pI
18a80 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  node->eFileLock,
18a90 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
18aa0 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20 20  nShared,.       
18ab0 20 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29      osGetpid(0))
18ac0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46  );..  assert( eF
18ad0 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
18ae0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46  LOCK );.  if( pF
18af0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ile->eFileLock<=
18b00 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
18b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18b20 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74  K;.  }.  unixEnt
18b30 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
18b40 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
18b50 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ode;.  assert( p
18b60 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d  Inode->nShared!=
18b70 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  0 );.  if( pFile
18b80 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
18b90 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  ED_LOCK ){.    a
18ba0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
18bb0 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d  FileLock==pFile-
18bc0 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
18bd0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
18be0 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
18bf0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
18c00 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69   h=(-1) ).    Si
18c10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
18c20 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66  ign(0);.    .#if
18c30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
18c40 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
18c50 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
18c60 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
18c70 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
18c80 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
18c90 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18ca0 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
18cb0 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
18cc0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
18cd0 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
18ce0 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
18cf0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
18d00 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
18d10 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
18d20 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
18d30 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
18d40 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
18d50 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
18d60 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
18d70 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
18d80 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
18d90 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
18da0 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
18db0 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
18dc0 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
18dd0 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
18de0 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
18df0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
18e00 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
18e10 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
18e20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
18e30 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20 20 20  Write==0.       
18e40 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 64 62      || pFile->db
18e50 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20 20 20  Update==0.      
18e60 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e 74       || pFile->t
18e70 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d 31 20  ransCntrChng==1 
18e80 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  );.    pFile->in
18e90 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
18ea0 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20 20 20  .#endif.    .   
18eb0 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18ec0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
18ed0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
18ee0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
18ef0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
18f00 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
18f10 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  RST, SHARED_SIZE
18f20 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
18f30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18f40 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
18f50 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
18f60 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 20 29  de->nShared>1) )
18f70 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f 6e 6c  {.        /* onl
18f80 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68 20 74  y re-establish t
18f90 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69  he shared lock i
18fa0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
18fb0 20 20 20 20 20 20 20 69 6e 74 20 73 68 61 72 65         int share
18fc0 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52  dLockByte = SHAR
18fd0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
18fe0 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20  >sharedByte;.   
18ff0 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
19000 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19010 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61  Path, pFile, sha
19020 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20  redLockByte, 1, 
19030 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
19040 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69 70 53   {.        skipS
19050 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  hared = 1;.     
19060 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
19070 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
19080 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
19090 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
190a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
190b0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
190c0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
190d0 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
190e0 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a 20 20  1, 0);.    } .  
190f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19100 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
19110 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52 56 45  ileLock>=RESERVE
19120 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74 65 78  D_LOCK && contex
19130 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
19140 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74       rc = afpSet
19150 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19160 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
19170 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
19180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 72 63  );.      if( !rc
19190 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63 6f 6e   ){ .        con
191a0 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
191b0 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20   0; .      }.   
191c0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
191d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69  QLITE_OK && (eFi
191e0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
191f0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e  OCK || pInode->n
19200 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20 20 20  Shared>1)){.    
19210 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
19220 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
19230 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  K;.    }.  }.  i
19240 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19250 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e   && eFileLock==N
19260 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20 20 2f  O_LOCK ){..    /
19270 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
19280 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e  shared lock coun
19290 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74 68  ter.  Release th
192a0 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a  e lock using an.
192b0 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f      ** OS call o
192c0 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68 72  nly when all thr
192d0 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61 6d  eads in this sam
192e0 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20 72  e process have r
192f0 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20 74  eleased.    ** t
19300 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a  he lock..    */.
19310 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
19320 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c 6f 63  g long sharedLoc
19330 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
19340 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
19350 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70 49 6e  redByte;.    pIn
19360 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
19370 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
19380 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
19390 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
193a0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
193b0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
193c0 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20  ror( h=(-1) ).  
193d0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
193e0 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
193f0 20 20 20 20 69 66 28 20 21 73 6b 69 70 53 68 61      if( !skipSha
19400 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  red ){.        r
19410 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
19420 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19430 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
19440 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a 20 20  kByte, 1, 0);.  
19450 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19460 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !rc ){.        p
19470 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
19480 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
19490 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
194a0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
194b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
194c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
194d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  _OK ){.      pIn
194e0 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20  ode->nLock--;.  
194f0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
19500 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a  de->nLock>=0 );.
19510 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
19520 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
19530 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
19540 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
19550 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
19560 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
19570 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
19580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
19590 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
195a0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
195b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
195c0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20   Close a file & 
195d0 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63  cleanup AFP spec
195e0 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e  ific locking con
195f0 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20  text .*/.static 
19600 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c  int afpClose(sql
19610 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
19620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19630 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19640 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19650 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
19660 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 61  rt( id!=0 );.  a
19670 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
19680 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
19690 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  erMutex();.  if(
196a0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
196b0 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
196c0 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
196d0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
196e0 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
196f0 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
19700 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
19710 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
19720 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
19730 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
19740 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
19750 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
19760 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
19770 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69  o pInode->aPendi
19780 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
19790 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
197a0 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 2a 2a  osed when.    **
197b0 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
197c0 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a  s cleared..    *
197d0 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67  /.    setPending
197e0 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20  Fd(pFile);.  }. 
197f0 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
19800 6f 28 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69  o(pFile);.  sqli
19810 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
19820 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
19830 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69  .  rc = closeUni
19840 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69  xFile(id);.  uni
19850 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
19860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
19870 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
19880 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
19890 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
198a0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
198b0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
198c0 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f  ve is the AFP lo
198d0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
198e0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
198f0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
19900 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
19910 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
19920 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
19930 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
19940 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
19950 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20  .  If you don't 
19960 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61  compile for a ma
19970 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69  c, then the "uni
19980 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73  x-afp".** VFS is
19990 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a   not available..
199a0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
199b0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
199c0 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
199d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
199e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
199f0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
19a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a40 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
19a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19a90 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
19aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
19ab0 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e  Begin NFS Lockin
19ac0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
19ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ae0 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  **/..#if defined
19af0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
19b00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
19b10 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a  KING_STYLE./*. *
19b20 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
19b30 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
19b40 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
19b50 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
19b60 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20    eFileLock. ** 
19b70 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
19b80 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
19b90 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49  _LOCK.. **. ** I
19ba0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
19bb0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
19bc0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
19bd0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
19be0 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73  w. ** the reques
19bf0 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
19c00 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
19c10 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a  is a no-op.. */.
19c20 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e  static int nfsUn
19c30 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
19c40 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
19c50 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20  Lock){.  return 
19c60 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
19c70 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d  eFileLock, 1);.}
19c80 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
19c90 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
19ca0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
19cb0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
19cc0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20  ./*.** The code 
19cd0 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53  above is the NFS
19ce0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
19cf0 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20  tion.  The code 
19d00 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74  is specific.** t
19d10 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65  o MacOSX and doe
19d20 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74  s not work on ot
19d30 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72  her unix platfor
19d40 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74  ms.  No alternat
19d50 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61  ive.** is availa
19d60 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  ble.  .**.******
19d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
19d80 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c  End of the NFS l
19d90 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
19da0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
19db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
19dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e00 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
19e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
19e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d  *********** Non-
19e70 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  locking sqlite3_
19e80 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a  file methods ***
19e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
19eb0 20 54 68 65 20 6e 65 78 74 20 64 69 76 69 73 69   The next divisi
19ec0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c  on contains impl
19ed0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20  ementations for 
19ee0 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74  all methods of t
19ef0 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66  he .** sqlite3_f
19f00 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72  ile object other
19f10 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   than the lockin
19f20 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20  g methods.  The 
19f30 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f  locking.** metho
19f40 64 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20  ds were defined 
19f50 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f  in divisions abo
19f60 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20  ve (one locking 
19f70 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69  method per.** di
19f80 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20  vision).  Those 
19f90 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61 72 65  methods that are
19fa0 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c   common to all l
19fb0 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20  ocking modes.** 
19fc0 61 72 65 20 67 61 74 68 65 72 20 74 6f 67 65 74  are gather toget
19fd0 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69  her into this di
19fe0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  vision..*/../*.*
19ff0 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66  * Seek to the of
1a000 66 73 65 74 20 70 61 73 73 65 64 20 61 73 20 74  fset passed as t
1a010 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1a020 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e  nt, then read cn
1a030 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f  t .** bytes into
1a040 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68   pBuf. Return th
1a050 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1a060 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1a070 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79  .**.** NB:  If y
1a080 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52  ou define USE_PR
1a090 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44  EAD or USE_PREAD
1a0a0 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68  64, then it migh
1a0b0 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63  t also.** be nec
1a0c0 65 73 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65  essary to define
1a0d0 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74   _XOPEN_SOURCE t
1a0e0 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69 73 20  o be 500.  This 
1a0f0 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f  varies from.** o
1a100 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f  ne system to ano
1a110 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c  ther.  Since SQL
1a120 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66  ite does not def
1a130 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a  ine USE_PREAD.**
1a140 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79 20   in any form by 
1a150 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c  default, we will
1a160 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
1a170 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f  define _XOPEN_SO
1a180 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63  URCE..** See tic
1a190 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64 20 23  kets #2741 and #
1a1a0 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  2681..**.** To a
1a1b0 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1a1c0 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1a1d0 20 61 20 66 61 69 6c 65 64 20 72 65 61 64 20 74   a failed read t
1a1e0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1a1f0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1a200 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1a210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1a220 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c  kAndRead(unixFil
1a230 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69  e *id, sqlite3_i
1a240 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69  nt64 offset, voi
1a250 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74  d *pBuf, int cnt
1a260 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20  ){.  int got;.  
1a270 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23  int prior = 0;.#
1a280 69 66 20 28 21 64 65 66 69 6e 65 64 28 55 53 45  if (!defined(USE
1a290 5f 50 52 45 41 44 29 20 26 26 20 21 64 65 66 69  _PREAD) && !defi
1a2a0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1a2b0 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65  ).  i64 newOffse
1a2c0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45  t;.#endif.  TIME
1a2d0 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72  R_START;.  asser
1a2e0 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31  t( cnt==(cnt&0x1
1a2f0 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
1a300 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20  t( id->h>2 );.  
1a310 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
1a320 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
1a330 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
1a340 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
1a350 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
1a360 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
1a370 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
1a380 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1a390 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
1a3a0 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
1a3b0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1a3c0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1a3d0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1a3e0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
1a3f0 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
1a400 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
1a410 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1a420 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
1a430 65 77 4f 66 66 73 65 74 20 3d 20 2d 31 20 29 3b  ewOffset = -1 );
1a440 0a 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73  .    if( newOffs
1a450 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 73 74  et<0 ){.      st
1a460 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1a470 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1a480 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
1a490 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   -1;.    }.    g
1a4a0 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e  ot = osRead(id->
1a4b0 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
1a4c0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f  endif.    if( go
1a4d0 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  t==cnt ) break;.
1a4e0 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b      if( got<0 ){
1a4f0 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
1a500 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d  ==EINTR ){ got =
1a510 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a   1; continue; }.
1a520 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b        prior = 0;
1a530 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
1a540 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
1a550 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20  )id,  errno);.  
1a560 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1a570 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29  else if( got>0 )
1a580 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67  {.      cnt -= g
1a590 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ot;.      offset
1a5a0 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
1a5b0 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  rior += got;.   
1a5c0 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
1a5d0 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70  )(got + (char*)p
1a5e0 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Buf);.    }.  }w
1a5f0 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20  hile( got>0 );. 
1a600 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
1a610 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
1a620 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
1a630 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llu\n",.        
1a640 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70      id->h, got+p
1a650 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69  rior, offset-pri
1a660 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  or, TIMER_ELAPSE
1a670 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
1a680 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  t+prior;.}../*.*
1a690 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
1a6a0 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
1a6b0 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
1a6c0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
1a6d0 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
1a6e0 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
1a6f0 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
1a700 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1a710 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
1a720 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
1a730 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
1a740 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
1a750 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1a760 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1a770 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
1a780 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1a790 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1a7a0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
1a7b0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1a7c0 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
1a7d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1a7e0 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1a7f0 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1a800 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1a810 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1a820 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1a830 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1a840 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1a850 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1a860 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1a870 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1a880 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1a890 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65  le->pPreallocate
1a8a0 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  dUnused==0.     
1a8b0 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1a8c0 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1a8d0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1a8e0 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1a8f0 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1a900 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
1a910 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
1a920 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
1a930 20 6f 66 20 74 68 69 73 20 72 65 61 64 20 72 65   of this read re
1a940 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c  quest as possibl
1a950 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67  e by transfering
1a960 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20  .  ** data from 
1a970 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
1a980 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28  ng using memcpy(
1a990 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66  ).  */.  if( off
1a9a0 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  set<pFile->mmapS
1a9b0 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f  ize ){.    if( o
1a9c0 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69  ffset+amt <= pFi
1a9d0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  le->mmapSize ){.
1a9e0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1a9f0 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1aa00 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1aa10 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20  offset], amt);. 
1aa20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1aa30 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
1aa40 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70  {.      int nCop
1aa50 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  y = pFile->mmapS
1aa60 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
1aa70 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1aa80 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1aa90 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1aaa0 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20  fset], nCopy);. 
1aab0 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 75       pBuf = &((u
1aac0 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d  8 *)pBuf)[nCopy]
1aad0 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e  ;.      amt -= n
1aae0 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73  Copy;.      offs
1aaf0 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  et += nCopy;.   
1ab00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
1ab10 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65   got = seekAndRe
1ab20 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  ad(pFile, offset
1ab30 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
1ab40 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a  if( got==amt ){.
1ab50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ab60 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  E_OK;.  }else if
1ab70 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f  ( got<0 ){.    /
1ab80 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1ab90 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a  by seekAndRead *
1aba0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
1abb0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
1abc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f    }else{.    sto
1abd0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1abe0 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20  e, 0);   /* not 
1abf0 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a  a system error *
1ac00 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20  /.    /* Unread 
1ac10 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75 66  parts of the buf
1ac20 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  fer must be zero
1ac30 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d  -filled */.    m
1ac40 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29 70  emset(&((char*)p
1ac50 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d  Buf)[got], 0, am
1ac60 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75  t-got);.    retu
1ac70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1ac80 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a  SHORT_READ;.  }.
1ac90 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
1aca0 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c   to seek the fil
1acb0 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61 73  e-descriptor pas
1acc0 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
1acd0 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20   argument to.** 
1ace0 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20  absolute offset 
1acf0 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d  iOff, then attem
1ad00 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66  pt to write nBuf
1ad10 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
1ad20 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69  rom.** pBuf to i
1ad30 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  t. If an error o
1ad40 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31  ccurs, return -1
1ad50 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e   and set *piErrn
1ad60 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a  o. Otherwise, .*
1ad70 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63 74  * return the act
1ad80 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  ual number of by
1ad90 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68 69  tes written (whi
1ada0 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74  ch may be less t
1adb0 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f  han.** nBuf)..*/
1adc0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
1add0 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e  AndWriteFd(.  in
1ade0 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20  t fd,           
1adf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae00 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
1ae10 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1ae20 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20    i64 iOff,     
1ae30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae40 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74    /* File offset
1ae50 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e   to begin writin
1ae60 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  g at */.  const 
1ae70 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
1ae80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70            /* Cop
1ae90 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73  y data from this
1aea0 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20 66   buffer to the f
1aeb0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75  ile */.  int nBu
1aec0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1aed0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1aee0 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66 20   of buffer pBuf 
1aef0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
1af00 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20  t *piErrno      
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af20 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62   OUT: Error numb
1af30 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75  er if error occu
1af40 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  rs */.){.  int r
1af50 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1af60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61             /* Va
1af70 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
1af80 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a  system call */..
1af90 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d    assert( nBuf==
1afa0 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20 29  (nBuf&0x1ffff) )
1afb0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 32  ;.  assert( fd>2
1afc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 69   );.  assert( pi
1afd0 45 72 72 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42  Errno!=0 );.  nB
1afe0 75 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20  uf &= 0x1ffff;. 
1aff0 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23   TIMER_START;..#
1b000 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
1b010 52 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d  READ).  do{ rc =
1b020 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66   (int)osPwrite(f
1b030 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69  d, pBuf, nBuf, i
1b040 4f 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63  Off); }while( rc
1b050 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
1b060 54 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  TR );.#elif defi
1b070 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1b080 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74  .  do{ rc = (int
1b090 29 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20  )osPwrite64(fd, 
1b0a0 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
1b0b0 29 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  );}while( rc<0 &
1b0c0 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b  & errno==EINTR);
1b0d0 0a 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20  .#else.  do{.   
1b0e0 20 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65   i64 iSeek = lse
1b0f0 65 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45  ek(fd, iOff, SEE
1b100 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75  K_SET);.    Simu
1b110 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65  lateIOError( iSe
1b120 65 6b 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  ek = -1 );.    i
1b130 66 28 20 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20  f( iSeek<0 ){.  
1b140 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1b150 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b160 20 20 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65      rc = osWrite
1b170 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29  (fd, pBuf, nBuf)
1b180 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  ;.  }while( rc<0
1b190 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1b1a0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49   );.#endif..  TI
1b1b0 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41  MER_END;.  OSTRA
1b1c0 43 45 28 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE(("WRITE   %-3
1b1d0 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75  d %5d %7lld %llu
1b1e0 5c 6e 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66  \n", fd, rc, iOf
1b1f0 66 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  f, TIMER_ELAPSED
1b200 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20  ));..  if( rc<0 
1b210 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72  ) *piErrno = err
1b220 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  no;.  return rc;
1b230 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .}.../*.** Seek 
1b240 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1b250 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1b260 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1b270 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1b280 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1b290 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1b2a0 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1b2b0 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1b2c0 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1b2d0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1b2e0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1b2f0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1b300 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1b310 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1b320 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1b330 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1b340 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1b350 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1b360 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1b370 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   cnt){.  return 
1b380 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69  seekAndWriteFd(i
1b390 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42  d->h, offset, pB
1b3a0 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61  uf, cnt, &id->la
1b3b0 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  stErrno);.}.../*
1b3c0 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
1b3d0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
1b3e0 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
1b3f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1b400 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
1b410 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1b420 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
1b430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1b440 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
1b450 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
1b460 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1b470 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1b480 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1b490 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
1b4a0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1b4b0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1b4c0 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
1b4d0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1b4e0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1b4f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1b500 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1b510 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1b520 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1b530 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1b540 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1b550 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1b560 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1b570 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1b580 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1b590 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50 72  sert( pFile->pPr
1b5a0 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
1b5b0 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  ==0.       || of
1b5c0 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59  fset>=PENDING_BY
1b5d0 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c  TE+512.       ||
1b5e0 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e   offset+amt<=PEN
1b5f0 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a  DING_BYTE .  );.
1b600 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1b610 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
1b620 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67   If we are doing
1b630 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20   a normal write 
1b640 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
1b650 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74  le (as opposed t
1b660 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68  o.  ** doing a h
1b670 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1b680 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
1b690 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
1b6a0 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f  r than a.  ** no
1b6b0 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  rmal database fi
1b6c0 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64 20  le) then record 
1b6d0 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68  the fact that th
1b6e0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
1b6f0 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49 66  has changed.  If
1b700 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b710 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64 69   counter is modi
1b720 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68 61  fied, record tha
1b730 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e  t.  ** fact too.
1b740 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1b750 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1b760 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
1b770 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a  bUpdate = 1;  /*
1b780 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68 61   The database ha
1b790 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  s been modified 
1b7a0 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  */.    if( offse
1b7b0 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74 2b  t<=24 && offset+
1b7c0 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20  amt>=27 ){.     
1b7d0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 63   int rc;.      c
1b7e0 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a  har oldCntr[4];.
1b7f0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1b800 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1b810 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b 41        rc = seekA
1b820 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32 34  ndRead(pFile, 24
1b830 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20  , oldCntr, 4);. 
1b840 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1b850 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
1b860 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20 7c       if( rc!=4 |
1b870 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72  | memcmp(oldCntr
1b880 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  , &((char*)pBuf)
1b890 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21  [24-offset], 4)!
1b8a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  =0 ){.        pF
1b8b0 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68  ile->transCntrCh
1b8c0 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20  ng = 1;  /* The 
1b8d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
1b8e0 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64 20  ter has changed 
1b8f0 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  */.      }.    }
1b900 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
1b910 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b920 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29 20  MMAP_READWRITE) 
1b930 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  && SQLITE_MAX_MM
1b940 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44  AP_SIZE>0.  /* D
1b950 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68  eal with as much
1b960 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20 72   of this write r
1b970 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69 62  equest as possib
1b980 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69 6e  le by transferin
1b990 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d  g.  ** data from
1b9a0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
1b9b0 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70 79  ing using memcpy
1b9c0 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66  ().  */.  if( of
1b9d0 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  fset<pFile->mmap
1b9e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Size ){.    if( 
1b9f0 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46  offset+amt <= pF
1ba00 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1ba10 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1ba20 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1ba30 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1ba40 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  t], pBuf, amt);.
1ba50 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1ba60 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1ba70 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6f  e{.      int nCo
1ba80 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70  py = pFile->mmap
1ba90 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1baa0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28 75       memcpy(&((u
1bab0 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70  8 *)(pFile->pMap
1bac0 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d  Region))[offset]
1bad0 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b 0a  , pBuf, nCopy);.
1bae0 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28 28        pBuf = &((
1baf0 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79  u8 *)pBuf)[nCopy
1bb00 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d 20  ];.      amt -= 
1bb10 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66 66  nCopy;.      off
1bb20 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20  set += nCopy;.  
1bb30 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
1bb40 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74 65  .  while( (wrote
1bb50 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1bb60 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
1bb70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20 26  Buf, amt))<amt &
1bb80 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20  & wrote>0 ){.   
1bb90 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
1bba0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
1bbb0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
1bbc0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
1bbd0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
1bbe0 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
1bbf0 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
1bc00 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
1bc10 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
1bc20 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
1bc30 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f 74  ..  if( amt>wrot
1bc40 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72 6f  e ){.    if( wro
1bc50 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e 6c  te<0 && pFile->l
1bc60 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50 43  astErrno!=ENOSPC
1bc70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61 73   ){.      /* las
1bc80 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65  tErrno set by se
1bc90 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
1bca0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bcb0 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20  E_IOERR_WRITE;. 
1bcc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1bcd0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1bce0 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f 74  File, 0); /* not
1bcf0 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72 20   a system error 
1bd00 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1bd10 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1bd20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1bd30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1bd40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1bd50 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
1bd60 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
1bd70 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
1bd80 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
1bd90 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
1bda0 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
1bdb0 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
1bdc0 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20 72  curring at the r
1bdd0 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69  ight times..*/.i
1bde0 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f  nt sqlite3_sync_
1bdf0 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73  count = 0;.int s
1be00 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
1be10 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
1be20 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20 6e  f../*.** We do n
1be30 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d 73  ot trust systems
1be40 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77 6f   to provide a wo
1be50 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63 28  rking fdatasync(
1be60 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a 20  ).  Some do..** 
1be70 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20 54  Others do no.  T
1be80 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77 69  o be safe, we wi
1be90 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74 68  ll stick with th
1bea0 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f 77  e (slightly slow
1beb0 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e 20  er).** fsync(). 
1bec0 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61 74  If you know that
1bed0 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f 65   your system doe
1bee0 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61 73  s support fdatas
1bef0 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79 2c  ync() correctly,
1bf00 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79 20  .** then simply 
1bf10 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44 66  compile with -Df
1bf20 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73 79  datasync=fdatasy
1bf30 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44 41  nc or -DHAVE_FDA
1bf40 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21 64  TASYNC.*/.#if !d
1bf50 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63  efined(fdatasync
1bf60 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54 41  ) && !HAVE_FDATA
1bf70 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66 64  SYNC.# define fd
1bf80 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23 65  atasync fsync.#e
1bf90 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69  ndif../*.** Defi
1bfa0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1bfb0 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70 65  C to 0 or 1 depe
1bfc0 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72  nding on whether
1bfd0 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20 46   or not.** the F
1bfe0 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72 6f  _FULLFSYNC macro
1bff0 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46 5f   is defined.  F_
1c000 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75 72  FULLFSYNC is cur
1c010 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61  rently.** only a
1c020 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63 20  vailable on Mac 
1c030 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74 20  OS X.  But that 
1c040 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a 2f  could change..*/
1c050 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46 53  .#ifdef F_FULLFS
1c060 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41 56  YNC.# define HAV
1c070 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23 65  E_FULLFSYNC 1.#e
1c080 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41 56  lse.# define HAV
1c090 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23 65  E_FULLFSYNC 0.#e
1c0a0 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ndif.../*.** The
1c0b0 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d 20   fsync() system 
1c0c0 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f  call does not wo
1c0d0 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65 64  rk as advertised
1c0e0 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78   on many.** unix
1c0f0 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20 66   systems.  The f
1c100 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64 75  ollowing procedu
1c110 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74  re is an attempt
1c120 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77   to make.** it w
1c130 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a  ork better..**.*
1c140 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f  * The SQLITE_NO_
1c150 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61 62  SYNC macro disab
1c160 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29 73  les all fsync()s
1c170 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66 75  .  This is usefu
1c180 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  l.** for testing
1c190 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74 6f   when we want to
1c1a0 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68 65   run through the
1c1b0 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69 63   test suite quic
1c1c0 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20  kly..** You are 
1c1d0 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65 64  strongly advised
1c1e0 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79   *not* to deploy
1c1f0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1c200 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  SYNC.** enabled,
1c210 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20   however, since 
1c220 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  with SQLITE_NO_S
1c230 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20  YNC enabled, an 
1c240 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70  OS crash.** or p
1c250 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69 6c  ower failure wil
1c260 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70 74  l likely corrupt
1c270 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1c280 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  le..**.** SQLite
1c290 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f 6e   sets the dataOn
1c2a0 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20 73  ly flag if the s
1c2b0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ize of the file 
1c2c0 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a  is unchanged..**
1c2d0 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e 64   The idea behind
1c2e0 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68 61   dataOnly is tha
1c2f0 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  t it should only
1c300 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   write the file 
1c310 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69  content.** to di
1c320 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64  sk, not the inod
1c330 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74 20  e.  We only set 
1c340 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65 20  dataOnly if the 
1c350 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a  file size is .**
1c360 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63 65   unchanged since
1c370 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1c380 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69 6e  s part of the in
1c390 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a  ode.  However, .
1c3a0 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c 6c  ** Ted Ts'o tell
1c3b0 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61 73  s us that fdatas
1c3c0 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20  ync() will also 
1c3d0 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65 20  write the inode 
1c3e0 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73  if the.** file s
1c3f0 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64 2e  ize has changed.
1c400 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20    The only real 
1c410 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1c420 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a 2a  en fdatasync().*
1c430 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20 54  * and fsync(), T
1c440 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73 20  ed tells us, is 
1c450 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1c460 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20   will not flush 
1c470 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20  the.** inode if 
1c480 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e  the mtime or own
1c490 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64  er or other inod
1c4a0 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61 76  e attributes hav
1c4b0 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65  e changed..** We
1c4c0 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75 74   only care about
1c4d0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c 20   the file size, 
1c4e0 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66 69  not the other fi
1c4f0 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20 73  le attributes, s
1c500 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20 53  o.** as far as S
1c510 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72 6e  QLite is concern
1c520 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e 63  ed, an fdatasync
1c530 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64 65  () is always ade
1c540 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65  quate..** So, we
1c550 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61 74   always use fdat
1c560 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69 73  async() if it is
1c570 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67 61   available, rega
1c580 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65  rdless of.** the
1c590 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
1c5a0 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a  taOnly flag..*/.
1c5b0 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f  static int full_
1c5c0 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e  fsync(int fd, in
1c5d0 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20  t fullSync, int 
1c5e0 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74  dataOnly){.  int
1c5f0 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66   rc;..  /* The f
1c600 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66 2f  ollowing "ifdef/
1c610 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63  elif/else/" bloc
1c620 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  k has the same s
1c630 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a 2a  tructure as.  **
1c640 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20   the one below. 
1c650 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65 64  It is replicated
1c660 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20   here solely to 
1c670 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e 67  avoid cluttering
1c680 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72 65   .  ** up the re
1c690 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68 65  al code with the
1c6a0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1c6b0 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f  R() macros..  */
1c6c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1c6d0 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  O_SYNC.  UNUSED_
1c6e0 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
1c6f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1c700 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1c710 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1c720 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66  dataOnly);.#elif
1c730 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
1c740 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1c750 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65  ER(dataOnly);.#e
1c760 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
1c770 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1c780 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1c790 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1c7a0 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63  #endif..  /* Rec
1c7b0 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ord the number o
1c7c0 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65 20  f times that we 
1c7d0 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e  do a normal fsyn
1c7e0 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55  c() and .  ** FU
1c7f0 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69 73  LLSYNC.  This is
1c800 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
1c810 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20 74  ting to verify t
1c820 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64 75  hat this procedu
1c830 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61 6c  re.  ** gets cal
1c840 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f 72  led with the cor
1c850 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a  rect arguments..
1c860 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1c870 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66 75  TE_TEST.  if( fu
1c880 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65 33  llSync ) sqlite3
1c890 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b  _fullsync_count+
1c8a0 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 6e  +;.  sqlite3_syn
1c8b0 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69  c_count++;.#endi
1c8c0 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f  f..  /* If we co
1c8d0 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65 20  mpiled with the 
1c8e0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66  SQLITE_NO_SYNC f
1c8f0 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e  lag, then syncin
1c900 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f  g is a.  ** no-o
1c910 70 2e 20 20 42 75 74 20 67 6f 20 61 68 65 61 64  p.  But go ahead
1c920 20 61 6e 64 20 63 61 6c 6c 20 66 73 74 61 74 28   and call fstat(
1c930 29 20 74 6f 20 76 61 6c 69 64 61 74 65 20 74 68  ) to validate th
1c940 65 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63  e file.  ** desc
1c950 72 69 70 74 6f 72 20 61 73 20 77 65 20 6e 65 65  riptor as we nee
1c960 64 20 61 20 6d 65 74 68 6f 64 20 74 6f 20 70 72  d a method to pr
1c970 6f 76 6f 6b 65 20 61 20 66 61 69 6c 75 72 65 20  ovoke a failure 
1c980 64 75 72 69 6e 67 0a 20 20 2a 2a 20 63 6f 76 65  during.  ** cove
1c990 72 61 74 65 20 74 65 73 74 69 6e 67 2e 0a 20 20  rate testing..  
1c9a0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
1c9b0 5f 4e 4f 5f 53 59 4e 43 0a 20 20 7b 0a 20 20 20  _NO_SYNC.  {.   
1c9c0 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
1c9d0 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74  ;.    rc = osFst
1c9e0 61 74 28 66 64 2c 20 26 62 75 66 29 3b 0a 20 20  at(fd, &buf);.  
1c9f0 7d 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  }.#elif HAVE_FUL
1ca00 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c  LFSYNC.  if( ful
1ca10 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20  lSync ){.    rc 
1ca20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  = osFcntl(fd, F_
1ca30 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20  FULLFSYNC, 0);. 
1ca40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1ca50 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20   1;.  }.  /* If 
1ca60 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61  the FULLFSYNC fa
1ca70 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20  iled, fall back 
1ca80 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  to attempting an
1ca90 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49   fsync()..  ** I
1caa0 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70  t shouldn't be p
1cab0 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c  ossible for full
1cac0 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e  fsync to fail on
1cad0 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a   the local .  **
1cae0 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e   file system (on
1caf0 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72   OSX), so failur
1cb00 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
1cb10 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20   FULLFSYNC.  ** 
1cb20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
1cb30 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73 79  for this file sy
1cb40 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70  stem. So, attemp
1cb50 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a  t an fsync .  **
1cb60 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69   and (for now) i
1cb70 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65  gnore the overhe
1cb80 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75  ad of a superflu
1cb90 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20  ous fcntl call. 
1cba0 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62   .  ** It'd be b
1cbb0 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74 20  etter to detect 
1cbc0 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72  fullfsync suppor
1cbd0 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64  t once and avoid
1cbe0 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c   .  ** the fcntl
1cbf0 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65   call every time
1cc00 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e   sync is called.
1cc10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29  .  */.  if( rc )
1cc20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1cc30 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ..#elif defined(
1cc40 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20  __APPLE__).  /* 
1cc50 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48  fdatasync() on H
1cc60 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20  FS+ doesn't yet 
1cc70 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20 73  flush the file s
1cc80 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67 65  ize if it change
1cc90 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a  d correctly.  **
1cca0 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65   so currently we
1ccb0 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20   default to the 
1ccc0 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65 66  macro that redef
1ccd0 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20 74  ines fdatasync t
1cce0 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72  o fsync.  */.  r
1ccf0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23  c = fsync(fd);.#
1cd00 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61  else .  rc = fda
1cd10 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20  tasync(fd);.#if 
1cd20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
1cd30 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f   rc==-1 && errno
1cd40 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20  ==ENOTSUP ){.   
1cd50 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1cd60 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
1cd70 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e  S_VXWORKS */.#en
1cd80 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c  dif /* ifdef SQL
1cd90 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66  ITE_NO_SYNC elif
1cda0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20   HAVE_FULLFSYNC 
1cdb0 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57  */..  if( OS_VXW
1cdc0 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20  ORKS && rc!= -1 
1cdd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  ){.    rc = 0;. 
1cde0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cdf0 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
1ce00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1ce10 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  to the directory
1ce20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65   containing file
1ce30 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49   zFilename..** I
1ce40 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70  f successful, *p
1ce50 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Fd is set to the
1ce60 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73   opened file des
1ce70 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53  criptor and.** S
1ce80 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1ce90 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
1cea0 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72  r occurs, either
1ceb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a   SQLITE_NOMEM.**
1cec0 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   or SQLITE_CANTO
1ced0 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20  PEN is returned 
1cee0 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74 20  and *pFd is set 
1cef0 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a  to an undefined.
1cf00 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20  ** value..**.** 
1cf10 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69  The directory fi
1cf20 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1cf30 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f   used for only o
1cf40 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a  ne thing - to.**
1cf50 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65 63   fsync() a direc
1cf60 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72  tory to make sur
1cf70 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20  e file creation 
1cf80 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65  and deletion eve
1cf90 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68  nts.** are flush
1cfa0 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63  ed to disk.  Suc
1cfb0 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74  h fsyncs are not
1cfc0 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72   needed on newer
1cfd0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66  .** journaling f
1cfe0 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20  ilesystems, but 
1cff0 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20  are required on 
1d000 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d  older filesystem
1d010 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
1d020 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65  utine can be ove
1d030 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68  rridden using th
1d040 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e  e xSetSysCall in
1d050 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20  terface..** The 
1d060 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72  ability to overr
1d070 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ide this routine
1d080 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73 75   was added in su
1d090 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  pport of the.** 
1d0a0 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78  chromium sandbox
1d0b0 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72  .  Opening a dir
1d0c0 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63 75  ectory is a secu
1d0d0 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61 72  rity risk (we ar
1d0e0 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61  e.** told) so ma
1d0f0 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65  king it override
1d100 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  able allows the 
1d110 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78  chromium sandbox
1d120 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74   to.** replace t
1d130 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68  his routine with
1d140 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
1d150 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73  p.  To make this
1d160 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f   routine.** a no
1d170 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20  -op, replace it 
1d180 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61 74  with a stub that
1d190 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1d1a0 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a  OK but leaves.**
1d1b0 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e   *pFd set to a n
1d1c0 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a  egative number..
1d1d0 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  **.** If SQLITE_
1d1e0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  OK is returned, 
1d1f0 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  the caller is re
1d200 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c  sponsible for cl
1d210 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c  osing.** the fil
1d220 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46  e descriptor *pF
1d230 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e  d using close().
1d240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
1d250 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e  penDirectory(con
1d260 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1d270 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20  me, int *pFd){. 
1d280 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66   int ii;.  int f
1d290 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a  d = -1;.  char z
1d2a0 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48  Dirname[MAX_PATH
1d2b0 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69  NAME+1];..  sqli
1d2c0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
1d2d0 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e  _PATHNAME, zDirn
1d2e0 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ame, "%s", zFile
1d2f0 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d  name);.  for(ii=
1d300 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72  (int)strlen(zDir
1d310 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26 20 7a  name); ii>0 && z
1d320 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27  Dirname[ii]!='/'
1d330 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69  ; ii--);.  if( i
1d340 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e  i>0 ){.    zDirn
1d350 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a  ame[ii] = '\0';.
1d360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
1d370 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d 27 2f   zDirname[0]!='/
1d380 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 20  ' ) zDirname[0] 
1d390 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69 72 6e  = '.';.    zDirn
1d3a0 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20 7d 0a  ame[1] = 0;.  }.
1d3b0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
1d3c0 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1d3d0 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1d3e0 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d 30 20  0);.  if( fd>=0 
1d3f0 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
1d400 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73  "OPENDIR %-3d %s
1d410 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d  \n", fd, zDirnam
1d420 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46 64 20  e));.  }.  *pFd 
1d430 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64 3e 3d  = fd;.  if( fd>=
1d440 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
1d450 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 75  E_OK;.  return u
1d460 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1d470 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
1d480 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  , "openDirectory
1d490 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 7d 0a  ", zDirname);.}.
1d4a0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1d4b0 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1d4c0 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1d4d0 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1d4e0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
1d4f0 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
1d500 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
1d510 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
1d520 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
1d530 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
1d540 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
1d550 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
1d560 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
1d570 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
1d580 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
1d590 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
1d5a0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
1d5b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1d5c0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
1d5d0 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
1d5e0 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
1d5f0 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
1d600 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
1d610 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
1d620 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
1d630 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
1d640 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
1d650 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
1d660 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
1d670 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
1d680 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
1d690 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
1d6a0 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
1d6b0 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
1d6c0 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
1d6d0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1d6e0 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
1d6f0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
1d700 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
1d710 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
1d720 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
1d730 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
1d740 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
1d750 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
1d760 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
1d770 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1d780 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1d790 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
1d7a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
1d7b0 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
1d7c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1d7d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1d7e0 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
1d7f0 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
1d800 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
1d810 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
1d820 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
1d830 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1d840 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
1d850 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
1d860 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1d870 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
1d880 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
1d890 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
1d8a0 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
1d8b0 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
1d8c0 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1d8d0 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
1d8e0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
1d8f0 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
1d900 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
1d910 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
1d920 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
1d930 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
1d940 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
1d950 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
1d960 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
1d970 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1d980 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
1d990 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
1d9a0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
1d9b0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
1d9c0 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
1d9d0 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
1d9e0 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
1d9f0 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
1da00 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
1da10 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1da20 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1da30 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1da40 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1da50 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1da60 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1da70 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
1da80 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
1da90 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
1daa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
1dab0 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
1dac0 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
1dad0 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
1dae0 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
1daf0 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
1db00 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
1db10 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20  currence.  Many 
1db20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
1db30 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
1db40 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
1db50 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
1db60 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
1db70 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
1db80 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
1db90 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
1dba0 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
1dbb0 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
1dbc0 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
1dbd0 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
1dbe0 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
1dbf0 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
1dc00 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
1dc10 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
1dc20 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
1dc30 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
1dc40 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
1dc50 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
1dc60 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1dc70 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dc80 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72    full_fsync(dir
1dc90 66 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  fd, 0, 0);.     
1dca0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
1dcb0 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
1dcc0 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
1dcd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1dce0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
1dcf0 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20  PEN );.      rc 
1dd00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1dd10 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74   }.    pFile->ct
1dd20 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
1dd30 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20  FILE_DIRSYNC;.  
1dd40 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1dd50 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
1dd60 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f   an open file to
1dd70 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a   a specified siz
1dd80 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
1dd90 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c  unixTruncate(sql
1dda0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1ddb0 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69  64 nByte){.  uni
1ddc0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1ddd0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
1dde0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1ddf0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69  t( pFile );.  Si
1de00 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
1de10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1de20 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a  RR_TRUNCATE );..
1de30 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72    /* If the user
1de40 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20   has configured 
1de50 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72  a chunk-size for
1de60 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e   this file, trun
1de70 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69  cate the.  ** fi
1de80 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f  le so that it co
1de90 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74  nsists of an int
1dea0 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63  eger number of c
1deb0 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a  hunks (i.e. the.
1dec0 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65    ** actual file
1ded0 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65 20   size after the 
1dee0 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65  operation may be
1def0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1df00 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20   requested.  ** 
1df10 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66  size)..  */.  if
1df20 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1df30 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  >0 ){.    nByte 
1df40 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c  = ((nByte + pFil
1df50 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f  e->szChunk - 1)/
1df60 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20  pFile->szChunk) 
1df70 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  * pFile->szChunk
1df80 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f  ;.  }..  rc = ro
1df90 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70  bust_ftruncate(p
1dfa0 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b  File->h, nByte);
1dfb0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1dfc0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1dfd0 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
1dfe0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1dff0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1e000 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1e010 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1e020 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73  ->zPath);.  }els
1e030 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e{.#ifdef SQLITE
1e040 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66  _DEBUG.    /* If
1e050 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1e060 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1e070 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1e080 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1e090 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f     ** doing a ho
1e0a0 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t-journal rollba
1e0b0 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f  ck or a write to
1e0c0 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72   some file other
1e0d0 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e   than a.    ** n
1e0e0 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1e0f0 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e  ile) and we trun
1e100 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1e110 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20   zero length,.  
1e120 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74    ** that effect
1e130 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74 68  ively updates th
1e140 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
1e150 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68 61  .  This might ha
1e160 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e  ppen.    ** when
1e170 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74   restoring a dat
1e180 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
1e190 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20  backup API from 
1e1a0 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20  a zero-length.  
1e1b0 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20    ** source..   
1e1c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c   */.    if( pFil
1e1d0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
1e1e0 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a   && nByte==0 ){.
1e1f0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1e200 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a  nsCntrChng = 1;.
1e210 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69      }.#endif..#i
1e220 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1e230 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20  P_SIZE>0.    /* 
1e240 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  If the file was 
1e250 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20 74  just truncated t
1e260 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72  o a size smaller
1e270 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
1e280 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65  tly.    ** mappe
1e290 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65  d region, reduce
1e2a0 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 6d   the effective m
1e2b0 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77  apping size as w
1e2c0 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c  ell. SQLite will
1e2d0 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61 64  .    ** use read
1e2e0 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20 74  () and write() t
1e2f0 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62 65  o access data be
1e300 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20  yond this point 
1e310 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20  from now on.  . 
1e320 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42     */.    if( nB
1e330 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte<pFile->mmapS
1e340 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46 69  ize ){.      pFi
1e350 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e  le->mmapSize = n
1e360 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  Byte;.    }.#end
1e370 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
1e380 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
1e390 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
1e3a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
1e3b0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
1e3c0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
1e3d0 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
1e3e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1e3f0 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
1e400 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
1e410 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
1e420 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
1e430 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69   = osFstat(((uni
1e440 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26  xFile*)id)->h, &
1e450 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  buf);.  Simulate
1e460 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
1e470 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
1e480 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1e490 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
1e4a0 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65  , errno);.    re
1e4b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e4c0 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a  R_FSTAT;.  }.  *
1e4d0 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73  pSize = buf.st_s
1e4e0 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20  ize;..  /* When 
1e4f0 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73  opening a zero-s
1e500 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74 68  ize database, th
1e510 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  e findInodeInfo(
1e520 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a  ) procedure.  **
1e530 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65   writes a single
1e540 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20   byte into that 
1e550 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
1e560 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62   work around a b
1e570 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f  ug.  ** in the O
1e580 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79  S-X msdos filesy
1e590 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20  stem.  In order 
1e5a0 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  to avoid problem
1e5b0 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a  s with upper.  *
1e5c0 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65  * layers, we nee
1e5d0 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73  d to report this
1e5e0 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65   file size as ze
1e5f0 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69  ro even though i
1e600 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79  t is.  ** really
1e610 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32   1.   Ticket #32
1e620 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a  60..  */.  if( *
1e630 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a  pSize==1 ) *pSiz
1e640 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72  e = 0;...  retur
1e650 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e660 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1e670 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
1e680 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
1e690 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64  LE__)./*.** Hand
1e6a0 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f  ler for proxy-lo
1e6b0 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72  cking file-contr
1e6c0 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e  ol verbs.  Defin
1e6d0 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a  ed below in the.
1e6e0 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b  ** proxying lock
1e6f0 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f  ing division..*/
1e700 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
1e710 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
1e720 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76  ite3_file*,int,v
1e730 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  oid*);.#endif../
1e740 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
1e750 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1e760 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49   handle the SQLI
1e770 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
1e780 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74  NT .** file-cont
1e790 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  rol operation.  
1e7a0 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74 61  Enlarge the data
1e7b0 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69  base to nBytes i
1e7c0 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64  n size.** (round
1e7d0 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78  ed up to the nex
1e7e0 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20  t chunk-size).  
1e7f0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
1e800 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42  is already.** nB
1e810 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20  ytes or larger, 
1e820 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e830 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1e840 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65  ic int fcntlSize
1e850 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70  Hint(unixFile *p
1e860 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29  File, i64 nByte)
1e870 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  {.  if( pFile->s
1e880 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  zChunk>0 ){.    
1e890 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  i64 nSize;      
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8b0 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   Required file s
1e8c0 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
1e8d0 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20 20  t stat buf;     
1e8e0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
1e8f0 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20   to hold return 
1e900 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28  values of fstat(
1e910 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28  ) */.   .    if(
1e920 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
1e930 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
1e940 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e950 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
1e960 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   }..    nSize = 
1e970 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73  ((nByte+pFile->s
1e980 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c  zChunk-1) / pFil
1e990 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46  e->szChunk) * pF
1e9a0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20  ile->szChunk;.  
1e9b0 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34    if( nSize>(i64
1e9c0 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a  )buf.st_size ){.
1e9d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
1e9e0 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
1e9f0 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
1ea00 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20  _FALLOCATE.     
1ea10 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c   /* The code bel
1ea20 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74  ow is handling t
1ea30 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
1ea40 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29  of osFallocate()
1ea50 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65   .      ** corre
1ea60 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c  ctly. posix_fall
1ea70 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69 6e  ocate() is defin
1ea80 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a  ed to "returns z
1ea90 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  ero on success, 
1eaa0 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20  .      ** or an 
1eab0 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20  error number on 
1eac0 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74   failure". See t
1ead0 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64  he manpage for d
1eae0 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20  etails. */.     
1eaf0 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20   int err;.      
1eb00 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20  do{.        err 
1eb10 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46  = osFallocate(pF
1eb20 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73  ile->h, buf.st_s
1eb30 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73  ize, nSize-buf.s
1eb40 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  t_size);.      }
1eb50 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54  while( err==EINT
1eb60 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65  R );.      if( e
1eb70 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  rr ) return SQLI
1eb80 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1eb90 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49  #else.      /* I
1eba0 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f  f the OS does no
1ebb0 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c  t have posix_fal
1ebc0 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69  locate(), fake i
1ebd0 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20 20  t. Write a .    
1ebe0 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65    ** single byte
1ebf0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   to the last byt
1ec00 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20  e in each block 
1ec10 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72  that falls entir
1ec20 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74  ely.      ** wit
1ec30 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64  hin the extended
1ec40 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69   region. Then, i
1ec50 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73 69  f required, a si
1ec60 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20  ngle byte.      
1ec70 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53  ** at offset (nS
1ec80 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74  ize-1), to set t
1ec90 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1eca0 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20  ile correctly.. 
1ecb0 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1ecc0 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69  a similar techni
1ecd0 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65 64  que to that used
1ece0 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73   by glibc on sys
1ecf0 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68  tems.      ** th
1ed00 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61  at do not have a
1ed10 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28   real fallocate(
1ed20 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f  ) call..      */
1ed30 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20  .      int nBlk 
1ed40 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65  = buf.st_blksize
1ed50 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65  ;  /* File-syste
1ed60 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a  m block size */.
1ed70 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65        int nWrite
1ed80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1ed90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1eda0 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79 20  ytes written by 
1edb0 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1edc0 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74 65        i64 iWrite
1edd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ede0 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74    /* Next offset
1edf0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
1ee00 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
1ee10 28 62 75 66 2e 73 74 5f 73 69 7a 65 2f 6e 42 6c  (buf.st_size/nBl
1ee20 6b 29 2a 6e 42 6c 6b 20 2b 20 6e 42 6c 6b 20 2d  k)*nBlk + nBlk -
1ee30 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
1ee40 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74  ( iWrite>=buf.st
1ee50 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  _size );.      a
1ee60 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65 2b  ssert( ((iWrite+
1ee70 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20  1)%nBlk)==0 );. 
1ee80 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70       for(/*no-op
1ee90 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  */; iWrite<nSize
1eea0 2b 6e 42 6c 6b 2d 31 3b 20 69 57 72 69 74 65 2b  +nBlk-1; iWrite+
1eeb0 3d 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20  =nBlk ){.       
1eec0 20 69 66 28 20 69 57 72 69 74 65 3e 3d 6e 53 69   if( iWrite>=nSi
1eed0 7a 65 20 29 20 69 57 72 69 74 65 20 3d 20 6e 53  ze ) iWrite = nS
1eee0 69 7a 65 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  ize - 1;.       
1eef0 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e   nWrite = seekAn
1ef00 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57  dWrite(pFile, iW
1ef10 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20  rite, "", 1);.  
1ef20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
1ef30 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
1ef40 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1ef50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1ef60 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53      }.  }..#if S
1ef70 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1ef80 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c  IZE>0.  if( pFil
1ef90 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  e->mmapSizeMax>0
1efa0 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d   && nByte>pFile-
1efb0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1efc0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28   int rc;.    if(
1efd0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c   pFile->szChunk<
1efe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1eff0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
1f000 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
1f010 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
1f020 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
1f030 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
1f040 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
1f050 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
1f060 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
1f070 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
1f080 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
1f090 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  }.    }..    rc 
1f0a0 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46  = unixMapfile(pF
1f0b0 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ile, nByte);.   
1f0c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f0d0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
1f0e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1f0f0 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69 73  *.** If *pArg is
1f100 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61 74   initially negat
1f110 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69 73  ive then this is
1f120 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20 2a   a query.  Set *
1f130 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20  pArg to.** 1 or 
1f140 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  0 depending on w
1f150 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62 69  hether or not bi
1f160 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d  t mask of pFile-
1f170 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73 65  >ctrlFlags is se
1f180 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72  t..**.** If *pAr
1f190 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68 65  g is 0 or 1, the
1f1a0 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20 74  n clear or set t
1f1b0 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20 70  he mask bit of p
1f1c0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e  File->ctrlFlags.
1f1d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1f1e0 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69 78  unixModeBit(unix
1f1f0 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73  File *pFile, uns
1f200 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b 2c  igned char mask,
1f210 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20 69   int *pArg){.  i
1f220 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20  f( *pArg<0 ){.  
1f230 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c 65    *pArg = (pFile
1f240 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d 61  ->ctrlFlags & ma
1f250 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20  sk)!=0;.  }else 
1f260 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20 29  if( (*pArg)==0 )
1f270 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
1f280 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b  lFlags &= ~mask;
1f290 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
1f2a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
1f2b0 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  = mask;.  }.}../
1f2c0 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72  * Forward declar
1f2d0 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1f2e0 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  int unixGetTempn
1f2f0 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68  ame(int nBuf, ch
1f300 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 23 69 66 64  ar *zBuf);..#ifd
1f310 65 66 20 53 51 4c 49 54 45 5f 53 45 52 56 45 52  ef SQLITE_SERVER
1f320 5f 45 44 49 54 49 4f 4e 0a 0a 2f 2a 0a 2a 2a 20  _EDITION../*.** 
1f330 53 74 72 75 63 74 75 72 65 20 70 61 73 73 65 64  Structure passed
1f340 20 62 79 20 53 51 4c 69 74 65 20 74 68 72 6f 75   by SQLite throu
1f350 67 68 20 74 68 65 20 28 76 6f 69 64 2a 29 20 61  gh the (void*) a
1f360 72 67 75 6d 65 6e 74 20 74 6f 20 76 61 72 69 6f  rgument to vario
1f370 75 73 20 0a 2a 2a 20 66 63 6e 74 6c 20 6f 70 65  us .** fcntl ope
1f380 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 72 75  rations..*/.stru
1f390 63 74 20 55 6e 69 78 53 65 72 76 65 72 41 72 67  ct UnixServerArg
1f3a0 20 7b 0a 20 20 76 6f 69 64 20 2a 68 3b 20 20 20   {.  void *h;   
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
1f3d0 72 6f 6d 20 53 48 4d 4f 50 45 4e 20 2a 2f 0a 20  rom SHMOPEN */. 
1f3e0 20 76 6f 69 64 20 2a 70 3b 20 20 20 20 20 20 20   void *p;       
1f3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f400 20 2f 2a 20 4d 61 70 70 69 6e 67 20 2a 2f 0a 20   /* Mapping */. 
1f410 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20   int i1;        
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 2f 2a 20 49 6e 74 65 67 65 72 20 76 61 6c 75   /* Integer valu
1f440 65 20 31 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b  e 1 */.  int i2;
1f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f460 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
1f470 67 65 72 20 76 61 6c 75 65 20 32 20 2a 2f 0a 7d  ger value 2 */.}
1f480 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
1f490 20 55 6e 69 78 53 65 72 76 65 72 41 72 67 20 55   UnixServerArg U
1f4a0 6e 69 78 53 65 72 76 65 72 41 72 67 3b 0a 0a 2f  nixServerArg;../
1f4b0 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75  *.** Structure u
1f4c0 73 65 64 20 61 73 20 61 20 73 65 72 76 65 72 2d  sed as a server-
1f4d0 73 68 6d 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  shm handle..*/.s
1f4e0 74 72 75 63 74 20 55 6e 69 78 53 65 72 76 65 72  truct UnixServer
1f4f0 53 68 6d 20 7b 0a 20 20 76 6f 69 64 20 2a 70 4d  Shm {.  void *pM
1f500 61 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ap;             
1f510 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
1f520 65 72 20 74 6f 20 6d 61 70 70 69 6e 67 20 2a 2f  er to mapping */
1f530 0a 20 20 69 6e 74 20 6e 4d 61 70 3b 20 20 20 20  .  int nMap;    
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
1f560 70 70 69 6e 67 20 69 6e 20 62 79 74 65 73 20 2a  pping in bytes *
1f570 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
1f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f590 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
1f5a0 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 2a  riptor open on *
1f5b0 2d 68 6d 61 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a  -hma file */.};.
1f5c0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 55  typedef struct U
1f5d0 6e 69 78 53 65 72 76 65 72 53 68 6d 20 55 6e 69  nixServerShm Uni
1f5e0 78 53 65 72 76 65 72 53 68 6d 3b 0a 0a 2f 2a 0a  xServerShm;../*.
1f5f0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
1f600 6e 20 6f 66 20 53 51 4c 49 54 45 5f 46 43 4e 54  n of SQLITE_FCNT
1f610 4c 5f 46 49 4c 45 49 44 0a 2a 2f 0a 73 74 61 74  L_FILEID.*/.stat
1f620 69 63 20 69 6e 74 20 75 6e 69 78 46 63 6e 74 6c  ic int unixFcntl
1f630 53 65 72 76 65 72 46 69 6c 65 69 64 28 75 6e 69  ServerFileid(uni
1f640 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 76 6f  xFile *pFile, vo
1f650 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 36 34  id *pArg){.  i64
1f660 20 2a 61 49 64 20 3d 20 28 69 36 34 2a 29 70 41   *aId = (i64*)pA
1f670 72 67 3b 0a 20 20 61 49 64 5b 30 5d 20 3d 20 28  rg;.  aId[0] = (
1f680 69 36 34 29 28 70 46 69 6c 65 2d 3e 70 49 6e 6f  i64)(pFile->pIno
1f690 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 29 3b  de->fileId.dev);
1f6a0 0a 20 20 61 49 64 5b 31 5d 20 3d 20 28 69 36 34  .  aId[1] = (i64
1f6b0 29 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  )(pFile->pInode-
1f6c0 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 20 20  >fileId.ino);.  
1f6d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f6e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
1f6f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c  mentation of SQL
1f700 49 54 45 5f 46 43 4e 54 4c 5f 53 45 52 56 45 52  ITE_FCNTL_SERVER
1f710 5f 4d 4f 44 45 0a 2a 2f 0a 73 74 61 74 69 63 20  _MODE.*/.static 
1f720 69 6e 74 20 75 6e 69 78 46 63 6e 74 6c 53 65 72  int unixFcntlSer
1f730 76 65 72 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65  verMode(unixFile
1f740 20 2a 70 46 69 6c 65 2c 20 76 6f 69 64 20 2a 70   *pFile, void *p
1f750 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
1f760 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
1f770 74 20 65 53 65 72 76 65 72 20 3d 20 30 3b 0a 20  t eServer = 0;. 
1f780 20 63 68 61 72 20 2a 7a 4a 72 6e 6c 20 3d 20 73   char *zJrnl = s
1f790 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1f7a0 25 73 2d 6a 6f 75 72 6e 61 6c 22 2c 20 70 46 69  %s-journal", pFi
1f7b0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 69 66  le->zPath);.  if
1f7c0 28 20 7a 4a 72 6e 6c 3d 3d 30 20 29 7b 0a 20 20  ( zJrnl==0 ){.  
1f7d0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
1f7e0 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  MEM;.  }else{.  
1f7f0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
1f800 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  f;        /* Use
1f810 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e  d to hold return
1f820 20 76 61 6c 75 65 73 20 6f 66 20 73 74 61 74 28   values of stat(
1f830 29 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 53  ) */.    if( osS
1f840 74 61 74 28 7a 4a 72 6e 6c 2c 20 26 62 75 66 29  tat(zJrnl, &buf)
1f850 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1f860 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1f870 54 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  T;.    }else if(
1f880 20 62 75 66 2e 73 74 5f 6d 6f 64 65 20 26 20 53   buf.st_mode & S
1f890 5f 49 46 44 49 52 20 29 7b 0a 20 20 20 20 20 20  _IFDIR ){.      
1f8a0 65 53 65 72 76 65 72 20 3d 20 28 70 46 69 6c 65  eServer = (pFile
1f8b0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
1f8c0 49 58 46 49 4c 45 5f 45 58 43 4c 29 20 3f 20 31  IXFILE_EXCL) ? 1
1f8d0 20 3a 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   : 2;.    }.  }.
1f8e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1f8f0 4a 72 6e 6c 29 3b 0a 20 20 2a 28 28 69 6e 74 2a  Jrnl);.  *((int*
1f900 29 70 41 72 67 29 20 3d 20 65 53 65 72 76 65 72  )pArg) = eServer
1f910 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1f920 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
1f930 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 49 54 45  tation of SQLITE
1f940 5f 46 43 4e 54 4c 5f 53 45 52 56 45 52 5f 53 48  _FCNTL_SERVER_SH
1f950 4d 4f 50 45 4e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  MOPEN..**.** The
1f960 20 28 76 6f 69 64 2a 29 20 61 72 67 75 6d 65 6e   (void*) argumen
1f970 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1f980 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 73 68   file control sh
1f990 6f 75 6c 64 20 61 63 74 75 61 6c 6c 79 20 62 65  ould actually be
1f9a0 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
1f9b0 20 61 20 55 6e 69 78 53 65 72 76 65 72 41 72 67   a UnixServerArg
1f9c0 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 73   or equivalent s
1f9d0 74 72 75 63 74 75 72 65 2e 20 41 72 67 75 6d 65  tructure. Argume
1f9e0 6e 74 73 20 61 72 65 0a 2a 2a 20 69 6e 74 65 72  nts are.** inter
1f9f0 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77  preted as follow
1fa00 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 55 6e 69 78 53  s:.**.**   UnixS
1fa10 65 72 76 65 72 41 72 67 2e 68 20 20 2d 20 4f 55  erverArg.h  - OU
1fa20 54 3a 20 4e 65 77 20 73 65 72 76 65 72 20 73 68  T: New server sh
1fa30 6d 20 68 61 6e 64 6c 65 2e 0a 2a 2a 20 20 20 55  m handle..**   U
1fa40 6e 69 78 53 65 72 76 65 72 41 72 67 2e 70 20 20  nixServerArg.p  
1fa50 2d 20 4f 55 54 3a 20 4e 65 77 20 73 65 72 76 65  - OUT: New serve
1fa60 72 20 73 68 6d 20 6d 61 70 70 69 6e 67 2e 0a 2a  r shm mapping..*
1fa70 2a 20 20 20 55 6e 69 78 53 65 72 76 65 72 41 72  *   UnixServerAr
1fa80 67 2e 69 31 20 2d 20 53 69 7a 65 20 6f 66 20 72  g.i1 - Size of r
1fa90 65 71 75 65 73 74 65 64 20 6d 61 70 70 69 6e 67  equested mapping
1faa0 20 69 6e 20 62 79 74 65 73 2e 0a 2a 2a 20 20 20   in bytes..**   
1fab0 55 6e 69 78 53 65 72 76 65 72 41 72 67 2e 69 32  UnixServerArg.i2
1fac0 20 2d 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20   - OUT: True if 
1fad0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1fae0 20 2b 20 53 48 4d 4f 50 45 4e 32 20 61 72 65 20   + SHMOPEN2 are 
1faf0 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
1fb00 74 69 63 20 69 6e 74 20 75 6e 69 78 46 63 6e 74  tic int unixFcnt
1fb10 6c 53 65 72 76 65 72 53 68 6d 6f 70 65 6e 28 75  lServerShmopen(u
1fb20 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 76 6f  nixFile *pFd, vo
1fb30 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
1fb40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1fb50 0a 20 20 55 6e 69 78 53 65 72 76 65 72 41 72 67  .  UnixServerArg
1fb60 20 2a 70 53 41 72 67 20 3d 20 28 55 6e 69 78 53   *pSArg = (UnixS
1fb70 65 72 76 65 72 41 72 67 2a 29 70 41 72 67 3b 0a  erverArg*)pArg;.
1fb80 20 20 55 6e 69 78 53 65 72 76 65 72 53 68 6d 20    UnixServerShm 
1fb90 2a 70 3b 0a 20 20 63 68 61 72 20 2a 7a 48 6d 61  *p;.  char *zHma
1fba0 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ;..  p = sqlite3
1fbb0 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 55  _malloc(sizeof(U
1fbc0 6e 69 78 53 65 72 76 65 72 53 68 6d 29 29 3b 0a  nixServerShm));.
1fbd0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1fbe0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1fbf0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
1fc00 20 73 69 7a 65 6f 66 28 55 6e 69 78 53 65 72 76   sizeof(UnixServ
1fc10 65 72 53 68 6d 29 29 3b 0a 20 20 70 2d 3e 66 64  erShm));.  p->fd
1fc20 20 3d 20 2d 31 3b 0a 0a 20 20 7a 48 6d 61 20 3d   = -1;..  zHma =
1fc30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1fc40 28 22 25 73 2d 6a 6f 75 72 6e 61 6c 2f 68 6d 61  ("%s-journal/hma
1fc50 22 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  ", pFd->zPath);.
1fc60 20 20 69 66 28 20 7a 48 6d 61 3d 3d 30 20 29 7b    if( zHma==0 ){
1fc70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1fc80 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b  _NOMEM;.  }else{
1fc90 0a 20 20 20 20 70 2d 3e 66 64 20 3d 20 6f 73 4f  .    p->fd = osO
1fca0 70 65 6e 28 7a 48 6d 61 2c 20 4f 5f 52 44 57 52  pen(zHma, O_RDWR
1fcb0 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
1fcc0 0a 20 20 20 20 70 2d 3e 6e 4d 61 70 20 3d 20 70  .    p->nMap = p
1fcd0 53 41 72 67 2d 3e 69 31 3b 0a 0a 20 20 20 20 69  SArg->i1;..    i
1fce0 66 28 20 70 2d 3e 66 64 3c 30 20 29 7b 0a 20 20  f( p->fd<0 ){.  
1fcf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fd00 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
1fd10 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
1fd20 65 73 20 3d 20 66 74 72 75 6e 63 61 74 65 28 70  es = ftruncate(p
1fd30 2d 3e 66 64 2c 20 70 2d 3e 6e 4d 61 70 29 3b 0a  ->fd, p->nMap);.
1fd40 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d 30        if( res!=0
1fd50 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1fd60 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52   SQLITE_IOERR_TR
1fd70 55 4e 43 41 54 45 3b 0a 20 20 20 20 20 20 7d 65  UNCATE;.      }e
1fd80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
1fd90 70 4d 61 70 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pMap = osMmap(0,
1fda0 20 70 2d 3e 6e 4d 61 70 2c 20 50 52 4f 54 5f 52   p->nMap, PROT_R
1fdb0 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
1fdc0 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 2d 3e 66  MAP_SHARED, p->f
1fdd0 64 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  d,0);.        if
1fde0 28 20 70 2d 3e 70 4d 61 70 3d 3d 30 20 29 7b 0a  ( p->pMap==0 ){.
1fdf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1fe00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50  QLITE_IOERR_MMAP
1fe10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1fe20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1fe30 6c 69 74 65 33 5f 66 72 65 65 28 7a 48 6d 61 29  lite3_free(zHma)
1fe40 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  ;.  }..  if( rc=
1fe50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fe60 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 73    int res;.    s
1fe70 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
1fe80 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c 6f  ;.    memset(&lo
1fe90 63 6b 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74  ck, 0, sizeof(st
1fea0 72 75 63 74 20 66 6c 6f 63 6b 29 29 3b 0a 20 20  ruct flock));.  
1feb0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
1fec0 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63  F_WRLCK;.    loc
1fed0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
1fee0 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
1fef0 6c 5f 73 74 61 72 74 20 3d 20 70 2d 3e 6e 4d 61  l_start = p->nMa
1ff00 70 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  p;.    lock.l_le
1ff10 6e 20 3d 20 31 3b 0a 0a 20 20 20 20 72 65 73 20  n = 1;..    res 
1ff20 3d 20 6f 73 46 63 6e 74 6c 28 70 2d 3e 66 64 2c  = osFcntl(p->fd,
1ff30 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29   F_SETLK, &lock)
1ff40 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30  ;.    if( res==0
1ff50 20 29 7b 0a 20 20 20 20 20 20 70 53 41 72 67 2d   ){.      pSArg-
1ff60 3e 69 32 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  >i2 = 1;.      m
1ff70 65 6d 73 65 74 28 70 2d 3e 70 4d 61 70 2c 20 30  emset(p->pMap, 0
1ff80 2c 20 70 2d 3e 6e 4d 61 70 29 3b 0a 20 20 20 20  , p->nMap);.    
1ff90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 41  }else{.      pSA
1ffa0 72 67 2d 3e 69 32 20 3d 20 30 3b 0a 20 20 20 20  rg->i2 = 0;.    
1ffb0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
1ffc0 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 72  F_RDLCK;.      r
1ffd0 65 73 20 3d 20 6f 73 46 63 6e 74 6c 28 70 2d 3e  es = osFcntl(p->
1ffe0 66 64 2c 20 46 5f 53 45 54 4c 4b 57 2c 20 26 6c  fd, F_SETLKW, &l
1fff0 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
20000 72 65 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  res!=0 ){.      
20010 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
20020 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  ERR_LOCK;.      
20030 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
20040 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20050 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70   ){.    if( p->p
20060 4d 61 70 20 29 20 6f 73 4d 75 6e 6d 61 70 28 70  Map ) osMunmap(p
20070 2d 3e 70 4d 61 70 2c 20 70 2d 3e 6e 4d 61 70 29  ->pMap, p->nMap)
20080 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 66 64 3e  ;.    if( p->fd>
20090 3d 30 20 29 20 63 6c 6f 73 65 28 70 2d 3e 66 64  =0 ) close(p->fd
200a0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
200b0 72 65 65 28 70 29 3b 0a 20 20 20 20 70 53 41 72  ree(p);.    pSAr
200c0 67 2d 3e 68 20 3d 20 70 53 41 72 67 2d 3e 70 20  g->h = pSArg->p 
200d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
200e0 20 20 70 53 41 72 67 2d 3e 68 20 3d 20 28 76 6f    pSArg->h = (vo
200f0 69 64 2a 29 70 3b 0a 20 20 20 20 70 53 41 72 67  id*)p;.    pSArg
20100 2d 3e 70 20 3d 20 28 76 6f 69 64 2a 29 28 70 2d  ->p = (void*)(p-
20110 3e 70 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72  >pMap);.  }..  r
20120 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20130 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
20140 6e 20 6f 66 20 53 51 4c 49 54 45 5f 46 43 4e 54  n of SQLITE_FCNT
20150 4c 5f 53 45 52 56 45 52 5f 53 48 4d 4f 50 45 4e  L_SERVER_SHMOPEN
20160 32 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 28 76 6f  2..**.** The (vo
20170 69 64 2a 29 20 61 72 67 75 6d 65 6e 74 20 70 61  id*) argument pa
20180 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 69 6c  ssed to this fil
20190 65 20 63 6f 6e 74 72 6f 6c 20 73 68 6f 75 6c 64  e control should
201a0 20 61 63 74 75 61 6c 6c 79 20 62 65 0a 2a 2a 20   actually be.** 
201b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 55  a pointer to a U
201c0 6e 69 78 53 65 72 76 65 72 41 72 67 20 6f 72 20  nixServerArg or 
201d0 65 71 75 69 76 61 6c 65 6e 74 20 73 74 72 75 63  equivalent struc
201e0 74 75 72 65 2e 20 41 72 67 75 6d 65 6e 74 73 20  ture. Arguments 
201f0 61 72 65 0a 2a 2a 20 69 6e 74 65 72 70 72 65 74  are.** interpret
20200 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
20210 2a 0a 2a 2a 20 20 20 55 6e 69 78 53 65 72 76 65  *.**   UnixServe
20220 72 41 72 67 2e 68 20 20 2d 20 53 65 72 76 65 72  rArg.h  - Server
20230 20 73 68 6d 20 68 61 6e 64 6c 65 20 28 66 72 6f   shm handle (fro
20240 6d 20 53 48 4d 4f 50 45 4e 29 2e 0a 2a 2a 20 20  m SHMOPEN)..**  
20250 20 55 6e 69 78 53 65 72 76 65 72 41 72 67 2e 70   UnixServerArg.p
20260 20 20 2d 20 75 6e 75 73 65 64 2e 0a 2a 2a 20 20    - unused..**  
20270 20 55 6e 69 78 53 65 72 76 65 72 41 72 67 2e 69   UnixServerArg.i
20280 31 20 2d 20 75 6e 75 73 65 64 2e 0a 2a 2a 20 20  1 - unused..**  
20290 20 55 6e 69 78 53 65 72 76 65 72 41 72 67 2e 69   UnixServerArg.i
202a0 32 20 2d 20 75 6e 75 73 65 64 2e 0a 2a 2f 0a 73  2 - unused..*/.s
202b0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 63  tatic int unixFc
202c0 6e 74 6c 53 65 72 76 65 72 53 68 6d 6f 70 65 6e  ntlServerShmopen
202d0 32 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  2(unixFile *pFd,
202e0 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
202f0 55 6e 69 78 53 65 72 76 65 72 41 72 67 20 2a 70  UnixServerArg *p
20300 53 41 72 67 20 3d 20 28 55 6e 69 78 53 65 72 76  SArg = (UnixServ
20310 65 72 41 72 67 2a 29 70 41 72 67 3b 0a 20 20 55  erArg*)pArg;.  U
20320 6e 69 78 53 65 72 76 65 72 53 68 6d 20 2a 70 20  nixServerShm *p 
20330 3d 20 28 55 6e 69 78 53 65 72 76 65 72 53 68 6d  = (UnixServerShm
20340 2a 29 70 53 41 72 67 2d 3e 68 3b 0a 20 20 69 6e  *)pSArg->h;.  in
20350 74 20 72 65 73 3b 0a 20 20 73 74 72 75 63 74 20  t res;.  struct 
20360 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 0a 20 20 6d  flock lock;..  m
20370 65 6d 73 65 74 28 26 6c 6f 63 6b 2c 20 30 2c 20  emset(&lock, 0, 
20380 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 66 6c  sizeof(struct fl
20390 6f 63 6b 29 29 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f  ock));.  lock.l_
203a0 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
203b0 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
203c0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
203d0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 70 2d 3e  ck.l_start = p->
203e0 6e 4d 61 70 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  nMap;.  lock.l_l
203f0 65 6e 20 3d 20 31 3b 0a 20 20 72 65 73 20 3d 20  en = 1;.  res = 
20400 6f 73 46 63 6e 74 6c 28 70 2d 3e 66 64 2c 20 46  osFcntl(p->fd, F
20410 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
20420 0a 20 20 72 65 74 75 72 6e 20 72 65 73 20 3f 20  .  return res ? 
20430 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
20440 4b 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  K : SQLITE_OK;.}
20450 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
20460 74 61 74 69 6f 6e 20 6f 66 20 53 51 4c 49 54 45  tation of SQLITE
20470 5f 46 43 4e 54 4c 5f 53 45 52 56 45 52 5f 53 48  _FCNTL_SERVER_SH
20480 4d 43 4c 4f 53 45 2e 0a 2a 2a 0a 2a 2a 20 54 68  MCLOSE..**.** Th
20490 65 20 28 76 6f 69 64 2a 29 20 61 72 67 75 6d 65  e (void*) argume
204a0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
204b0 73 20 66 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 73  s file control s
204c0 68 6f 75 6c 64 20 61 63 74 75 61 6c 6c 79 20 62  hould actually b
204d0 65 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  e.** a pointer t
204e0 6f 20 61 20 55 6e 69 78 53 65 72 76 65 72 41 72  o a UnixServerAr
204f0 67 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  g or equivalent 
20500 73 74 72 75 63 74 75 72 65 2e 20 41 72 67 75 6d  structure. Argum
20510 65 6e 74 73 20 61 72 65 0a 2a 2a 20 69 6e 74 65  ents are.** inte
20520 72 70 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f  rpreted as follo
20530 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 55 6e 69 78  ws:.**.**   Unix
20540 53 65 72 76 65 72 41 72 67 2e 68 20 20 2d 20 53  ServerArg.h  - S
20550 65 72 76 65 72 20 73 68 6d 20 68 61 6e 64 6c 65  erver shm handle
20560 20 28 66 72 6f 6d 20 53 48 4d 4f 50 45 4e 29 2e   (from SHMOPEN).
20570 0a 2a 2a 20 20 20 55 6e 69 78 53 65 72 76 65 72  .**   UnixServer
20580 41 72 67 2e 70 20 20 2d 20 75 6e 75 73 65 64 2e  Arg.p  - unused.
20590 0a 2a 2a 20 20 20 55 6e 69 78 53 65 72 76 65 72  .**   UnixServer
205a0 41 72 67 2e 69 31 20 2d 20 75 6e 75 73 65 64 2e  Arg.i1 - unused.
205b0 0a 2a 2a 20 20 20 55 6e 69 78 53 65 72 76 65 72  .**   UnixServer
205c0 41 72 67 2e 69 32 20 2d 20 75 6e 75 73 65 64 2e  Arg.i2 - unused.
205d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
205e0 6e 69 78 46 63 6e 74 6c 53 65 72 76 65 72 53 68  nixFcntlServerSh
205f0 6d 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  mclose(unixFile 
20600 2a 70 46 64 2c 20 76 6f 69 64 20 2a 70 41 72 67  *pFd, void *pArg
20610 29 7b 0a 20 20 55 6e 69 78 53 65 72 76 65 72 41  ){.  UnixServerA
20620 72 67 20 2a 70 53 41 72 67 20 3d 20 28 55 6e 69  rg *pSArg = (Uni
20630 78 53 65 72 76 65 72 41 72 67 2a 29 70 41 72 67  xServerArg*)pArg
20640 3b 0a 20 20 55 6e 69 78 53 65 72 76 65 72 53 68  ;.  UnixServerSh
20650 6d 20 2a 70 20 3d 20 28 55 6e 69 78 53 65 72 76  m *p = (UnixServ
20660 65 72 53 68 6d 2a 29 70 53 41 72 67 2d 3e 68 3b  erShm*)pSArg->h;
20670 0a 0a 20 20 69 66 28 20 70 2d 3e 70 4d 61 70 20  ..  if( p->pMap 
20680 29 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 70 4d  ) osMunmap(p->pM
20690 61 70 2c 20 70 2d 3e 6e 4d 61 70 29 3b 0a 20 20  ap, p->nMap);.  
206a0 69 66 28 20 70 2d 3e 66 64 3e 3d 30 20 29 20 63  if( p->fd>=0 ) c
206b0 6c 6f 73 65 28 70 2d 3e 66 64 29 3b 0a 20 20 73  lose(p->fd);.  s
206c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
206d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
206e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  _OK;.}../*.** Im
206f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20700 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 52  SQLITE_FCNTL_SER
20710 56 45 52 5f 53 48 4d 4c 4f 43 4b 2e 0a 2a 2a 0a  VER_SHMLOCK..**.
20720 2a 2a 20 54 68 65 20 28 76 6f 69 64 2a 29 20 61  ** The (void*) a
20730 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
20740 6f 20 74 68 69 73 20 66 69 6c 65 20 63 6f 6e 74  o this file cont
20750 72 6f 6c 20 73 68 6f 75 6c 64 20 61 63 74 75 61  rol should actua
20760 6c 6c 79 20 62 65 0a 2a 2a 20 61 20 70 6f 69 6e  lly be.** a poin
20770 74 65 72 20 74 6f 20 61 20 55 6e 69 78 53 65 72  ter to a UnixSer
20780 76 65 72 41 72 67 20 6f 72 20 65 71 75 69 76 61  verArg or equiva
20790 6c 65 6e 74 20 73 74 72 75 63 74 75 72 65 2e 20  lent structure. 
207a0 41 72 67 75 6d 65 6e 74 73 20 61 72 65 0a 2a 2a  Arguments are.**
207b0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
207c0 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
207d0 20 55 6e 69 78 53 65 72 76 65 72 41 72 67 2e 68   UnixServerArg.h
207e0 20 20 2d 20 53 65 72 76 65 72 20 73 68 6d 20 68    - Server shm h
207f0 61 6e 64 6c 65 20 28 66 72 6f 6d 20 53 48 4d 4f  andle (from SHMO
20800 50 45 4e 29 2e 0a 2a 2a 20 20 20 55 6e 69 78 53  PEN)..**   UnixS
20810 65 72 76 65 72 41 72 67 2e 70 20 20 2d 20 75 6e  erverArg.p  - un
20820 75 73 65 64 2e 0a 2a 2a 20 20 20 55 6e 69 78 53  used..**   UnixS
20830 65 72 76 65 72 41 72 67 2e 69 31 20 2d 20 73 6c  erverArg.i1 - sl
20840 6f 74 20 74 6f 20 6c 6f 63 6b 2e 0a 2a 2a 20 20  ot to lock..**  
20850 20 55 6e 69 78 53 65 72 76 65 72 41 72 67 2e 69   UnixServerArg.i
20860 32 20 2d 20 74 72 75 65 20 74 6f 20 74 61 6b 65  2 - true to take
20870 20 74 68 65 20 6c 6f 63 6b 2c 20 66 61 6c 73 65   the lock, false
20880 20 74 6f 20 72 65 6c 65 61 73 65 20 69 74 2e 0a   to release it..
20890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
208a0 69 78 46 63 6e 74 6c 53 65 72 76 65 72 53 68 6d  ixFcntlServerShm
208b0 6c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  lock(unixFile *p
208c0 46 64 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  Fd, void *pArg){
208d0 0a 20 20 55 6e 69 78 53 65 72 76 65 72 41 72 67  .  UnixServerArg
208e0 20 2a 70 53 41 72 67 20 3d 20 28 55 6e 69 78 53   *pSArg = (UnixS
208f0 65 72 76 65 72 41 72 67 2a 29 70 41 72 67 3b 0a  erverArg*)pArg;.
20900 20 20 55 6e 69 78 53 65 72 76 65 72 53 68 6d 20    UnixServerShm 
20910 2a 70 20 3d 20 28 55 6e 69 78 53 65 72 76 65 72  *p = (UnixServer
20920 53 68 6d 2a 29 70 53 41 72 67 2d 3e 68 3b 0a 20  Shm*)pSArg->h;. 
20930 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 73 74 72   int res;..  str
20940 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
20950 20 20 6d 65 6d 73 65 74 28 26 6c 6f 63 6b 2c 20    memset(&lock, 
20960 30 2c 20 73 69 7a 65 6f 66 28 73 74 72 75 63 74  0, sizeof(struct
20970 20 66 6c 6f 63 6b 29 29 3b 0a 20 20 6c 6f 63 6b   flock));.  lock
20980 2e 6c 5f 74 79 70 65 20 3d 20 70 53 41 72 67 2d  .l_type = pSArg-
20990 3e 69 32 20 3f 20 46 5f 57 52 4c 43 4b 20 3a 20  >i2 ? F_WRLCK : 
209a0 46 5f 55 4e 4c 43 4b 3b 0a 20 20 6c 6f 63 6b 2e  F_UNLCK;.  lock.
209b0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
209c0 53 45 54 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74  SET;.  lock.l_st
209d0 61 72 74 20 3d 20 70 2d 3e 6e 4d 61 70 20 2b 20  art = p->nMap + 
209e0 70 53 41 72 67 2d 3e 69 31 20 2b 20 31 3b 0a 20  pSArg->i1 + 1;. 
209f0 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
20a00 0a 0a 20 20 72 65 73 20 3d 20 6f 73 46 63 6e 74  ..  res = osFcnt
20a10 6c 28 70 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b  l(p->fd, F_SETLK
20a20 2c 20 26 6c 6f 63 6b 29 3b 0a 0a 20 20 72 65 74  , &lock);..  ret
20a30 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 53 51  urn (res==0 ? SQ
20a40 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
20a50 5f 42 55 53 59 29 3b 0a 7d 0a 23 65 6e 64 69 66  _BUSY);.}.#endif
20a60 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  ../*.** Informat
20a70 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20  ion and control 
20a80 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  of an open file 
20a90 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
20aa0 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f  c int unixFileCo
20ab0 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69  ntrol(sqlite3_fi
20ac0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20  le *id, int op, 
20ad0 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75  void *pArg){.  u
20ae0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
20af0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
20b00 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
20b10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
20b20 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20 20  ERVER_EDITION.  
20b30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
20b40 4e 54 4c 5f 46 49 4c 45 49 44 3a 0a 20 20 20 20  NTL_FILEID:.    
20b50 20 20 72 65 74 75 72 6e 20 75 6e 69 78 46 63 6e    return unixFcn
20b60 74 6c 53 65 72 76 65 72 46 69 6c 65 69 64 28 70  tlServerFileid(p
20b70 46 69 6c 65 2c 20 70 41 72 67 29 3b 0a 20 20 20  File, pArg);.   
20b80 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
20b90 54 4c 5f 53 45 52 56 45 52 5f 4d 4f 44 45 3a 20  TL_SERVER_MODE: 
20ba0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
20bb0 69 78 46 63 6e 74 6c 53 65 72 76 65 72 4d 6f 64  ixFcntlServerMod
20bc0 65 28 70 46 69 6c 65 2c 20 70 41 72 67 29 3b 0a  e(pFile, pArg);.
20bd0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20be0 46 43 4e 54 4c 5f 53 45 52 56 45 52 5f 53 48 4d  FCNTL_SERVER_SHM
20bf0 4f 50 45 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  OPEN:.      retu
20c00 72 6e 20 75 6e 69 78 46 63 6e 74 6c 53 65 72 76  rn unixFcntlServ
20c10 65 72 53 68 6d 6f 70 65 6e 28 70 46 69 6c 65 2c  erShmopen(pFile,
20c20 20 70 41 72 67 29 3b 0a 20 20 20 20 63 61 73 65   pArg);.    case
20c30 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
20c40 52 56 45 52 5f 53 48 4d 4f 50 45 4e 32 3a 0a 20  RVER_SHMOPEN2:. 
20c50 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78       return unix
20c60 46 63 6e 74 6c 53 65 72 76 65 72 53 68 6d 6f 70  FcntlServerShmop
20c70 65 6e 32 28 70 46 69 6c 65 2c 20 70 41 72 67 29  en2(pFile, pArg)
20c80 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
20c90 45 5f 46 43 4e 54 4c 5f 53 45 52 56 45 52 5f 53  E_FCNTL_SERVER_S
20ca0 48 4d 43 4c 4f 53 45 3a 0a 20 20 20 20 20 20 72  HMCLOSE:.      r
20cb0 65 74 75 72 6e 20 75 6e 69 78 46 63 6e 74 6c 53  eturn unixFcntlS
20cc0 65 72 76 65 72 53 68 6d 63 6c 6f 73 65 28 70 46  erverShmclose(pF
20cd0 69 6c 65 2c 20 70 41 72 67 29 3b 0a 20 20 20 20  ile, pArg);.    
20ce0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
20cf0 4c 5f 53 45 52 56 45 52 5f 53 48 4d 4c 4f 43 4b  L_SERVER_SHMLOCK
20d00 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  :.      return u
20d10 6e 69 78 46 63 6e 74 6c 53 65 72 76 65 72 53 68  nixFcntlServerSh
20d20 6d 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 41 72  mlock(pFile, pAr
20d30 67 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  g);.#endif..#if 
20d40 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f  defined(__linux_
20d50 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  _) && defined(SQ
20d60 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43  LITE_ENABLE_BATC
20d70 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a  H_ATOMIC_WRITE).
20d80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
20d90 46 43 4e 54 4c 5f 42 45 47 49 4e 5f 41 54 4f 4d  FCNTL_BEGIN_ATOM
20da0 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  IC_WRITE: {.    
20db0 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63    int rc = osIoc
20dc0 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46  tl(pFile->h, F2F
20dd0 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41 54 4f 4d  S_IOC_START_ATOM
20de0 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20  IC_WRITE);.     
20df0 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c   return rc ? SQL
20e00 49 54 45 5f 49 4f 45 52 52 5f 42 45 47 49 4e 5f  ITE_IOERR_BEGIN_
20e10 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f  ATOMIC : SQLITE_
20e20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
20e30 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
20e40 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52  COMMIT_ATOMIC_WR
20e50 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ITE: {.      int
20e60 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46   rc = osIoctl(pF
20e70 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43  ile->h, F2FS_IOC
20e80 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57  _COMMIT_ATOMIC_W
20e90 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74  RITE);.      ret
20ea0 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
20eb0 49 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f 41 54 4f  IOERR_COMMIT_ATO
20ec0 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 3b  MIC : SQLITE_OK;
20ed0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
20ee0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 4f 4c  SQLITE_FCNTL_ROL
20ef0 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 5f 57 52 49  LBACK_ATOMIC_WRI
20f00 54 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  TE: {.      int 
20f10 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28 70 46 69  rc = osIoctl(pFi
20f20 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49 4f 43 5f  le->h, F2FS_IOC_
20f30 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57  ABORT_VOLATILE_W
20f40 52 49 54 45 29 3b 0a 20 20 20 20 20 20 72 65 74  RITE);.      ret
20f50 75 72 6e 20 72 63 20 3f 20 53 51 4c 49 54 45 5f  urn rc ? SQLITE_
20f60 49 4f 45 52 52 5f 52 4f 4c 4c 42 41 43 4b 5f 41  IOERR_ROLLBACK_A
20f70 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f 4f  TOMIC : SQLITE_O
20f80 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  K;.    }.#endif 
20f90 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20 26 26 20  /* __linux__ && 
20fa0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41  SQLITE_ENABLE_BA
20fb0 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  TCH_ATOMIC_WRITE
20fc0 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65 20 53 51   */..    case SQ
20fd0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53  LITE_FCNTL_LOCKS
20fe0 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28  TATE: {.      *(
20ff0 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  int*)pArg = pFil
21000 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20  e->eFileLock;.  
21010 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
21020 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
21030 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
21040 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a  L_LAST_ERRNO: {.
21050 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
21060 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  g = pFile->lastE
21070 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
21080 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21090 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
210a0 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
210b0 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46  SIZE: {.      pF
210c0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a  ile->szChunk = *
210d0 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20  (int *)pArg;.   
210e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
210f0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
21100 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
21110 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20  _SIZE_HINT: {.  
21120 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
21130 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
21140 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20  rBenign(1);.    
21150 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65    rc = fcntlSize
21160 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36  Hint(pFile, *(i6
21170 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20  4 *)pArg);.     
21180 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
21190 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20  Benign(0);.     
211a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
211b0 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
211c0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
211d0 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  WAL: {.      uni
211e0 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  xModeBit(pFile, 
211f0 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
21200 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67  _WAL, (int*)pArg
21210 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21220 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
21230 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21240 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45  _FCNTL_POWERSAFE
21250 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20  _OVERWRITE: {.  
21260 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
21270 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
21280 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67  PSOW, (int*)pArg
21290 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
212a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
212b0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
212c0 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20  _FCNTL_VFSNAME: 
212d0 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a  {.      *(char**
212e0 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  )pArg = sqlite3_
212f0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46  mprintf("%s", pF
21300 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65  ile->pVfs->zName
21310 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21320 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
21330 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21340 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e  _FCNTL_TEMPFILEN
21350 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  AME: {.      cha
21360 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69  r *zTFile = sqli
21370 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46  te3_malloc64( pF
21380 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
21390 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69  hname );.      i
213a0 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20  f( zTFile ){.   
213b0 20 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70       unixGetTemp
213c0 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
213d0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
213e0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  File);.        *
213f0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
21400 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
21410 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
21420 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
21430 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
21440 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a  TL_HAS_MOVED: {.
21450 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
21460 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  g = fileHasMoved
21470 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72  (pFile);.      r
21480 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21490 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
214a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 54 4c  LITE_ENABLE_SETL
214b0 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 20 20 63 61  K_TIMEOUT.    ca
214c0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
214d0 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a  LOCK_TIMEOUT: {.
214e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 69 42 75        pFile->iBu
214f0 73 79 54 69 6d 65 6f 75 74 20 3d 20 2a 28 69 6e  syTimeout = *(in
21500 74 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72  t*)pArg;.      r
21510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21520 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
21530 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
21540 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
21550 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
21560 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
21570 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
21580 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
21590 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
215a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
215b0 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
215c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
215d0 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
215e0 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
215f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
21600 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
21610 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61  .      /* The va
21620 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20  lue of newLimit 
21630 6d 61 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  may be eventuall
21640 79 20 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f  y cast to (size_
21650 74 29 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20  t) and passed.  
21660 20 20 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29      ** to mmap()
21670 2e 20 52 65 73 74 72 69 63 74 20 69 74 73 20 76  . Restrict its v
21680 61 6c 75 65 20 74 6f 20 32 47 42 20 69 66 20 28  alue to 2GB if (
21690 73 69 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61  size_t) is not a
216a0 74 20 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20  t least a.      
216b0 2a 2a 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20  ** 64-bit type. 
216c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  */.      if( new
216d0 4c 69 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f  Limit>0 && sizeo
216e0 66 28 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20  f(size_t)<8 ){. 
216f0 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20         newLimit 
21700 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78  = (newLimit & 0x
21710 37 46 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20  7FFFFFFF);.     
21720 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a   }..      *(i64*
21730 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
21740 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
21750 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
21760 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
21770 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
21780 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
21790 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
217a0 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
217b0 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
217c0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
217d0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
217e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e   ){.          un
217f0 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  ixUnmapfile(pFil
21800 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
21810 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
21820 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
21830 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21840 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21850 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
21860 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21870 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
21880 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f  calls this metho
21890 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74  d to signal that
218a0 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20   it has done.   
218b0 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61   ** a rollback a
218c0 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
218d0 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72  base is therefor
218e0 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
218f0 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20      ** it hence 
21900 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65  it is OK for the
21910 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61   transaction cha
21920 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62  nge counter to b
21930 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67  e.    ** unchang
21940 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ed..    */.    c
21950 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
21960 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b  _DB_UNCHANGED: {
21970 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
21980 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65  e*)id)->dbUpdate
21990 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
219a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
219b0 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
219c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
219d0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
219e0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
219f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21a00 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50  _FCNTL_SET_LOCKP
21a10 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
21a20 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
21a30 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
21a40 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
21a50 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
21a60 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
21a70 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
21a80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
21a90 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
21aa0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
21ab0 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ) */.  }.  retur
21ac0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
21ad0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  D;.}../*.** If p
21ae0 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 69  Fd->sectorSize i
21af0 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e 20  s non-zero when 
21b00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
21b10 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
21b20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72  .** no-op. Other
21b30 77 69 73 65 2c 20 74 68 65 20 76 61 6c 75 65 73  wise, the values
21b40 20 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53   of pFd->sectorS
21b50 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64 2d  ize and .** pFd-
21b60 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
21b70 69 73 74 69 63 73 20 61 72 65 20 73 65 74 20 61  istics are set a
21b80 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
21b90 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20  file-system .** 
21ba0 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 2e  characteristics.
21bb0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72   .**.** There ar
21bc0 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f  e two versions o
21bd0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
21be0 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e 64   One for QNX and
21bf0 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20   one for all.** 
21c00 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a 2a  other systems..*
21c10 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
21c20 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69 64  TO__.static void
21c30 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63   setDeviceCharac
21c40 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46 69  teristics(unixFi
21c50 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65  le *pFd){.  asse
21c60 72 74 28 20 70 46 64 2d 3e 64 65 76 69 63 65 43  rt( pFd->deviceC
21c70 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3d 3d  haracteristics==
21c80 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f 72  0 || pFd->sector
21c90 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66 28  Size!=0 );.  if(
21ca0 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
21cb0 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  ==0 ){.#if defin
21cc0 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26  ed(__linux__) &&
21cd0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
21ce0 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f  ENABLE_BATCH_ATO
21cf0 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20 69  MIC_WRITE).    i
21d00 6e 74 20 72 65 73 3b 0a 20 20 20 20 75 33 32 20  nt res;.    u32 
21d10 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43  f = 0;..    /* C
21d20 68 65 63 6b 20 66 6f 72 20 73 75 70 70 6f 72 74  heck for support
21d30 20 66 6f 72 20 46 32 46 53 20 61 74 6f 6d 69 63   for F2FS atomic
21d40 20 62 61 74 63 68 20 77 72 69 74 65 73 2e 20 2a   batch writes. *
21d50 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 49 6f  /.    res = osIo
21d60 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46 53  ctl(pFd->h, F2FS
21d70 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55 52 45  _IOC_GET_FEATURE
21d80 53 2c 20 26 66 29 3b 0a 20 20 20 20 69 66 28 20  S, &f);.    if( 
21d90 72 65 73 3d 3d 30 20 26 26 20 28 66 20 26 20 46  res==0 && (f & F
21da0 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f 4d  2FS_FEATURE_ATOM
21db0 49 43 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  IC_WRITE) ){.   
21dc0 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43 68     pFd->deviceCh
21dd0 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20  aracteristics = 
21de0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41 54  SQLITE_IOCAP_BAT
21df0 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20 7d  CH_ATOMIC;.    }
21e00 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e  .#endif /* __lin
21e10 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f 45  ux__ && SQLITE_E
21e20 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d  NABLE_BATCH_ATOM
21e30 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20  IC_WRITE */..   
21e40 20 2f 2a 20 53 65 74 20 74 68 65 20 50 4f 57 45   /* Set the POWE
21e50 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
21e60 66 6c 61 67 20 69 66 20 72 65 71 75 65 73 74 65  flag if requeste
21e70 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46  d. */.    if( pF
21e80 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  d->ctrlFlags & U
21e90 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a  NIXFILE_PSOW ){.
21ea0 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63        pFd->devic
21eb0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21ec0 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50   |= SQLITE_IOCAP
21ed0 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
21ee0 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RITE;.    }..   
21ef0 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65   pFd->sectorSize
21f00 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
21f10 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  T_SECTOR_SIZE;. 
21f20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63 6c   }.}.#else.#incl
21f30 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c  ude <sys/dcmd_bl
21f40 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  k.h>.#include <s
21f50 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74  ys/statvfs.h>.st
21f60 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65 76  atic void setDev
21f70 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
21f80 63 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  cs(unixFile *pFi
21f90 6c 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65  le){.  if( pFile
21fa0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20  ->sectorSize == 
21fb0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
21fc0 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a  statvfs fsInfo;.
21fd0 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53         .    /* S
21fe0 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20  et defaults for 
21ff0 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69  non-supported fi
22000 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20  lesystems */.   
22010 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
22020 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
22030 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
22040 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
22050 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
22060 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66  s = 0;.    if( f
22070 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68  statvfs(pFile->h
22080 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
22090 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   ) {.      retur
220a0 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  n;.    }..    if
220b0 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
220c0 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d  .f_basetype, "tm
220d0 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46  p") ) {.      pF
220e0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
220f0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
22100 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
22110 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
22120 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
22130 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
22140 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20  IC4K |       /* 
22150 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74  All ram filesyst
22160 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
22170 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
22180 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
22190 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
221a0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
221b0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
221c0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
221d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
221f0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
22200 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
22210 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
22220 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
22230 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
22240 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
22250 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
22280 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
22290 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
222a0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
222b0 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
222c0 74 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b  type, "etfs") ){
222d0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
222e0 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
222f0 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
22300 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
22310 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
22320 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20          /* etfs 
22330 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69  cluster size wri
22340 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
22350 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65  /.        (pFile
22360 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
22370 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
22380 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20  P_ATOMIC512) |. 
22390 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
223a0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
223b0 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
223c0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
223d0 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
223e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22400 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
22410 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
22420 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
22430 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
22440 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
22450 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
22460 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
22470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22490 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
224a0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
224b0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
224c0 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
224d0 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
224e0 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx6") ){.      p
224f0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
22500 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
22510 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
22520 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
22530 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
22540 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
22550 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a  MIC |         /*
22560 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20   All filesystem 
22570 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
22580 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
22590 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
225a0 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
225b0 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
225c0 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
225d0 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
225e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
22600 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
22610 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
22620 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
22630 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
22640 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
22650 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
22660 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
22690 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
226a0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
226b0 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
226c0 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
226d0 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20  pe, "qnx4") ){. 
226e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
226f0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
22700 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
22710 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
22720 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
22730 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69        /* full bi
22740 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20  tset of atomics 
22750 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20  from max sector 
22760 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72  size and smaller
22770 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46   */.        ((pF
22780 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
22790 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
227a0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
227b0 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20  << 1) - 2 |.    
227c0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
227d0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
227e0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
227f0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
22800 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
22810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22830 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
22840 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
22850 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
22860 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
22870 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73  f_basetype, "dos
22880 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
22890 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
228a0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
228b0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
228c0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
228d0 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20  cs =.        /* 
228e0 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61  full bitset of a
228f0 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20  tomics from max 
22900 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20  sector size and 
22910 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20  smaller */.     
22920 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74     ((pFile->sect
22930 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
22940 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
22950 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32  IC512) << 1) - 2
22960 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   |.        SQLIT
22970 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
22980 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
22990 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
229a0 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
229b0 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
229e0 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
229f0 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
22a00 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c  else{.      pFil
22a10 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
22a20 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
22a30 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
22a40 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20  ATOMIC512 |     
22a50 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61   /* blocks are a
22a60 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20  tomic */.       
22a70 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
22a80 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
22a90 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
22aa0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
22ab0 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
22ae0 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
22af0 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  eds */.        0
22b00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  ;.    }.  }.  /*
22b10 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72   Last chance ver
22b20 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74  ification.  If t
22b30 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
22b40 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20  sn't a multiple 
22b50 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e  of 512.  ** then
22b60 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e   it isn't valid.
22b70 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
22b80 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32  sectorSize % 512
22b90 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69   != 0 ){.    pFi
22ba0 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
22bb0 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
22bc0 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72     pFile->sector
22bd0 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
22be0 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a  FAULT_SECTOR_SIZ
22bf0 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  E;.  }.}.#endif.
22c00 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22c10 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  e sector size in
22c20 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e   bytes of the un
22c30 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64  derlying block d
22c40 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65  evice for.** the
22c50 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e   specified file.
22c60 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20   This is almost 
22c70 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73  always 512 bytes
22c80 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20  , but may be.** 
22c90 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20  larger for some 
22ca0 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  devices..**.** S
22cb0 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d  QLite code assum
22cc0 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  es this function
22cd0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74   cannot fail. It
22ce0 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68   also assumes th
22cf0 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c  at.** if two fil
22d00 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69  es are created i
22d10 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d  n the same file-
22d20 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79  system directory
22d30 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61   (i.e..** a data
22d40 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75  base and its jou
22d50 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20  rnal file) that 
22d60 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  the sector size 
22d70 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73  will be the.** s
22d80 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f  ame for both..*/
22d90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
22da0 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
22db0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
22dc0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
22dd0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
22de0 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61 63   setDeviceCharac
22df0 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b 0a  teristics(pFd);.
22e00 20 20 72 65 74 75 72 6e 20 70 46 64 2d 3e 73 65    return pFd->se
22e10 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a  ctorSize;.}../*.
22e20 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
22e30 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
22e40 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
22e50 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
22e60 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
22e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
22e80 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
22e90 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
22ea0 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
22eb0 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
22ec0 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
22ed0 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
22ee0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
22ef0 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
22f00 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
22f10 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
22f20 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
22f30 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
22f40 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
22f50 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
22f60 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
22f70 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
22f80 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
22f90 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
22fa0 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
22fb0 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
22fc0 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
22fd0 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
22fe0 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
22ff0 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
23000 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
23010 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
23020 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
23030 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
23040 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
23050 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
23060 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
23070 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
23080 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
23090 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
230a0 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
230b0 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
230c0 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
230d0 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
230e0 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
230f0 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
23100 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
23110 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
23120 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
23130 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
23140 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
23150 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61  ;.  setDeviceCha
23160 72 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64  racteristics(pFd
23170 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d  );.  return pFd-
23180 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
23190 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69 66 20 21  istics;.}..#if !
231a0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
231b0 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
231c0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
231d0 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
231e0 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
231f0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
23200 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
23210 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
23220 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
23230 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
23240 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
23250 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
23260 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
23270 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
23280 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
23290 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
232a0 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
232b0 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
232c0 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
232d0 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
232e0 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
232f0 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
23300 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
23310 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
23320 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
23330 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
23340 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
23350 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
23360 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
23370 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
23380 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
23390 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
233a0 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
233b0 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
233c0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
233d0 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
233e0 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
233f0 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
23400 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
23410 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
23420 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
23430 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
23440 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
23450 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
23460 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
23470 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
23480 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
23490 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
234a0 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
234b0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
234c0 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
234d0 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
234e0 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
234f0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
23500 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
23510 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
23520 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
23530 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
23540 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
23550 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
23560 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
23570 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
23580 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
23590 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
235a0 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
235b0 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
235c0 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
235d0 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
235e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
235f0 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
23600 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
23610 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
23620 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
23630 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
23640 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
23650 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
23660 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
23670 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
23680 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
23690 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
236a0 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
236b0 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
236c0 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
236d0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
236e0 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
236f0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
23700 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
23710 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
23720 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
23730 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
23740 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
23750 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
23760 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
23770 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
23780 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
23790 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
237a0 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
237b0 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
237c0 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
237d0 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
237e0 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
237f0 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
23800 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
23810 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
23820 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
23830 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
23840 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
23850 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
23860 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
23870 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
23880 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
23890 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
238a0 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
238b0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
238c0 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
238d0 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
23900 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
23910 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
23920 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23930 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
23940 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
23950 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
23960 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
23970 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
23980 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
23990 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
239a0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
239b0 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 75 38 20  ad-only */.  u8 
239c0 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20 20 20 20  isUnlocked;     
239d0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
239e0 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63 6b 20 68  if no DMS lock h
239f0 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  eld */.  char **
23a00 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
23a10 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
23a20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
23a30 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
23a40 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a60 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
23a70 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
23a80 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
23a90 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
23aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
23ab0 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
23ac0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
23ad0 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
23ae0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
23af0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
23b00 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
23b10 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
23b20 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
23b30 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
23b40 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
23b50 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
23b60 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
23b70 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
23b80 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
23b90 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
23ba0 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
23bb0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
23bc0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
23bd0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
23be0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
23bf0 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
23c00 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
23c10 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
23c20 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
23c30 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
23c40 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
23c50 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
23c60 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
23c70 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
23c80 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
23c90 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
23ca0 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
23cb0 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
23cc0 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
23cd0 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
23ce0 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
23cf0 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
23d00 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
23d10 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
23d20 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
23d30 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
23d40 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
23d50 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
23d60 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
23d70 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
23d80 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
23d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
23da0 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
23db0 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
23dc0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
23dd0 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
23de0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
23df0 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
23e00 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
23e10 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
23e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e30 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
23e40 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
23e50 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
23e60 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
23e70 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
23e80 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
23e90 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
23ea0 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
23eb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
23ec0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
23ed0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
23ee0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
23ef0 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
23f00 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
23f10 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
23f20 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
23f30 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
23f40 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
23f50 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
23f60 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
23f70 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
23f80 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
23f90 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
23fa0 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
23fb0 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
23fc0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
23fd0 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
23fe0 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
23ff0 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
24000 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
24010 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
24020 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
24030 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
24040 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
24050 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
24060 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46  temLock(.  unixF
24070 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
24080 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63    /* Open connec
24090 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20  tion to the WAL 
240a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  file */.  int lo
240b0 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
240c0 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52   /* F_UNLCK, F_R
240d0 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b  DLCK, or F_WRLCK
240e0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
240f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24100 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
24110 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
24120 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20  */.  int n      
24130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24140 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
24150 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  o lock */.){.  u
24160 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
24170 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c  Node; /* Apply l
24180 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
24190 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
241a0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72  segment */.  str
241b0 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
241c0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
241d0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
241e0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
241f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24200 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c  _OK;    /* Resul
24210 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74  t code form fcnt
24220 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  l() */..  /* Acc
24230 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
24240 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
24250 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
24260 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70  he caller */.  p
24270 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  ShmNode = pFile-
24280 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
24290 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  e;.  assert( pSh
242a0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 7c  mNode->nRef==0 |
242b0 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
242c0 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  held(pShmNode->m
242d0 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 53  utex) );..  /* S
242e0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
242f0 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
24300 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
24310 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
24320 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
24330 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
24340 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
24350 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
24360 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49 54 45 5f  =1 && n<=SQLITE_
24370 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SHM_NLOCK );..  
24380 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
24390 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  =0 ){.    /* Ini
243a0 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b  tialize the lock
243b0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ing parameters *
243c0 2f 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d  /.    f.l_type =
243d0 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66   lockType;.    f
243e0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
243f0 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74  _SET;.    f.l_st
24400 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20  art = ofst;.    
24410 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 20 20 20  f.l_len = n;.   
24420 20 72 63 20 3d 20 6f 73 53 65 74 50 6f 73 69 78   rc = osSetPosix
24430 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28 70 53 68  AdvisoryLock(pSh
24440 6d 4e 6f 64 65 2d 3e 68 2c 20 26 66 2c 20 70 46  mNode->h, &f, pF
24450 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 28  ile);.    rc = (
24460 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49  rc!=(-1)) ? SQLI
24470 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42  TE_OK : SQLITE_B
24480 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55  USY;.  }..  /* U
24490 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61 6c  pdate the global
244a0 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64 20   lock state and 
244b0 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e 67  do debug tracing
244c0 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
244d0 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36 20  E_DEBUG.  { u16 
244e0 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45 28  mask;.  OSTRACE(
244f0 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b 0a  ("SHM-LOCK "));.
24500 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33 31    mask = ofst>31
24510 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c 3c   ? 0xffff : (1<<
24520 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
24530 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  ofst);.  if( rc=
24540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24550 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
24560 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
24570 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
24580 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
24590 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
245a0 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
245b0 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
245c0 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
245d0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 65  &= ~mask;.    }e
245e0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
245f0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
24600 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
24610 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  d-lock %d ok", o
24620 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
24630 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
24640 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
24650 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
24660 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
24670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
24680 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
24690 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
246a0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
246b0 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  e-lock %d ok", o
246c0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
246d0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
246e0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70  |= mask;.      p
246f0 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d  ShmNode->sharedM
24700 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ask &= ~mask;.  
24710 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
24720 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
24730 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _UNLCK ){.      
24740 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63 6b  OSTRACE(("unlock
24750 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
24760 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  t));.    }else i
24770 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
24780 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
24790 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
247a0 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 20  k failed"));.   
247b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
247c0 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  sert( lockType==
247d0 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20 20  F_WRLCK );.     
247e0 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74 65   OSTRACE(("write
247f0 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  -lock %d failed"
24800 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 0a  , ofst));.    }.
24810 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
24820 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 30   - afterwards %0
24830 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
24840 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
24850 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53 68  >sharedMask, pSh
24860 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 29  mNode->exclMask)
24870 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
24880 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20 20   return rc;     
24890 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74     .}../*.** Ret
248a0 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20  urn the minimum 
248b0 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20 73  number of 32KB s
248c0 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74 20  hm regions that 
248d0 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65 64  should be mapped
248e0 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20 61   at.** a time, a
248f0 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61 63  ssuming that eac
24900 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62  h mapping must b
24910 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c  e an integer mul
24920 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a 20  tiple of the.** 
24930 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20 70  current system p
24940 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age-size..**.** 
24950 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  Usually, this is
24960 20 31 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f   1. The exceptio
24970 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73 79  n seems to be sy
24980 73 74 65 6d 73 20 74 68 61 74 20 61 72 65 20 63  stems that are c
24990 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f 20  onfigured.** to 
249a0 75 73 65 20 36 34 4b 42 20 70 61 67 65 73 20 2d  use 64KB pages -
249b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 65 61   in this case ea
249c0 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  ch mapping must 
249d0 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20 74  cover at least t
249e0 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f 6e  wo.** shm region
249f0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
24a00 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65   unixShmRegionPe
24a10 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69 6e  rMap(void){.  in
24a20 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30 32  t shmsz = 32*102
24a30 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  4;            /*
24a40 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a 65   SHM region size
24a50 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20 3d   */.  int pgsz =
24a60 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29   osGetpagesize()
24a70 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70 61  ;   /* System pa
24a80 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73 73  ge size */.  ass
24a90 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26 70  ert( ((pgsz-1)&p
24aa0 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  gsz)==0 );   /* 
24ab0 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  Page size must b
24ac0 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 2a  e a power of 2 *
24ad0 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68 6d  /.  if( pgsz<shm
24ae0 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  sz ) return 1;. 
24af0 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68 6d   return pgsz/shm
24b00 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75 72  sz;.}../*.** Pur
24b10 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ge the unixShmNo
24b20 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20 61  deList list of a
24b30 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68 20  ll entries with 
24b40 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66  unixShmNode.nRef
24b50 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ==0..**.** This 
24b60 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68 61  is not a VFS sha
24b70 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
24b80 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c 69  d; it is a utili
24b90 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ty function call
24ba0 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68 61  ed.** by VFS sha
24bb0 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68 6f  red-memory metho
24bc0 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
24bd0 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  id unixShmPurge(
24be0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
24bf0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
24c00 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   = pFd->pInode->
24c10 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65  pShmNode;.  asse
24c20 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
24c30 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20 26  d() );.  if( p &
24c40 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e 52 65 66  & ALWAYS(p->nRef
24c50 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ==0) ){.    int 
24c60 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69  nShmPerMap = uni
24c70 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70  xShmRegionPerMap
24c80 28 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ();.    int i;. 
24c90 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49     assert( p->pI
24ca0 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64  node==pFd->pInod
24cb0 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  e );.    sqlite3
24cc0 5f 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d  _mutex_free(p->m
24cd0 75 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69  utex);.    for(i
24ce0 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e  =0; i<p->nRegion
24cf0 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29  ; i+=nShmPerMap)
24d00 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68  {.      if( p->h
24d10 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  >=0 ){.        o
24d20 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67  sMunmap(p->apReg
24d30 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67  ion[i], p->szReg
24d40 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ion);.      }els
24d50 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
24d60 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67  e3_free(p->apReg
24d70 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ion[i]);.      }
24d80 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
24d90 65 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67  e3_free(p->apReg
24da0 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ion);.    if( p-
24db0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  >h>=0 ){.      r
24dc0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c  obust_close(pFd,
24dd0 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29   p->h, __LINE__)
24de0 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d  ;.      p->h = -
24df0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  1;.    }.    p->
24e00 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
24e10 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
24e20 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d  3_free(p);.  }.}
24e30 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4d 53 20  ../*.** The DMS 
24e40 6c 6f 63 6b 20 68 61 73 20 6e 6f 74 20 79 65 74  lock has not yet
24e50 20 62 65 65 6e 20 74 61 6b 65 6e 20 6f 6e 20 73   been taken on s
24e60 68 6d 20 66 69 6c 65 20 70 53 68 6d 4e 6f 64 65  hm file pShmNode
24e70 2e 20 41 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20  . Attempt to.** 
24e80 74 61 6b 65 20 69 74 20 6e 6f 77 2e 20 52 65 74  take it now. Ret
24e90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
24ea0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20   successful, or 
24eb0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
24ec0 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
24ed0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
24ee0 44 4d 53 20 63 61 6e 6e 6f 74 20 62 65 20 6c 6f  DMS cannot be lo
24ef0 63 6b 65 64 20 62 65 63 61 75 73 65 20 74 68 69  cked because thi
24f00 73 20 69 73 20 61 20 72 65 61 64 6f 6e 6c 79 5f  s is a readonly_
24f10 73 68 6d 3d 31 20 0a 2a 2a 20 63 6f 6e 6e 65 63  shm=1 .** connec
24f20 74 69 6f 6e 20 61 6e 64 20 6e 6f 20 6f 74 68 65  tion and no othe
24f30 72 20 70 72 6f 63 65 73 73 20 61 6c 72 65 61 64  r process alread
24f40 79 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 2c 20  y holds a lock, 
24f50 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45  return.** SQLITE
24f60 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e  _READONLY_CANTIN
24f70 49 54 20 61 6e 64 20 73 65 74 20 70 53 68 6d 4e  IT and set pShmN
24f80 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 3d  ode->isUnlocked=
24f90 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  1..*/.static int
24fa0 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d   unixLockSharedM
24fb0 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
24fc0 70 44 62 46 64 2c 20 75 6e 69 78 53 68 6d 4e 6f  pDbFd, unixShmNo
24fd0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29 7b 0a 20  de *pShmNode){. 
24fe0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
24ff0 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
25000 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
25010 55 73 65 20 46 5f 47 45 54 4c 4b 20 74 6f 20 64  Use F_GETLK to d
25020 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6c 6f 63  etermine the loc
25030 6b 73 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ks other process
25040 65 73 20 61 72 65 20 68 6f 6c 64 69 6e 67 0a 20  es are holding. 
25050 20 2a 2a 20 6f 6e 20 74 68 65 20 44 4d 53 20 62   ** on the DMS b
25060 79 74 65 2e 20 49 66 20 69 74 20 69 6e 64 69 63  yte. If it indic
25070 61 74 65 73 20 74 68 61 74 20 61 6e 6f 74 68 65  ates that anothe
25080 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c  r process is hol
25090 64 69 6e 67 0a 20 20 2a 2a 20 61 20 53 48 41 52  ding.  ** a SHAR
250a0 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ED lock, then th
250b0 69 73 20 70 72 6f 63 65 73 73 20 6d 61 79 20 61  is process may a
250c0 6c 73 6f 20 74 61 6b 65 20 61 20 53 48 41 52 45  lso take a SHARE
250d0 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  D lock.  ** and 
250e0 70 72 6f 63 65 65 64 20 77 69 74 68 20 6f 70 65  proceed with ope
250f0 6e 69 6e 67 20 74 68 65 20 2a 2d 73 68 6d 20 66  ning the *-shm f
25100 69 6c 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ile. .  **.  ** 
25110 4f 72 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20  Or, if no other 
25120 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
25130 6e 67 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65  ng any lock, the
25140 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 0a 20  n this process. 
25150 20 2a 2a 20 69 73 20 74 68 65 20 66 69 72 73 74   ** is the first
25160 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20 49 6e 20   to open it. In 
25170 74 68 69 73 20 63 61 73 65 20 74 61 6b 65 20 61  this case take a
25180 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
25190 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 44 4d 53   on the.  ** DMS
251a0 20 62 79 74 65 20 61 6e 64 20 74 72 75 6e 63 61   byte and trunca
251b0 74 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  te the *-shm fil
251c0 65 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20  e to zero bytes 
251d0 69 6e 20 73 69 7a 65 2e 20 54 68 65 6e 0a 20 20  in size. Then.  
251e0 2a 2a 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20  ** downgrade to 
251f0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e  a SHARED lock on
25200 20 74 68 65 20 44 4d 53 20 62 79 74 65 2e 0a 20   the DMS byte.. 
25210 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 6f 74   **.  ** If anot
25220 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68  her process is h
25230 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  olding an EXCLUS
25240 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
25250 44 4d 53 20 62 79 74 65 2c 0a 20 20 2a 2a 20 72  DMS byte,.  ** r
25260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
25270 59 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  Y to the caller 
25280 28 69 74 20 77 69 6c 6c 20 74 72 79 20 61 67 61  (it will try aga
25290 69 6e 29 2e 20 41 6e 20 65 61 72 6c 69 65 72 0a  in). An earlier.
252a0 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 6f 66 20    ** version of 
252b0 74 68 69 73 20 63 6f 64 65 20 61 74 74 65 6d 70  this code attemp
252c0 74 65 64 20 74 68 65 20 53 48 41 52 45 44 20 6c  ted the SHARED l
252d0 6f 63 6b 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ock at this poin
252e0 74 2e 20 42 75 74 0a 20 20 2a 2a 20 74 68 69 73  t. But.  ** this
252f0 20 69 6e 74 72 6f 64 75 63 65 64 20 61 20 73 75   introduced a su
25300 62 74 6c 65 20 72 61 63 65 20 63 6f 6e 64 69 74  btle race condit
25310 69 6f 6e 3a 20 69 66 20 74 68 65 20 70 72 6f 63  ion: if the proc
25320 65 73 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a  ess holding.  **
25330 20 45 58 43 4c 55 53 49 56 45 20 66 61 69 6c 65   EXCLUSIVE faile
25340 64 20 6a 75 73 74 20 62 65 66 6f 72 65 20 74 72  d just before tr
25350 75 6e 63 61 74 69 6e 67 20 74 68 65 20 2a 2d 73  uncating the *-s
25360 68 6d 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  hm file, then th
25370 69 73 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  is.  ** process 
25380 6d 69 67 68 74 20 6f 70 65 6e 20 61 6e 64 20 75  might open and u
25390 73 65 20 74 68 65 20 2a 2d 73 68 6d 20 66 69 6c  se the *-shm fil
253a0 65 20 77 69 74 68 6f 75 74 20 74 72 75 6e 63 61  e without trunca
253b0 74 69 6e 67 20 69 74 2e 0a 20 20 2a 2a 20 41 6e  ting it..  ** An
253c0 64 20 69 66 20 74 68 65 20 2a 2d 73 68 6d 20 66  d if the *-shm f
253d0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 72  ile has been cor
253e0 72 75 70 74 65 64 20 62 79 20 61 20 70 6f 77 65  rupted by a powe
253f0 72 20 66 61 69 6c 75 72 65 20 6f 72 0a 20 20 2a  r failure or.  *
25400 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 2c 20  * system crash, 
25410 74 68 65 20 64 61 74 61 62 61 73 65 20 69 74 73  the database its
25420 65 6c 66 20 6d 61 79 20 61 6c 73 6f 20 62 65 63  elf may also bec
25430 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f  ome corrupt.  */
25440 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
25450 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
25460 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 55 4e  ock.l_start = UN
25470 49 58 5f 53 48 4d 5f 44 4d 53 3b 0a 20 20 6c 6f  IX_SHM_DMS;.  lo
25480 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
25490 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
254a0 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  WRLCK;.  if( osF
254b0 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
254c0 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
254d0 29 21 3d 30 20 29 20 7b 0a 20 20 20 20 72 63 20  )!=0 ) {.    rc 
254e0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
254f0 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  OCK;.  }else if(
25500 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f   lock.l_type==F_
25510 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 69 66 28  UNLCK ){.    if(
25520 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
25530 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 70  donly ){.      p
25540 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63  ShmNode->isUnloc
25550 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  ked = 1;.      r
25560 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
25570 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b 0a 20 20  NLY_CANTINIT;.  
25580 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
25590 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
255a0 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57  mLock(pDbFd, F_W
255b0 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  RLCK, UNIX_SHM_D
255c0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  MS, 1);.      if
255d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
255e0 26 26 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  && robust_ftrunc
255f0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
25600 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72   0) ){.        r
25610 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
25620 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
25630 4d 4f 50 45 4e 2c 22 66 74 72 75 6e 63 61 74 65  MOPEN,"ftruncate
25640 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  ",pShmNode->zFil
25650 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a  ename);.      }.
25660 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
25670 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46  ( lock.l_type==F
25680 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 72 63  _WRLCK ){.    rc
25690 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
256a0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
256b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
256c0 61 73 73 65 72 74 28 20 6c 6f 63 6b 2e 6c 5f 74  assert( lock.l_t
256d0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 7c 7c 20  ype==F_UNLCK || 
256e0 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  lock.l_type==F_R
256f0 44 4c 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d  DLCK );.    rc =
25700 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
25710 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
25720 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
25730 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
25740 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
25750 70 65 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  pen a shared-mem
25760 6f 72 79 20 61 72 65 61 20 61 73 73 6f 63 69 61  ory area associa
25770 74 65 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61  ted with open da
25780 74 61 62 61 73 65 20 66 69 6c 65 20 70 44 62 46  tabase file pDbF
25790 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72  d.  .** This par
257a0 74 69 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e  ticular implemen
257b0 74 61 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70  tation uses mmap
257c0 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ped files..**.**
257d0 20 54 68 65 20 66 69 6c 65 20 75 73 65 64 20 74   The file used t
257e0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72  o implement shar
257f0 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20  ed-memory is in 
25800 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f  the same directo
25810 72 79 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65  ry.** as the ope
25820 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
25830 61 6e 64 20 68 61 73 20 74 68 65 20 73 61 6d 65  and has the same
25840 20 6e 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65   name as the ope
25850 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  n database.** fi
25860 6c 65 20 77 69 74 68 20 74 68 65 20 22 2d 73 68  le with the "-sh
25870 6d 22 20 73 75 66 66 69 78 20 61 64 64 65 64 2e  m" suffix added.
25880 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69    For example, i
25890 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
258a0 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65  ile.** is "/home
258b0 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
258c0 22 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  " then the file 
258d0 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
258e0 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66  and mmapped.** f
258f0 6f 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  or shared memory
25900 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
25910 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e  "/home/user1/con
25920 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a  fig.db-shm".  .*
25930 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70  *.** Another app
25940 72 6f 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75  roach to is to u
25950 73 65 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76  se files in /dev
25960 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70  /shm or /dev/tmp
25970 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f   or an.** some o
25980 74 68 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74  ther tmpfs mount
25990 2e 20 42 75 74 20 69 66 20 61 20 66 69 6c 65 20  . But if a file 
259a0 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 64  in a different d
259b0 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d  irectory.** from
259c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
259d0 6c 65 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e  le is used, then
259e0 20 64 69 66 66 65 72 69 6e 67 20 61 63 63 65 73   differing acces
259f0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a  s permissions.**
25a00 20 6f 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d   or a chroot() m
25a10 69 67 68 74 20 63 61 75 73 65 20 74 77 6f 20 64  ight cause two d
25a20 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
25a30 65 73 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a  es on the same.*
25a40 2a 20 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e  * database to en
25a50 64 20 75 70 20 75 73 69 6e 67 20 64 69 66 66 65  d up using diffe
25a60 72 65 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73  rent files for s
25a70 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a  hared memory - .
25a80 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  ** meaning that 
25a90 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75  their memory wou
25aa0 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65  ld not really be
25ab0 20 73 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74   shared - result
25ac0 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61  ing.** in databa
25ad0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  se corruption.  
25ae0 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68  Nevertheless, th
25af0 69 73 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73  is tmpfs file us
25b00 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e  age.** can be en
25b10 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
25b20 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51  -time using -DSQ
25b30 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
25b40 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a  RY="/dev/shm".**
25b50 20 6f 72 20 74 68 65 20 65 71 75 69 76 61 6c 65   or the equivale
25b60 6e 74 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  nt.  The use of 
25b70 74 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  the SQLITE_SHM_D
25b80 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65  IRECTORY compile
25b90 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20  -time.** option 
25ba0 72 65 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e  results in an in
25bb0 63 6f 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64  compatible build
25bc0 20 6f 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69   of SQLite;  bui
25bd0 6c 64 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a  lds of SQLite.**
25be0 20 74 68 61 74 20 77 69 74 68 20 64 69 66 66 65   that with diffe
25bf0 72 69 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f  ring SQLITE_SHM_
25c00 44 49 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e  DIRECTORY settin
25c10 67 73 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73  gs attempt to us
25c20 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61  e the.** same da
25c30 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
25c40 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61  he same time, da
25c50 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
25c60 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  n will likely.**
25c70 20 72 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c   result. The SQL
25c80 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
25c90 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  Y compile-time o
25ca0 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65  ption is conside
25cb0 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72  red.** "unsuppor
25cc0 74 65 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20  ted" and may go 
25cd0 61 77 61 79 20 69 6e 20 61 20 66 75 74 75 72 65  away in a future
25ce0 20 53 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e   SQLite release.
25cf0 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e  .**.** When open
25d00 69 6e 67 20 61 20 6e 65 77 20 73 68 61 72 65 64  ing a new shared
25d10 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66  -memory file, if
25d20 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e   no other instan
25d30 63 65 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66  ces of that.** f
25d40 69 6c 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ile are currentl
25d50 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20  y open, in this 
25d60 70 72 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74  process or in ot
25d70 68 65 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74  her processes, t
25d80 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  hen.** the file 
25d90 6d 75 73 74 20 62 65 20 74 72 75 6e 63 61 74 65  must be truncate
25da0 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  d to zero length
25db0 20 6f 72 20 68 61 76 65 20 69 74 73 20 68 65 61   or have its hea
25dc0 64 65 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a  der cleared..**.
25dd0 2a 2a 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  ** If the origin
25de0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
25df0 20 28 70 44 62 46 64 29 20 69 73 20 75 73 69 6e   (pDbFd) is usin
25e00 67 20 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c  g the "unix-excl
25e10 22 20 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65  " VFS.** that me
25e20 61 6e 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c  ans that an excl
25e30 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65  usive lock is he
25e40 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
25e50 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74  se file and.** t
25e60 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f  hat no other pro
25e70 63 65 73 73 65 73 20 61 72 65 20 61 62 6c 65 20  cesses are able 
25e80 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
25e90 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
25ea0 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c  In.** that case,
25eb0 20 77 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c   we do not reall
25ec0 79 20 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65  y need shared me
25ed0 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64  mory.  No shared
25ee0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20   memory.** file 
25ef0 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68 65  is created.  The
25f00 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
25f10 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64  ill be simulated
25f20 20 77 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72   with heap memor
25f30 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
25f40 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d   unixOpenSharedM
25f50 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a  emory(unixFile *
25f60 70 44 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74  pDbFd){.  struct
25f70 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b   unixShm *p = 0;
25f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
25f90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62   connection to b
25fa0 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74  e opened */.  st
25fb0 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
25fc0 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a   *pShmNode;   /*
25fd0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
25fe0 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a  mmapped file */.
25ff0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26000 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
26010 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
26020 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
26030 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20  nfo *pInode;    
26040 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f        /* The ino
26050 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68  de of fd */.  ch
26060 61 72 20 2a 7a 53 68 6d 3b 20 20 20 20 20 20 20  ar *zShm;       
26070 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
26080 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
26090 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
260a0 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
260b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
260c0 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
260d0 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
260e0 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
260f0 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
26100 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
26110 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
26120 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
26130 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
26140 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
26150 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  n SQLITE_NOMEM_B
26160 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c  KPT;.  memset(p,
26170 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b   0, sizeof(*p));
26180 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64  .  assert( pDbFd
26190 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20  ->pShm==0 );..  
261a0 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20  /* Check to see 
261b0 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65  if a unixShmNode
261c0 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20   object already 
261d0 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e  exists. Reuse an
261e0 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f   existing.  ** o
261f0 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43  ne if present. C
26200 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
26210 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20  if necessary..  
26220 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
26230 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
26240 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
26250 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49  .  pShmNode = pI
26260 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
26270 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
26280 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
26290 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
262a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
262b0 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20  stat() info for 
262c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
262d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
262e0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20  SHM_DIRECTORY.  
262f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42    const char *zB
26300 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d  asePath = pDbFd-
26310 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a  >zPath;.#endif..
26320 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61      /* Call fsta
26330 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75  t() to figure ou
26340 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  t the permission
26350 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  s on the databas
26360 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a  e file. If.    *
26370 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69  * a new *-shm fi
26380 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61  le is created, a
26390 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62  n attempt will b
263a0 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65  e made to create
263b0 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20   it.    ** with 
263c0 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73  the same permiss
263d0 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ions..    */.   
263e0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62   if( osFstat(pDb
263f0 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  Fd->h, &sStat) )
26400 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
26410 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
26420 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
26430 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
26440 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
26450 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
26460 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20   nShmFilename = 
26470 73 69 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48  sizeof(SQLITE_SH
26480 4d 5f 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33  M_DIRECTORY) + 3
26490 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68  1;.#else.    nSh
264a0 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20  mFilename = 6 + 
264b0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73  (int)strlen(zBas
264c0 65 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20  ePath);.#endif. 
264d0 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71     pShmNode = sq
264e0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
264f0 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
26500 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ) + nShmFilename
26510 20 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d   );.    if( pShm
26520 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Node==0 ){.     
26530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
26540 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
26550 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
26560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
26570 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20  et(pShmNode, 0, 
26580 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65  sizeof(*pShmNode
26590 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  )+nShmFilename);
265a0 0a 20 20 20 20 7a 53 68 6d 20 3d 20 70 53 68 6d  .    zShm = pShm
265b0 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20  Node->zFilename 
265c0 3d 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f  = (char*)&pShmNo
265d0 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51  de[1];.#ifdef SQ
265e0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
265f0 52 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  RY.    sqlite3_s
26600 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
26610 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 0a 20 20 20  name, zShm, .   
26620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26630 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52    SQLITE_SHM_DIR
26640 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d  ECTORY "/sqlite-
26650 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20  shm-%x-%x",.    
26660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26670 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69   (u32)sStat.st_i
26680 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73  no, (u32)sStat.s
26690 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20  t_dev);.#else.  
266a0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
266b0 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  tf(nShmFilename,
266c0 20 7a 53 68 6d 2c 20 22 25 73 2d 73 68 6d 22 2c   zShm, "%s-shm",
266d0 20 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20   zBasePath);.   
266e0 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
266f0 69 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68  ix3(pDbFd->zPath
26700 2c 20 7a 53 68 6d 29 3b 0a 23 65 6e 64 69 66 0a  , zShm);.#endif.
26710 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20      pShmNode->h 
26720 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d  = -1;.    pDbFd-
26730 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
26740 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  e = pShmNode;.  
26750 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f    pShmNode->pIno
26760 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
26770 64 65 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  de;.    if( sqli
26780 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
26790 62 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20  bCoreMutex ){.  
267a0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75      pShmNode->mu
267b0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
267c0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
267d0 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a 20 20  _MUTEX_FAST);.  
267e0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
267f0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
26800 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26810 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
26820 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
26830 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d  pen_err;.      }
26840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
26850 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
26860 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
26870 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f   if( 0==sqlite3_
26880 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46  uri_boolean(pDbF
26890 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65 61 64 6f  d->zPath, "reado
268a0 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20 29 7b 0a  nly_shm", 0) ){.
268b0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
268c0 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65  ->h = robust_ope
268d0 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 57 52 7c 4f  n(zShm, O_RDWR|O
268e0 5f 43 52 45 41 54 2c 20 28 73 53 74 61 74 2e 73  _CREAT, (sStat.s
268f0 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
26900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26910 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29   pShmNode->h<0 )
26920 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f  {.        pShmNo
26930 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f  de->h = robust_o
26940 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f 4e  pen(zShm, O_RDON
26950 4c 59 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f  LY, (sStat.st_mo
26960 64 65 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20  de&0777));.     
26970 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
26980 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >h<0 ){.        
26990 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
269a0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
269b0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
269c0 2c 20 7a 53 68 6d 29 3b 0a 20 20 20 20 20 20 20  , zShm);.       
269d0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
269e0 5f 65 72 72 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _err;.        }.
269f0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
26a00 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31  ->isReadonly = 1
26a10 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
26a20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63   /* If this proc
26a30 65 73 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  ess is running a
26a40 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72  s root, make sur
26a50 65 20 74 68 61 74 20 74 68 65 20 53 48 4d 20 66  e that the SHM f
26a60 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  ile.      ** is 
26a70 6f 77 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d  owned by the sam
26a80 65 20 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73  e user that owns
26a90 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
26aa0 74 61 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69  tabase.  Otherwi
26ab0 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  se,.      ** the
26ac0 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20   original owner 
26ad0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65  will not be able
26ae0 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20   to connect..   
26af0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
26b00 73 74 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64  stFchown(pShmNod
26b10 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75  e->h, sStat.st_u
26b20 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64  id, sStat.st_gid
26b30 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 75  );..      rc = u
26b40 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d  nixLockSharedMem
26b50 6f 72 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e  ory(pDbFd, pShmN
26b60 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
26b70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
26b80 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 45 41 44   rc!=SQLITE_READ
26b90 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 20 29 20  ONLY_CANTINIT ) 
26ba0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
26bb0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  r;.    }.  }..  
26bc0 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20  /* Make the new 
26bd0 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69  connection a chi
26be0 6c 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68  ld of the unixSh
26bf0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53  mNode */.  p->pS
26c00 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
26c10 65 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  e;.#ifdef SQLITE
26c20 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d  _DEBUG.  p->id =
26c30 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53   pShmNode->nextS
26c40 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20  hmId++;.#endif. 
26c50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b   pShmNode->nRef+
26c60 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
26c70 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
26c80 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  eMutex();..  /* 
26c90 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
26ca0 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20  unt on pShmNode 
26cb0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
26cc0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64   incremented und
26cd0 65 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65  er.  ** the cove
26ce0 72 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74  r of the unixEnt
26cf0 65 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20  erMutex() mutex 
26d00 61 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20  and the pointer 
26d10 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65  from the.  ** ne
26d20 77 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68  w (struct unixSh
26d30 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  m) object to the
26d40 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65   pShmNode has be
26d50 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74  en set. All that
26d60 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f   is.  ** left to
26d70 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74   do is to link t
26d80 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e  he new object in
26d90 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
26da0 73 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a  st starting.  **
26db0 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46   at pShmNode->pF
26dc0 69 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20  irst. This must 
26dd0 62 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f  be done while ho
26de0 6c 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f  lding the pShmNo
26df0 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20  de->mutex .  ** 
26e00 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71  mutex..  */.  sq
26e10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
26e20 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
26e30 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  x);.  p->pNext =
26e40 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
26e50 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  t;.  pShmNode->p
26e60 46 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c  First = p;.  sql
26e70 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
26e80 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
26e90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
26ea0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
26eb0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
26ec0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
26ed0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
26ee0 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
26ef0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
26f00 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
26f10 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
26f20 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
26f30 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
26f40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
26f50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
26f60 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
26f70 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
26f80 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
26f90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
26fa0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
26fb0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
26fc0 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
26fd0 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
26fe0 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
26ff0 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
27000 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
27010 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
27020 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
27030 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
27040 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
27050 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
27060 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
27070 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
27080 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
27090 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
270a0 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
270b0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
270c0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
270d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
270e0 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
270f0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
27100 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
27110 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
27120 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
27130 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
27140 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
27150 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
27160 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
27170 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
27180 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
27190 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
271a0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
271b0 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
271c0 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
271d0 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
271e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
271f0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
27200 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
27210 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
27220 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
27230 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
27240 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
27250 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
27260 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
27270 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
27280 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
27290 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
272a0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
272b0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
272c0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
272d0 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
272e0 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
272f0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
27300 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
27310 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
27320 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
27330 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
27340 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
27350 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
27360 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
27370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27380 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
27390 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
273a0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
273b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
273c0 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
273d0 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
273e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
273f0 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
27400 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
27410 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
27420 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
27430 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
27440 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
27450 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
27460 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
27470 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
27480 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
27490 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
274a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
274b0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65  OK;.  int nShmPe
274c0 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65  rMap = unixShmRe
274d0 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20  gionPerMap();.  
274e0 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a  int nReqRegion;.
274f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
27500 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
27510 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
27520 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
27530 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
27540 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
27550 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
27560 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
27570 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
27580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
27590 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
275a0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
275b0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
275c0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
275d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
275e0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
275f0 78 29 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  x);.  if( pShmNo
27600 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 29  de->isUnlocked )
27610 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c  {.    rc = unixL
27620 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  ockSharedMemory(
27630 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29  pDbFd, pShmNode)
27640 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
27650 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
27660 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
27670 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
27680 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  cked = 0;.  }.  
27690 61 73 73 65 72 74 28 20 73 7a 52 65 67 69 6f 6e  assert( szRegion
276a0 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65  ==pShmNode->szRe
276b0 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  gion || pShmNode
276c0 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a  ->nRegion==0 );.
276d0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
276e0 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46  de->pInode==pDbF
276f0 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61  d->pInode );.  a
27700 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
27710 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e  >h>=0 || pDbFd->
27720 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
27730 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73  Lock==1 );.  ass
27740 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
27750 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  <0 || pDbFd->pIn
27760 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
27770 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69  k==0 );..  /* Mi
27780 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
27790 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72 65 64  regions required
277a0 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e 20 2a   to be mapped. *
277b0 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e 20 3d  /.  nReqRegion =
277c0 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68 6d 50   ((iRegion+nShmP
277d0 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50 65 72  erMap) / nShmPer
277e0 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72 4d 61  Map) * nShmPerMa
277f0 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  p;..  if( pShmNo
27800 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71  de->nRegion<nReq
27810 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 63 68  Region ){.    ch
27820 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20 20 20  ar **apNew;     
27830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27840 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69 6f 6e   /* New apRegion
27850 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20  [] array */.    
27860 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52 65 71  int nByte = nReq
27870 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b  Region*szRegion;
27880 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 72 65     /* Minimum re
27890 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
278a0 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
278b0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
278c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
278d0 65 64 20 62 79 20 66 73 74 61 74 28 29 20 2a 2f  ed by fstat() */
278e0 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ..    pShmNode->
278f0 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52 65 67  szRegion = szReg
27900 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20 70 53  ion;..    if( pS
27910 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
27920 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71        /* The req
27930 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20 69 73  uested region is
27940 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e 74 6f   not mapped into
27950 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
27960 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 0a 20  address space.. 
27970 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20 74 6f       ** Check to
27980 20 73 65 65 20 69 66 20 69 74 20 68 61 73 20 62   see if it has b
27990 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 69  een allocated (i
279a0 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c 2d 69  .e. if the wal-i
279b0 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20 20 20  ndex file is.   
279c0 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e 6f 75     ** large enou
279d0 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68  gh to contain th
279e0 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67 69  e requested regi
279f0 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  on)..      */.  
27a00 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
27a10 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53  pShmNode->h, &sS
27a20 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tat) ){.        
27a30 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
27a40 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20 20 20  R_SHMSIZE;.     
27a50 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
27a60 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  out;.      }.  .
27a70 20 20 20 20 20 20 69 66 28 20 73 53 74 61 74 2e        if( sStat.
27a80 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20 29 7b  st_size<nByte ){
27a90 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
27aa0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
27ab0 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e 6f 74   region does not
27ac0 20 65 78 69 73 74 2e 20 49 66 20 62 45 78 74 65   exist. If bExte
27ad0 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20 20 20  nd is set to.   
27ae0 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c 20 65       ** false, e
27af0 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70 20 77  xit early. *pp w
27b00 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20 4e 55  ill be set to NU
27b10 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  LL and SQLITE_OK
27b20 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20   returned..     
27b30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
27b40 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a 20 20  ( !bExtend ){.  
27b50 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
27b60 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
27b70 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
27b80 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c 20 69  Alternatively, i
27b90 66 20 62 45 78 74 65 6e 64 20 69 73 20 74 72 75  f bExtend is tru
27ba0 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20 66 69  e, extend the fi
27bb0 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79 0a 20  le. Do this by. 
27bc0 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 69 6e         ** writin
27bd0 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  g a single byte 
27be0 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  to the end of ea
27bf0 63 68 20 28 4f 53 29 20 70 61 67 65 20 62 65 69  ch (OS) page bei
27c00 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  ng.        ** al
27c10 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e  located or exten
27c20 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c 6c 79  ded. Technically
27c30 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79 20 77  , we need only w
27c40 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20 20 20  rite to the.    
27c50 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61 67 65      ** last page
27c60 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65 78 74   in order to ext
27c70 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 42 75  end the file. Bu
27c80 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6c 6c  t writing to all
27c90 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a 2a 20   new.        ** 
27ca0 70 61 67 65 73 20 66 6f 72 63 65 73 20 74 68 65  pages forces the
27cb0 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20   OS to allocate 
27cc0 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65 6c 79  them immediately
27cd0 2c 20 77 68 69 63 68 20 72 65 64 75 63 65 73 0a  , which reduces.
27ce0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63          ** the c
27cf0 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42 55 53  hances of SIGBUS
27d00 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
27d10 20 74 68 65 20 6d 61 70 70 65 64 20 72 65 67 69   the mapped regi
27d20 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20 20 20  on later on..   
27d30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
27d40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
27d50 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
27d60 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a 20 20   pgsz = 4096;.  
27d70 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 67 3b          int iPg;
27d80 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ..          /* W
27d90 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61 73 74  rite to the last
27da0 20 62 79 74 65 20 6f 66 20 65 61 63 68 20 6e 65   byte of each ne
27db0 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  wly allocated or
27dc0 20 65 78 74 65 6e 64 65 64 20 70 61 67 65 20 2a   extended page *
27dd0 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  /.          asse
27de0 72 74 28 20 28 6e 42 79 74 65 20 25 20 70 67 73  rt( (nByte % pgs
27df0 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  z)==0 );.       
27e00 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53 74 61     for(iPg=(sSta
27e10 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a 29 3b  t.st_size/pgsz);
27e20 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67 73 7a   iPg<(nByte/pgsz
27e30 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
27e40 20 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 30         int x = 0
27e50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
27e60 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  ( seekAndWriteFd
27e70 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50  (pShmNode->h, iP
27e80 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c  g*pgsz + pgsz-1,
27e90 20 22 22 2c 20 31 2c 20 26 78 29 21 3d 31 20 29   "", 1, &x)!=1 )
27ea0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
27eb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
27ec0 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  e = pShmNode->zF
27ed0 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ilename;.       
27ee0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
27ef0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
27f00 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22  IOERR_SHMSIZE, "
27f10 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a  write", zFile);.
27f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f                go
27f30 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
27f40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
27f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
27f60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
27f70 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68  }..    /* Map th
27f80 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
27f90 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74  ry region into t
27fa0 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64  his processes ad
27fb0 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a  dress space. */.
27fc0 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61      apNew = (cha
27fd0 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  r **)sqlite3_rea
27fe0 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53  lloc(.        pS
27ff0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
28000 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a  , nReqRegion*siz
28010 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20  eof(char *).    
28020 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65  );.    if( !apNe
28030 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  w ){.      rc = 
28040 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
28050 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67  EM_BKPT;.      g
28060 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
28070 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e  .    }.    pShmN
28080 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20  ode->apRegion = 
28090 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65  apNew;.    while
280a0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  ( pShmNode->nReg
280b0 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29  ion<nReqRegion )
280c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70  {.      int nMap
280d0 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d   = szRegion*nShm
280e0 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e  PerMap;.      in
280f0 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20  t i;.      void 
28100 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  *pMem;.      if(
28110 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
28120 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  ){.        pMem 
28130 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70  = osMmap(0, nMap
28140 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ,.            pS
28150 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
28160 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a  ly ? PROT_READ :
28170 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f   PROT_READ|PROT_
28180 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20  WRITE, .        
28190 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20      MAP_SHARED, 
281a0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52  pShmNode->h, szR
281b0 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e  egion*(i64)pShmN
281c0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20  ode->nRegion.   
281d0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
281e0 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41  if( pMem==MAP_FA
281f0 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
28200 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
28210 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
28220 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c  _SHMMAP, "mmap",
28230 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65   pShmNode->zFile
28240 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  name);.         
28250 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
28260 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
28270 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28280 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33    pMem = sqlite3
28290 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69  _malloc64(szRegi
282a0 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  on);.        if(
282b0 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20   pMem==0 ){.    
282c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
282d0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
282e0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
282f0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
28300 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73    }.        mems
28310 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65  et(pMem, 0, szRe
28320 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  gion);.      }..
28330 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
28340 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b  <nShmPerMap; i++
28350 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
28360 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53  ode->apRegion[pS
28370 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b  hmNode->nRegion+
28380 69 5d 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d  i] = &((char*)pM
28390 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b  em)[szRegion*i];
283a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
283b0 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
283c0 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a   += nShmPerMap;.
283d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61      }.  }..shmpa
283e0 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53  ge_out:.  if( pS
283f0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e  hmNode->nRegion>
28400 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a  iRegion ){.    *
28410 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  pp = pShmNode->a
28420 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d  pRegion[iRegion]
28430 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
28440 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  pp = 0;.  }.  if
28450 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65  ( pShmNode->isRe
28460 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51  adonly && rc==SQ
28470 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53  LITE_OK ) rc = S
28480 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
28490 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
284a0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
284b0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
284c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
284d0 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
284e0 61 74 65 20 66 6f 72 20 61 20 73 68 61 72 65 64  ate for a shared
284f0 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e  -memory segment.
28500 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
28510 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69   the relationshi
28520 70 20 62 65 74 77 65 65 6e 20 53 48 41 52 45 64  p between SHAREd
28530 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c   and EXCLUSIVE l
28540 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65  ocks is a little
28550 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65  .** different he
28560 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78  re than in posix
28570 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29  .  In xShmLock()
28580 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f  , one can go fro
28590 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f  m unlocked.** to
285a0 20 73 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b   shared and back
285b0 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   or from unlocke
285c0 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61  d to exclusive a
285d0 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e  nd back.  But on
285e0 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20  e may.** not go 
285f0 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65  from shared to e
28600 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d  xclusive or from
28610 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68   exclusive to sh
28620 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ared..*/.static 
28630 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28  int unixShmLock(
28640 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
28650 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  *fd,          /*
28660 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
28670 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
28680 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e  d memory */.  in
28690 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
286a0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
286b0 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72  t lock to acquir
286c0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
286d0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
286f0 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  Number of locks 
28700 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
28710 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66  lease */.  int f
28720 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
28730 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f        /* What to
28740 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63   do with the loc
28750 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  k */.){.  unixFi
28760 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
28770 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20  xFile*)fd;      
28780 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f  /* Connection ho
28790 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d  lding shared mem
287a0 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ory */.  unixShm
287b0 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68   *p = pDbFd->pSh
287c0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
287d0 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d  * The shared mem
287e0 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64  ory being locked
287f0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
28800 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
28810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28820 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
28830 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a  all siblings */.
28840 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
28850 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68  ShmNode = p->pSh
28860 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75  mNode;  /* The u
28870 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69  nderlying file i
28880 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Node */.  int rc
28890 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
288a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288b0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
288c0 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20  /.  u16 mask;   
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
288f0 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61  k of locks to ta
28900 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f  ke or release */
28910 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ..  assert( pShm
28920 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  Node==pDbFd->pIn
28930 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b  ode->pShmNode );
28940 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
28950 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62  ode->pInode==pDb
28960 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
28970 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20  assert( ofst>=0 
28980 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54  && ofst+n<=SQLIT
28990 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20  E_SHM_NLOCK );. 
289a0 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b   assert( n>=1 );
289b0 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73  .  assert( flags
289c0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
289d0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
289e0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
289f0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
28a00 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
28a10 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
28a20 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
28a30 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
28a40 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
28a50 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
28a60 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
28a70 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
28a80 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
28a90 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65  USIVE) );.  asse
28aa0 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61  rt( n==1 || (fla
28ab0 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
28ac0 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b  EXCLUSIVE)!=0 );
28ad0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
28ae0 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62  ode->h>=0 || pDb
28af0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
28b00 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20  cessLock==1 );. 
28b10 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
28b20 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d  e->h<0 || pDbFd-
28b30 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
28b40 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d  sLock==0 );..  m
28b50 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b  ask = (1<<(ofst+
28b60 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b  n)) - (1<<ofst);
28b70 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c  .  assert( n>1 |
28b80 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74  | mask==(1<<ofst
28b90 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ) );.  sqlite3_m
28ba0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
28bb0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
28bc0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
28bd0 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  E_SHM_UNLOCK ){.
28be0 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20      u16 allMask 
28bf0 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  = 0; /* Mask of 
28c00 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69  locks held by si
28c10 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f  blings */..    /
28c20 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73 69 62  * See if any sib
28c30 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20  lings hold this 
28c40 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  same lock */.   
28c50 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
28c60 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
28c70 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
28c80 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63     if( pX==p ) c
28c90 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
28ca0 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c  ssert( (pX->excl
28cb0 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d  Mask & (p->exclM
28cc0 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73  ask|p->sharedMas
28cd0 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  k))==0 );.      
28ce0 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73  allMask |= pX->s
28cf0 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d  haredMask;.    }
28d00 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20  ..    /* Unlock 
28d10 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c  the system-level
28d20 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
28d30 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73  ( (mask & allMas
28d40 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  k)==0 ){.      r
28d50 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
28d60 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 55  mLock(pDbFd, F_U
28d70 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  NLCK, ofst+UNIX_
28d80 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
28d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
28da0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
28db0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64     }..    /* Und
28dc0 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  o the local lock
28dd0 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
28de0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28df0 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20      p->exclMask 
28e00 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
28e10 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
28e20 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20   ~mask;.    } . 
28e30 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
28e40 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   & SQLITE_SHM_SH
28e50 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36 20  ARED ){.    u16 
28e60 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20 20  allShared = 0;  
28e70 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b  /* Union of lock
28e80 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63  s held by connec
28e90 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e  tions other than
28ea0 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   "p" */..    /* 
28eb0 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20 73  Find out which s
28ec0 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65 20  hared locks are 
28ed0 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79 20  already held by 
28ee0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
28ef0 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61  ons..    ** If a
28f00 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65 61  ny sibling alrea
28f10 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  dy holds an excl
28f20 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61  usive lock, go a
28f30 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e 0a  head and return.
28f40 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55      ** SQLITE_BU
28f50 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  SY..    */.    f
28f60 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
28f70 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
28f80 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
28f90 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
28fa0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
28fb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
28fc0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
28fd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
28fe0 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72 65  }.      allShare
28ff0 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  d |= pX->sharedM
29000 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
29010 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c 6f  /* Get shared lo
29020 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65  cks at the syste
29030 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63 65  m level, if nece
29040 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
29050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29060 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c 6c  {.      if( (all
29070 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d  Shared & mask)==
29080 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
29090 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
290a0 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c  ock(pDbFd, F_RDL
290b0 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
290c0 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
290d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
290e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
290f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
29100 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6c      /* Get the l
29110 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b  ocal shared lock
29120 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d  s */.    if( rc=
29130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29140 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73      p->sharedMas
29150 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d  k |= mask;.    }
29160 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
29170 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69   Make sure no si
29180 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  bling connection
29190 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61  s hold locks tha
291a0 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69  t will block thi
291b0 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20  s.    ** lock.  
291c0 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72  If any do, retur
291d0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 72 69  n SQLITE_BUSY ri
291e0 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f  ght away..    */
291f0 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d  .    for(pX=pShm
29200 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58  Node->pFirst; pX
29210 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b  ; pX=pX->pNext){
29220 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e  .      if( (pX->
29230 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29  exclMask & mask)
29240 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72  !=0 || (pX->shar
29250 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d  edMask & mask)!=
29260 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
29270 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
29280 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
29290 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
292a0 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78     /* Get the ex
292b0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74  clusive locks at
292c0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
292d0 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63  l.  Then if succ
292e0 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c  essful.    ** al
292f0 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61  so mark the loca
29300 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20  l connection as 
29310 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20  being locked..  
29320 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
29330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
29340 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
29350 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
29360 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b  , F_WRLCK, ofst+
29370 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
29380 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
29390 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
293a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
293b0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d  ->sharedMask & m
293c0 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ask)==0 );.     
293d0 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c     p->exclMask |
293e0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a  = mask;.      }.
293f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
29400 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
29410 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
29420 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48  ;.  OSTRACE(("SH
29430 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c  M-LOCK shmid-%d,
29440 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78   pid-%d got %03x
29450 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20  ,%03x\n",.      
29460 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65       p->id, osGe
29470 74 70 69 64 28 30 29 2c 20 70 2d 3e 73 68 61 72  tpid(0), p->shar
29480 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d  edMask, p->exclM
29490 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ask));.  return 
294a0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
294b0 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20  lement a memory 
294c0 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72  barrier or memor
294d0 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61 72 65  y fence on share
294e0 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a  d memory.  .**.*
294f0 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20  * All loads and 
29500 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62 65 66  stores begun bef
29510 6f 72 65 20 74 68 65 20 62 61 72 72 69 65 72 20  ore the barrier 
29520 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20 62 65  must complete be
29530 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64  fore.** any load
29540 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75 6e 20   or store begun 
29550 61 66 74 65 72 20 74 68 65 20 62 61 72 72 69 65  after the barrie
29560 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
29570 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72  d unixShmBarrier
29580 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
29590 20 2a 66 64 20 20 20 20 20 20 20 20 20 20 20 20   *fd            
295a0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
295b0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
295c0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
295d0 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  /.){.  UNUSED_PA
295e0 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 73  RAMETER(fd);.  s
295f0 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42 61 72 72  qlite3MemoryBarr
29600 69 65 72 28 29 3b 20 20 20 20 20 20 20 20 20 2f  ier();         /
29610 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e  * compiler-defin
29620 65 64 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65  ed memory barrie
29630 72 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72  r */.  unixEnter
29640 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20 20  Mutex();        
29650 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d         /* Also m
29660 75 74 65 78 2c 20 66 6f 72 20 72 65 64 75 6e 64  utex, for redund
29670 61 6e 63 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65  ancy */.  unixLe
29680 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f  aveMutex();.}../
29690 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e  *.** Close a con
296a0 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68 61 72 65  nection to share
296b0 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74  d-memory.  Delet
296c0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
296d0 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20 69 66 20   .** storage if 
296e0 64 65 6c 65 74 65 46 6c 61 67 20 69 73 20 74 72  deleteFlag is tr
296f0 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ue..**.** If the
29700 72 65 20 69 73 20 6e 6f 20 73 68 61 72 65 64 20  re is no shared 
29710 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
29720 64 20 77 69 74 68 20 74 68 65 20 63 6f 6e 6e 65  d with the conne
29730 63 74 69 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a  ction then this.
29740 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  ** routine is a 
29750 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a  harmless no-op..
29760 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
29770 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71  ixShmUnmap(.  sq
29780 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
297a0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
297b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
297c0 0a 20 20 69 6e 74 20 64 65 6c 65 74 65 46 6c 61  .  int deleteFla
297d0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
297e0 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61     /* Delete sha
297f0 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72  red-memory if tr
29800 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53  ue */.){.  unixS
29810 68 6d 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  hm *p;          
29820 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
29830 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
29840 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75  be closed */.  u
29850 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
29860 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
29870 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
29880 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
29890 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ile */.  unixShm
298a0 20 2a 2a 70 70 3b 20 20 20 20 20 20 20 20 20 20   **pp;          
298b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
298c0 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 73 69 62  looping over sib
298d0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
298e0 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   */.  unixFile *
298f0 70 44 62 46 64 3b 20 20 20 20 20 20 20 20 20 20  pDbFd;          
29900 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
29910 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
29920 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46   file */..  pDbF
29930 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
29940 64 3b 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  d;.  p = pDbFd->
29950 70 53 68 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pShm;.  if( p==0
29960 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
29970 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  _OK;.  pShmNode 
29980 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a  = p->pShmNode;..
29990 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
299a0 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
299b0 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
299c0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
299d0 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
299e0 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f  ->pInode );..  /
299f0 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74  * Remove connect
29a00 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20 73  ion p from the s
29a10 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e  et of connection
29a20 73 20 61 73 73 6f 63 69 61 74 65 64 0a 20 20 2a  s associated.  *
29a30 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f 64 65 20  * with pShmNode 
29a40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
29a50 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
29a60 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72  e->mutex);.  for
29a70 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70  (pp=&pShmNode->p
29a80 46 69 72 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b  First; (*pp)!=p;
29a90 20 70 70 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e   pp = &(*pp)->pN
29aa0 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70  ext){}.  *pp = p
29ab0 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46  ->pNext;..  /* F
29ac0 72 65 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ree the connecti
29ad0 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65  on p */.  sqlite
29ae0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 44 62  3_free(p);.  pDb
29af0 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20  Fd->pShm = 0;.  
29b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
29b10 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
29b20 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
29b30 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61  ShmNode->nRef ha
29b40 73 20 72 65 61 63 68 65 64 20 30 2c 20 74 68 65  s reached 0, the
29b50 6e 20 63 6c 6f 73 65 20 74 68 65 20 75 6e 64 65  n close the unde
29b60 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72  rlying.  ** shar
29b70 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20  ed-memory file, 
29b80 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  too */.  unixEnt
29b90 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
29ba0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ert( pShmNode->n
29bb0 52 65 66 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e  Ref>0 );.  pShmN
29bc0 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69  ode->nRef--;.  i
29bd0 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
29be0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  f==0 ){.    if( 
29bf0 64 65 6c 65 74 65 46 6c 61 67 20 26 26 20 70 53  deleteFlag && pS
29c00 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
29c10 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70        osUnlink(p
29c20 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
29c30 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  me);.    }.    u
29c40 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62 46  nixShmPurge(pDbF
29c50 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
29c60 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72  aveMutex();..  r
29c70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
29c80 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}...#else.# def
29c90 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  ine unixShmMap  
29ca0 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
29cb0 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23  ixShmLock    0.#
29cc0 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42   define unixShmB
29cd0 61 72 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e  arrier 0.# defin
29ce0 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20  e unixShmUnmap  
29cf0 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66   0.#endif /* #if
29d00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
29d10 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c  _WAL */..#if SQL
29d20 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
29d30 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20  E>0./*.** If it 
29d40 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d  is currently mem
29d50 6f 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61  ory mapped, unma
29d60 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73  p file pFd..*/.s
29d70 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
29d80 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
29d90 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72  e *pFd){.  asser
29da0 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  t( pFd->nFetchOu
29db0 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t==0 );.  if( pF
29dc0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b  d->pMapRegion ){
29dd0 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46  .    osMunmap(pF
29de0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70  d->pMapRegion, p
29df0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
29e00 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d  al);.    pFd->pM
29e10 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20  apRegion = 0;.  
29e20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
29e30 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
29e40 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30  apSizeActual = 0
29e50 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
29e60 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
29e70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65  e size of the me
29e80 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69  mory mapping mai
29e90 6e 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20  ntained by file 
29ea0 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70  .** descriptor p
29eb0 46 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73  Fd to nNew bytes
29ec0 2e 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  . Any existing m
29ed0 61 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72  apping is discar
29ee0 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ded..**.** If su
29ef0 63 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66  ccessful, this f
29f00 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65  unction sets the
29f10 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
29f20 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  bles:.**.**     
29f30 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52    unixFile.pMapR
29f40 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75  egion.**       u
29f50 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
29f60 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
29f70 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  le.mmapSizeActua
29f80 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63  l.**.** If unsuc
29f90 63 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f  cessful, an erro
29fa0 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67  r message is log
29fb0 67 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f  ged via sqlite3_
29fc0 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65  log() and.** the
29fd0 20 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73   three variables
29fe0 20 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65   above are zeroe
29ff0 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
2a000 53 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a  SQLite should.**
2a010 20 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73   continue access
2a020 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
2a030 20 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64   using the xRead
2a040 28 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a  () and xWrite().
2a050 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ** methods..*/.s
2a060 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52  tatic void unixR
2a070 65 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78  emapfile(.  unix
2a080 46 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20  File *pFd,      
2a090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2a0a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
2a0b0 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e  bject */.  i64 n
2a0c0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20  New             
2a0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2a0e0 71 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73  quired mapping s
2a0f0 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ize */.){.  cons
2a100 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22  t char *zErr = "
2a110 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d  mmap";.  int h =
2a120 20 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20   pFd->h;        
2a130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a140 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
2a150 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65   open on db file
2a160 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20   */.  u8 *pOrig 
2a170 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  = (u8 *)pFd->pMa
2a180 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f  pRegion;   /* Po
2a190 69 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74  inter to current
2a1a0 20 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f   file mapping */
2a1b0 0a 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70  .  i64 nOrig = p
2a1c0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2a1d0 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  al;     /* Size 
2a1e0 6f 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20  of pOrig region 
2a1f0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38  in bytes */.  u8
2a200 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20   *pNew = 0;     
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a220 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f     /* Location o
2a230 66 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f  f new mapping */
2a240 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50  .  int flags = P
2a250 52 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20  ROT_READ;       
2a260 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
2a270 20 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70   to pass to mmap
2a280 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  () */..  assert(
2a290 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d   pFd->nFetchOut=
2a2a0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a2b0 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nNew>pFd->mmapSi
2a2c0 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
2a2d0 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53  nNew<=pFd->mmapS
2a2e0 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65  izeMax );.  asse
2a2f0 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20  rt( nNew>0 );.  
2a300 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61  assert( pFd->mma
2a310 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64  pSizeActual>=pFd
2a320 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
2a330 61 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c  assert( MAP_FAIL
2a340 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66  ED!=0 );..#ifdef
2a350 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41   SQLITE_MMAP_REA
2a360 44 57 52 49 54 45 0a 20 20 69 66 28 20 28 70 46  DWRITE.  if( (pF
2a370 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  d->ctrlFlags & U
2a380 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  NIXFILE_RDONLY)=
2a390 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20 50 52  =0 ) flags |= PR
2a3a0 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e 64 69 66  OT_WRITE;.#endif
2a3b0 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29 7b  ..  if( pOrig ){
2a3c0 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
2a3d0 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65 20  .    i64 nReuse 
2a3e0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b  = pFd->mmapSize;
2a3f0 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74  .#else.    const
2a400 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20 3d   int szSyspage =
2a410 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29   osGetpagesize()
2a420 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  ;.    i64 nReuse
2a430 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a   = (pFd->mmapSiz
2a440 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65 2d  e & ~(szSyspage-
2a450 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  1));.#endif.    
2a460 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72 69  u8 *pReq = &pOri
2a470 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20  g[nReuse];..    
2a480 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61 67  /* Unmap any pag
2a490 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74 69  es of the existi
2a4a0 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74 20  ng mapping that 
2a4b0 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65 64  cannot be reused
2a4c0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65  . */.    if( nRe
2a4d0 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20  use!=nOrig ){.  
2a4e0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65      osMunmap(pRe
2a4f0 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29  q, nOrig-nReuse)
2a500 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41 56  ;.    }..#if HAV
2a510 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e 65  E_MREMAP.    pNe
2a520 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72  w = osMremap(pOr
2a530 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77  ig, nReuse, nNew
2a540 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45  , MREMAP_MAYMOVE
2a550 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22 6d  );.    zErr = "m
2a560 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20  remap";.#else.  
2a570 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
2a580 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73  pReq, nNew-nReus
2a590 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  e, flags, MAP_SH
2a5a0 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65 29  ARED, h, nReuse)
2a5b0 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d  ;.    if( pNew!=
2a5c0 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20  MAP_FAILED ){.  
2a5d0 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70 52      if( pNew!=pR
2a5e0 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  eq ){.        os
2a5f0 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65  Munmap(pNew, nNe
2a600 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20 20  w - nReuse);.   
2a610 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20       pNew = 0;. 
2a620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a630 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69 67      pNew = pOrig
2a640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a650 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54  #endif..    /* T
2a660 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65 78  he attempt to ex
2a670 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69 6e  tend the existin
2a680 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65 64  g mapping failed
2a690 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20  . Free it. */.  
2a6a0 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f    if( pNew==MAP_
2a6b0 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d  FAILED || pNew==
2a6c0 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e  0 ){.      osMun
2a6d0 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73  map(pOrig, nReus
2a6e0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  e);.    }.  }.. 
2a6f0 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20 73   /* If pNew is s
2a700 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74  till NULL, try t
2a710 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74 69  o create an enti
2a720 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e 67  rely new mapping
2a730 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d  . */.  if( pNew=
2a740 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d  =0 ){.    pNew =
2a750 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c   osMmap(0, nNew,
2a760 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52   flags, MAP_SHAR
2a770 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ED, h, 0);.  }..
2a780 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f    if( pNew==MAP_
2a790 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e  FAILED ){.    pN
2a7a0 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77  ew = 0;.    nNew
2a7b0 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f   = 0;.    unixLo
2a7c0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b  gError(SQLITE_OK
2a7d0 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61  , zErr, pFd->zPa
2a7e0 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  th);..    /* If 
2a7f0 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76 65  the mmap() above
2a800 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65 20   failed, assume 
2a810 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75  that all subsequ
2a820 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73  ent mmap() calls
2a830 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f  .    ** will pro
2a840 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20  bably fail too. 
2a850 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73 69  Fall back to usi
2a860 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65 20  ng xRead/xWrite 
2a870 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20 20  exclusively.    
2a880 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
2a890 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d    */.    pFd->mm
2a8a0 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20  apSizeMax = 0;. 
2a8b0 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52 65   }.  pFd->pMapRe
2a8c0 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70  gion = (void *)p
2a8d0 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70  New;.  pFd->mmap
2a8e0 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Size = pFd->mmap
2a8f0 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65  SizeActual = nNe
2a900 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f  w;.}../*.** Memo
2a910 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70 20  ry map or remap 
2a920 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  the file opened 
2a930 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  by file-descript
2a940 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20 66  or pFd (if the f
2a950 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64  ile.** is alread
2a960 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65 78  y mapped, the ex
2a970 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
2a980 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68  s replaced by th
2a990 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a  e new). Or, if .
2a9a0 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64 79  ** there already
2a9b0 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69 6e   exists a mappin
2a9c0 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  g for this file,
2a9d0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 73   and there are s
2a9e0 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e  till .** outstan
2a9f0 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72 65  ding xFetch() re
2aa00 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c 20  ferences to it, 
2aa10 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2aa20 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
2aa30 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42 79  If parameter nBy
2aa40 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  te is non-negati
2aa50 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ve, then it is t
2aa60 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a  he requested siz
2aa70 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70  e of .** the map
2aa80 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e 20  ping to create. 
2aa90 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 42  Otherwise, if nB
2aaa0 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e  yte is less than
2aab0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
2aac0 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73 69  .** requested si
2aad0 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f  ze is the size o
2aae0 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64 69  f the file on di
2aaf0 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20 73  sk. The actual s
2ab00 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72  ize of the.** cr
2ab10 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69 73  eated mapping is
2ab20 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71 75   either the requ
2ab30 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74 68  ested size or th
2ab40 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
2ab50 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c  ed .** using SQL
2ab60 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c  ITE_FCNTL_MMAP_L
2ab70 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72 20  IMIT, whichever 
2ab80 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  is smaller..**.*
2ab90 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
2aba0 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
2abb0 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65 6e  ror occurs (even
2abc0 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67 20   if the mapping 
2abd0 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61  is not.** recrea
2abe0 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  ted as a result 
2abf0 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  of outstanding r
2ac00 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61 6e  eferences) or an
2ac10 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
2ac20 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e   code otherwise.
2ac30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2ac40 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78 46  nixMapfile(unixF
2ac50 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e 4d  ile *pFd, i64 nM
2ac60 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 6e  ap){.  assert( n
2ac70 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e  Map>=0 || pFd->n
2ac80 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
2ac90 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20   assert( nMap>0 
2aca0 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  || (pFd->mmapSiz
2acb0 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61  e==0 && pFd->pMa
2acc0 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20  pRegion==0) );. 
2acd0 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63 68   if( pFd->nFetch
2ace0 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20 53  Out>0 ) return S
2acf0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28  QLITE_OK;..  if(
2ad00 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20 73   nMap<0 ){.    s
2ad10 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
2ad20 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uf;          /* 
2ad30 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69  Low-level file i
2ad40 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
2ad50 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
2ad60 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66 29 20  d->h, &statbuf) 
2ad70 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2ad80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
2ad90 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d  AT;.    }.    nM
2ada0 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ap = statbuf.st_
2adb0 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  size;.  }.  if( 
2adc0 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69  nMap>pFd->mmapSi
2add0 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61  zeMax ){.    nMa
2ade0 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  p = pFd->mmapSiz
2adf0 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  eMax;.  }..  ass
2ae00 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c 7c 20 28  ert( nMap>0 || (
2ae10 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30  pFd->mmapSize==0
2ae20 20 26 26 20 70 46 64 2d 3e 70 4d 61 70 52 65 67   && pFd->pMapReg
2ae30 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  ion==0) );.  if(
2ae40 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70   nMap!=pFd->mmap
2ae50 53 69 7a 65 20 29 7b 0a 20 20 20 20 75 6e 69 78  Size ){.    unix
2ae60 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e  Remapfile(pFd, n
2ae70 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Map);.  }..  ret
2ae80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2ae90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2aea0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2aeb0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  0 */../*.** If p
2aec0 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20  ossible, return 
2aed0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d  a pointer to a m
2aee0 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66  apping of file f
2aef0 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66  d starting at of
2af00 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68  fset.** iOff. Th
2af10 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62  e mapping must b
2af20 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c  e valid for at l
2af30 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e  east nAmt bytes.
2af40 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
2af50 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20   pointer can be 
2af60 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20  obtained, store 
2af70 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65  it in *pp and re
2af80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
2af90 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61  ** Or, if one ca
2afa0 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f  nnot but no erro
2afb0 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70  r occurs, set *p
2afc0 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  p to 0 and retur
2afd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
2afe0 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  Finally, if an e
2aff0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
2b000 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
2b010 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
2b020 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  e final.** value
2b030 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66   of *pp is undef
2b040 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
2b050 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e..**.** If this
2b060 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72   function does r
2b070 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c  eturn a pointer,
2b080 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
2b090 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20   eventually .** 
2b0a0 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
2b0b0 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
2b0c0 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a   unixUnfetch()..
2b0d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2b0e0 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  ixFetch(sqlite3_
2b0f0 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
2b100 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
2b110 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51  id **pp){.#if SQ
2b120 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
2b130 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20  ZE>0.  unixFile 
2b140 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
2b150 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20   *)fd;   /* The 
2b160 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
2b170 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  ase file */.#end
2b180 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23  if.  *pp = 0;..#
2b190 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2b1a0 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
2b1b0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
2b1c0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
2b1d0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
2b1e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
2b1f0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
2b200 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69  Fd, -1);.      i
2b210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b220 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2b230 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
2b240 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
2b250 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
2b260 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
2b270 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
2b280 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
2b290 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
2b2a0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
2b2b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b2c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
2b2d0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
2b2e0 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
2b2f0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
2b300 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a  n releases a .**
2b310 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
2b320 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
2b330 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65  r call to unixFe
2b340 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e  tch(). The secon
2b350 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61  d.** argument pa
2b360 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
2b370 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68  ction must be th
2b380 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f  e same as the co
2b390 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61  rresponding.** a
2b3a0 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73  rgument that was
2b3b0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75   passed to the u
2b3c0 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63  nixFetch() invoc
2b3d0 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72  ation. .**.** Or
2b3e0 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61  , if the third a
2b3f0 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  rgument is NULL,
2b400 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2b410 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
2b420 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72  led .** to infor
2b430 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  m the VFS layer 
2b440 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20  that, according 
2b450 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78  to POSIX, any ex
2b460 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a  isting mapping .
2b470 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
2b480 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
2b490 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
2b4a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2b4b0 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
2b4c0 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
2b4d0 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69  ff, void *p){.#i
2b4e0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
2b4f0 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
2b500 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
2b510 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
2b520 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
2b530 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2b540 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
2b550 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20  ER(iOff);..  /* 
2b560 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74  If p==0 (unmap t
2b570 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20  he entire file) 
2b580 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
2b590 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
2b5a0 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72  g .  ** xFetch r
2b5b0 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69  eferences. Or, i
2b5c0 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20  f p!=0 (meaning 
2b5d0 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20  it is an xFetch 
2b5e0 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a  reference),.  **
2b5f0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
2b600 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
2b610 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a   outstanding.  *
2b620 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d  /.  assert( (p==
2b630 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68  0)==(pFd->nFetch
2b640 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Out==0) );..  /*
2b650 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73   If p!=0, it mus
2b660 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66  t match the iOff
2b670 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73   value. */.  ass
2b680 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d  ert( p==0 || p==
2b690 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
2b6a0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29  pRegion)[iOff] )
2b6b0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
2b6c0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
2b6d0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
2b6e0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
2b6f0 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
2b700 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
2b710 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20  ut>=0 );.#else. 
2b720 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2b730 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
2b740 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
2b750 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2b760 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  (iOff);.#endif. 
2b770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2b780 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
2b790 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
2b7a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
2b7b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
2b7c0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
2b7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
2b7e0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
2b7f0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
2b800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b810 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
2b820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b860 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
2b870 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
2b880 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
2b890 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
2b8a0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
2b8b0 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
2b8c0 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
2b8d0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
2b8e0 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
2b8f0 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
2b900 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
2b910 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
2b920 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
2b930 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
2b940 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
2b950 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
2b960 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
2b970 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
2b980 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
2b990 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
2b9a0 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
2b9b0 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
2b9c0 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
2b9d0 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
2b9e0 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
2b9f0 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
2ba00 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
2ba10 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
2ba20 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
2ba30 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
2ba40 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
2ba50 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
2ba60 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
2ba70 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
2ba80 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
2ba90 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
2baa0 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
2bab0 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
2bac0 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
2bad0 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
2bae0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
2baf0 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
2bb00 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
2bb10 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46  inder-function F
2bb20 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72  , two objects ar
2bb30 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  e created:.**.**
2bb40 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c      (1) The real
2bb50 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
2bb60 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22   named "FImpt()"
2bb70 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41  ..**.**    (2) A
2bb80 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65   constant pointe
2bb90 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  r to this functi
2bba0 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46  on named just "F
2bbb0 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  "..**.**.** A po
2bbc0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70  inter to the F p
2bbd0 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61  ointer is used a
2bbe0 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76  s the pAppData v
2bbf0 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20  alue for VFS.** 
2bc00 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76  objects.  We hav
2bc10 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73  e to do this ins
2bc20 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20  tead of letting 
2bc30 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a  pAppData point.*
2bc40 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68  * directly at th
2bc50 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
2bc60 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65  n since C90 rule
2bc70 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64  s prevent a void
2bc80 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73  *.** from be cas
2bc90 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f  t into a functio
2bca0 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  n pointer..**.**
2bcb0 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63  .** Each instanc
2bcc0 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20  e of this macro 
2bcd0 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62  generates two ob
2bce0 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  jects:.**.**   *
2bcf0 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c    A constant sql
2bd00 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2bd10 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48  object call METH
2bd20 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  OD that has lock
2bd30 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68  ing.**      meth
2bd40 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ods CLOSE, LOCK,
2bd50 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f   UNLOCK, CKRESLO
2bd60 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  CK..**.**   *  A
2bd70 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e  n I/O method fin
2bd80 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  der function cal
2bd90 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20  led FINDER that 
2bda0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
2bdb0 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  r.**      to the
2bdc0 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69   METHOD object i
2bdd0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  n the previous b
2bde0 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ullet..*/.#defin
2bdf0 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44  e IOMETHODS(FIND
2be00 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f  ER,METHOD,VERSIO
2be10 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c  N,CLOSE,LOCK,UNL
2be20 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41  OCK,CKLOCK,SHMMA
2be30 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20  P)     \.static 
2be40 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2be50 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20  _methods METHOD 
2be60 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  = {             
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49        \.   VERSI
2be90 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ON,             
2bea0 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
2beb0 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
2bec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bed0 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c       \.   CLOSE,
2bee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bef0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
2bf00 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2bf10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61      \.   unixRea
2bf30 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2bf40 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf70 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74     \.   unixWrit
2bf80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2bf90 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
2bfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfc0 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63    \.   unixTrunc
2bfd0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
2bfe0 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
2bff0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2c000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c010 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20   \.   unixSync, 
2c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c030 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20    /* xSync */   
2c040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c060 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  \.   unixFileSiz
2c070 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2c080 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2c0b0 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20  .   LOCK,       
2c0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0d0 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  /* xLock */     
2c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2c100 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20     UNLOCK,      
2c110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c120 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20  * xUnlock */    
2c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c140 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2c150 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20    CKLOCK,       
2c160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c170 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2c180 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
2c190 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2c1a0 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
2c1b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
2c1c0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20  xFileControl */ 
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2c1f0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20  unixSectorSize, 
2c200 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c210 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20  SectorSize */   
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c230 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2c240 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
2c250 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
2c260 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65  eviceCapabilitie
2c270 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
2c280 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48           \.   SH
2c290 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20  MMAP,           
2c2a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2c2b0 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  mMap */         
2c2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2c2e0 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  xShmLock,       
2c2f0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2c300 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
2c310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c320 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2c330 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
2c340 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
2c350 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20  arrier */       
2c360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c370 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
2c380 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
2c390 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
2c3a0 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  map */          
2c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c3c0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65       \.   unixFe
2c3d0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
2c3e0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
2c3f0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66      \.   unixUnf
2c420 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
2c430 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68       /* xUnfetch
2c440 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2c450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c460 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20     \.};         
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4b0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
2c4c0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c4d0 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70  ods *FINDER##Imp
2c4e0 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  l(const char *z,
2c4f0 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20   unixFile *p){  
2c500 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   \.  UNUSED_PARA
2c510 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44  METER(z); UNUSED
2c520 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20  _PARAMETER(p);  
2c530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c550 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48  \.  return &METH
2c560 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OD;             
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2c5a0 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .}              
2c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2c5f0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2c600 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c610 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29  *(*const FINDER)
2c620 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2c630 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20  xFile *p)    \. 
2c640 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70     = FINDER##Imp
2c650 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61  l;../*.** Here a
2c660 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71  re all of the sq
2c670 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2c680 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
2c690 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  h of the.** lock
2c6a0 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
2c6b0 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   Functions that 
2c6c0 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20  return pointers 
2c6d0 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  to these methods
2c6e0 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65  .** are also cre
2c6f0 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f  ated..*/.IOMETHO
2c700 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e  DS(.  posixIoFin
2c710 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
2c720 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
2c730 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73  on name */.  pos
2c740 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ixIoMethods,    
2c750 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
2c760 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
2c770 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c  ect name */.  3,
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c790 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
2c7a0 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61  d memory and mma
2c7b0 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f  p are enabled */
2c7c0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
2c7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c7e0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2c7f0 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
2c800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c810 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2c820 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
2c830 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2c840 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2c850 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
2c860 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  rvedLock,    /* 
2c870 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2c880 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
2c890 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20  nixShmMap       
2c8a0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2c8b0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2c8c0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
2c8d0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
2c8e0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2c8f0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2c900 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
2c910 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
2c920 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c930 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2c940 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20  */.  3,         
2c950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c960 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2c970 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2c980 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20   nolockClose,   
2c990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2c9a0 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2c9b0 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20   nolockLock,    
2c9c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2c9d0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2c9e0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  nolockUnlock,   
2c9f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2ca00 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2ca10 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
2ca20 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43  rvedLock,  /* xC
2ca30 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2ca40 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca60 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2ca70 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  p method */.).IO
2ca80 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f  METHODS(.  dotlo
2ca90 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2caa0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2cab0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2cac0 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f    dotlockIoMetho
2cad0 64 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ds,         /* s
2cae0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2caf0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2cb00 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2cb10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cb20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2cb30 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64   disabled */.  d
2cb40 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  otlockClose,    
2cb50 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2cb60 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  se method */.  d
2cb70 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  otlockLock,     
2cb80 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2cb90 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
2cba0 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  tlockUnlock,    
2cbb0 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2cbc0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
2cbd0 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  otlockCheckReser
2cbe0 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65  vedLock, /* xChe
2cbf0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2cc00 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2cc30 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
2cc40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2cc50 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
2cc60 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49  ETHODS(.  flockI
2cc70 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
2cc80 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
2cc90 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
2cca0 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c   flockIoMethods,
2ccb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
2ccc0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2ccd0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
2cce0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2cd00 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2cd10 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c  disabled */.  fl
2cd20 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
2cd30 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
2cd40 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  e method */.  fl
2cd50 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
2cd60 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
2cd70 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
2cd80 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
2cd90 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
2cda0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c  k method */.  fl
2cdb0 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
2cdc0 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63  Lock,   /* xChec
2cdd0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
2cde0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce00 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2ce10 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2ce20 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  f..#if OS_VXWORK
2ce30 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73  S.IOMETHODS(.  s
2ce40 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  emIoFinder,     
2ce50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
2ce60 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
2ce70 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f   */.  semIoMetho
2ce80 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
2ce90 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
2cea0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
2ceb0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
2cec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ced0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
2cee0 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
2cef0 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20  .  semXClose,   
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf10 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
2cf20 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20  .  semXLock,    
2cf30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cf40 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
2cf50 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20    semXUnlock,   
2cf60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2cf70 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
2cf80 0a 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65  .  semXCheckRese
2cf90 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  rvedLock,    /* 
2cfa0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
2cfb0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
2cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfd0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2cfe0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2cff0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
2d000 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2d010 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2d020 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f  LOCKING_STYLE.IO
2d030 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f  METHODS(.  afpIo
2d040 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2d050 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
2d060 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
2d070 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20    afpIoMethods, 
2d080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2d090 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2d0a0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
2d0b0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
2d0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d0d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
2d0e0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61   disabled */.  a
2d0f0 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  fpClose,        
2d100 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2d110 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  se method */.  a
2d120 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  fpLock,         
2d130 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
2d140 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
2d150 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  pUnlock,        
2d160 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
2d170 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61  ck method */.  a
2d180 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
2d190 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65  ock,     /* xChe
2d1a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
2d1b0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
2d1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d1d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
2d1e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
2d1f0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72  if../*.** The pr
2d200 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  oxy locking meth
2d210 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d  od is a "super-m
2d220 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65  ethod" in the se
2d230 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f  nse that it.** o
2d240 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66  pens secondary f
2d250 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
2d260 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e  for the conch an
2d270 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64  d lock files and
2d280 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78  .** it uses prox
2d290 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50  y, dot-file, AFP
2d2a0 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f  , and flock() lo
2d2b0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e  cking methods on
2d2c0 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64   those.** second
2d2d0 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20  ary files.  For 
2d2e0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
2d2f0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
2d300 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f  mplements.** pro
2d310 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f  xy locking is lo
2d320 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68  cated much furth
2d330 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66  er down in the f
2d340 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65  ile.  But we nee
2d350 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64  d.** to go ahead
2d360 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20   and define the 
2d370 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2d380 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75  ds and finder fu
2d390 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72  nction.** for pr
2d3a0 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65  oxy locking here
2d3b0 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64  .  So we forward
2d3c0 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f   declare the I/O
2d3d0 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66   methods..*/.#if
2d3e0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2d3f0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
2d400 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2d410 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  LE.static int pr
2d420 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  oxyClose(sqlite3
2d430 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  _file*);.static 
2d440 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71  int proxyLock(sq
2d450 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
2d460 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
2d470 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  oxyUnlock(sqlite
2d480 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
2d490 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
2d4a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2d4b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2d4c0 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53  int*);.IOMETHODS
2d4d0 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65  (.  proxyIoFinde
2d4e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r,            /*
2d4f0 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
2d500 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79   name */.  proxy
2d510 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
2d520 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2d530 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2d540 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2d550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d560 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
2d570 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
2d580 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f  ed */.  proxyClo
2d590 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2d5a0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
2d5b0 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  od */.  proxyLoc
2d5c0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
2d5d0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2d5e0 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f  d */.  proxyUnlo
2d5f0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2d600 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
2d610 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65  od */.  proxyChe
2d620 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2d630 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
2d640 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
2d650 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
2d660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d670 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
2d680 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  */.).#endif../* 
2d690 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58  nfs lockd on OSX
2d6a0 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63   10.3+ doesn't c
2d6b0 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73  lear write locks
2d6c0 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63   when a read loc
2d6d0 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20  k is set */.#if 
2d6e0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2d6f0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2d700 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2d710 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e  E.IOMETHODS(.  n
2d720 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fsIoFinder,     
2d730 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2d740 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2d750 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68  e */.  nfsIoMeth
2d760 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ods,            
2d770 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
2d780 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
2d790 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
2d7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7b0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2d7c0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2d7d0 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
2d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d7f0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2d800 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
2d810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d820 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
2d830 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b  d */.  nfsUnlock
2d840 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2d850 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
2d860 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65  hod */.  unixChe
2d870 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
2d880 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
2d890 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
2d8a0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
2d8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d8c0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2d8d0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2d8e0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2d8f0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2d900 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d910 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69  STYLE./* .** Thi
2d920 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  s "finder" funct
2d930 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  ion attempts to 
2d940 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
2d950 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  st locking strat
2d960 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20  egy .** for the 
2d970 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 22 66  database file "f
2d980 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20 74 68  ilePath".  It th
2d990 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  en returns the s
2d9a0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2d9b0 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74  s.** object that
2d9c0 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74   implements that
2d9d0 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a   strategy..**.**
2d9e0 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63   This is for Mac
2d9f0 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61  OSX only..*/.sta
2da00 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
2da10 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75  3_io_methods *au
2da20 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
2da30 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pl(.  const char
2da40 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f   *filePath,    /
2da50 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
2da60 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2da70 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20   unixFile *pNew 
2da80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65            /* ope
2da90 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f  n file object fo
2daa0 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
2dab0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74  ile */.){.  stat
2dac0 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
2dad0 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f  Mapping {.    co
2dae0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73  nst char *zFiles
2daf0 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20  ystem;          
2db00 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65      /* Filesyste
2db10 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20  m type name */. 
2db20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33     const sqlite3
2db30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65  _io_methods *pMe
2db40 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72  thods;   /* Appr
2db50 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
2db60 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d  method */.  } aM
2db70 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  ap[] = {.    { "
2db80 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  hfs",    &posixI
2db90 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
2dba0 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73  { "ufs",    &pos
2dbb0 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2dbc0 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26     { "afpfs",  &
2dbd0 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  afpIoMethods },.
2dbe0 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20      { "smbfs",  
2dbf0 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  &afpIoMethods },
2dc00 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c  .    { "webdav",
2dc10 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
2dc20 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20  s },.    { 0, 0 
2dc30 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  }.  };.  int i;.
2dc40 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20    struct statfs 
2dc50 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74  fsInfo;.  struct
2dc60 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b   flock lockInfo;
2dc70 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74  ..  if( !filePat
2dc80 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66  h ){.    /* If f
2dc90 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68  ilePath==NULL th
2dca0 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20  at means we are 
2dcb0 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74  dealing with a t
2dcc0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20  ransient file.  
2dcd0 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e    ** that does n
2dce0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
2dcf0 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74  cked. */.    ret
2dd00 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
2dd10 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20  hods;.  }.  if( 
2dd20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c  statfs(filePath,
2dd30 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20   &fsInfo) != -1 
2dd40 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66  ){.    if( fsInf
2dd50 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f  o.f_flags & MNT_
2dd60 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20  RDONLY ){.      
2dd70 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2dd80 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20  Methods;.    }. 
2dd90 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70     for(i=0; aMap
2dda0 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b  [i].zFilesystem;
2ddb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
2ddc0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
2ddd0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61  _fstypename, aMa
2dde0 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d  p[i].zFilesystem
2ddf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2de00 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70  return aMap[i].p
2de10 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d  Methods;.      }
2de20 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2de30 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48   Default case. H
2de40 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20  andles, amongst 
2de50 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20  others, "nfs".. 
2de60 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61   ** Test byte-ra
2de70 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66  nge lock using f
2de80 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63  cntl(). If the c
2de90 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20  all succeeds, . 
2dea0 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20   ** assume that 
2deb0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
2dec0 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73  supports POSIX s
2ded0 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a  tyle locks. .  *
2dee0 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c  /.  lockInfo.l_l
2def0 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e  en = 1;.  lockIn
2df00 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a  fo.l_start = 0;.
2df10 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65    lockInfo.l_whe
2df20 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
2df30 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70    lockInfo.l_typ
2df40 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69  e = F_RDLCK;.  i
2df50 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d  f( osFcntl(pNew-
2df60 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
2df70 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a  ckInfo)!=-1 ) {.
2df80 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
2df90 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
2dfa0 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b  me, "nfs")==0 ){
2dfb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
2dfc0 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  fsIoMethods;.   
2dfd0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2dfe0 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
2dff0 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20  ethods;.    }.  
2e000 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
2e010 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  n &dotlockIoMeth
2e020 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
2e030 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2e040 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
2e050 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49  *const autolockI
2e060 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63  oFinder)(const c
2e070 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20  har*,unixFile*) 
2e080 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  = autolockIoFind
2e090 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20  erImpl;..#endif 
2e0a0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
2e0b0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2e0c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2e0d0 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f  TYLE */..#if OS_
2e0e0 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68  VXWORKS./*.** Th
2e0f0 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63  is "finder" func
2e100 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73  tion for VxWorks
2e110 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69   checks to see i
2e120 66 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  f posix advisory
2e130 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b  .** locking work
2e140 73 2e 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20  s.  If it does, 
2e150 74 68 65 6e 20 74 68 61 74 20 69 73 20 77 68 61  then that is wha
2e160 74 20 69 73 20 75 73 65 64 2e 20 20 49 66 20 69  t is used.  If i
2e170 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f  t does not.** wo
2e180 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63  rk, then fallbac
2e190 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70  k to named semap
2e1a0 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  hore locking..*/
2e1b0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2e1c0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2e1d0 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65   *vxworksIoFinde
2e1e0 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2e1f0 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2e200 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2e210 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2e220 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2e230 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2e240 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62  the open file ob
2e250 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  ject */.){.  str
2e260 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2e270 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2e280 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2e290 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2e2a0 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2e2b0 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2e2c0 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2e2d0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2e2e0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2e2f0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2e300 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2e310 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20  Methods;.  }..  
2e320 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c  /* Test if fcntl
2e330 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64 20  () is supported 
2e340 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73 74  and use POSIX st
2e350 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20  yle locks..  ** 
2e360 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62  Otherwise fall b
2e370 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64  ack to the named
2e380 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f   semaphore metho
2e390 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  d..  */.  lockIn
2e3a0 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
2e3b0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
2e3c0 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
2e3d0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
2e3e0 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
2e3f0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
2e400 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
2e410 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
2e420 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
2e430 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  1 ) {.    return
2e440 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2e450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
2e460 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68  eturn &semIoMeth
2e470 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69  ods;.  }.}.stati
2e480 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
2e490 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28  io_methods .  *(
2e4a0 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f  *const vxworksIo
2e4b0 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68  Finder)(const ch
2e4c0 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d  ar*,unixFile*) =
2e4d0 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72   vxworksIoFinder
2e4e0 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
2e4f0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a   OS_VXWORKS */..
2e500 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63  /*.** An abstrac
2e510 74 20 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69  t type for a poi
2e520 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65  nter to an IO me
2e530 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
2e540 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66  tion:.*/.typedef
2e550 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2e560 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e  o_methods *(*fin
2e570 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20  der_type)(const 
2e580 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
2e590 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.../***********
2e5a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e5e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2e5f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73  ************** s
2e600 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f  qlite3_vfs metho
2e610 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
2e620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2e630 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73  **.** This divis
2e640 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
2e650 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2e660 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68  of methods on th
2e670 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  e.** sqlite3_vfs
2e680 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a   object..*/../*.
2e690 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
2e6a0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2e6b0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
2e6c0 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  ture pointed to 
2e6d0 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69  by pId..*/.stati
2e6e0 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78  c int fillInUnix
2e6f0 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  File(.  sqlite3_
2e700 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
2e710 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66  /* Pointer to vf
2e720 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  s object */.  in
2e730 74 20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  t h,            
2e740 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69        /* Open fi
2e750 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66  le descriptor of
2e760 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e   file being open
2e770 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2e780 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
2e790 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
2e7a0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
2e7b0 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
2e7c0 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
2e7d0 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
2e7e0 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
2e7f0 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63  pened */.  int c
2e800 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20  trlFlags        
2e810 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f     /* Zero or mo
2e820 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61  re UNIXFILE_* va
2e830 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  lues */.){.  con
2e840 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
2e850 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53  thods *pLockingS
2e860 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65  tyle;.  unixFile
2e870 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69   *pNew = (unixFi
2e880 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20  le *)pId;.  int 
2e890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2e8a0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d  .  assert( pNew-
2e8b0 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b  >pInode==NULL );
2e8c0 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e  ..  /* No lockin
2e8d0 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70  g occurs in temp
2e8e0 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20  orary files */. 
2e8f0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
2e900 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c  me!=0 || (ctrlFl
2e910 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
2e920 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20  OLOCK)!=0 );..  
2e930 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20  OSTRACE(("OPEN  
2e940 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
2e950 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
2e960 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  pNew->h = h;.  p
2e970 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73  New->pVfs = pVfs
2e980 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20  ;.  pNew->zPath 
2e990 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70  = zFilename;.  p
2e9a0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d  New->ctrlFlags =
2e9b0 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a   (u8)ctrlFlags;.
2e9c0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
2e9d0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65  MAP_SIZE>0.  pNe
2e9e0 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d  w->mmapSizeMax =
2e9f0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2ea00 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e  nfig.szMmap;.#en
2ea10 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65  dif.  if( sqlite
2ea20 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28  3_uri_boolean(((
2ea30 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
2ea40 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c  FILE_URI) ? zFil
2ea50 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20  ename : 0),.    
2ea60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea70 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53         "psow", S
2ea80 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f  QLITE_POWERSAFE_
2ea90 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20  OVERWRITE) ){.  
2eaa0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2eab0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53  s |= UNIXFILE_PS
2eac0 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  OW;.  }.  if( st
2ead0 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65  rcmp(pVfs->zName
2eae0 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30  ,"unix-excl")==0
2eaf0 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
2eb00 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
2eb10 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23  ILE_EXCL;.  }..#
2eb20 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2eb30 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f  pNew->pId = vxwo
2eb40 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46  rksFindFileId(zF
2eb50 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20  ilename);.  if( 
2eb60 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a  pNew->pId==0 ){.
2eb70 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
2eb80 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2eb90 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
2eba0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2ebb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
2ebc0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
2ebd0 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20  FILE_NOLOCK ){. 
2ebe0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
2ebf0 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
2ec00 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2ec10 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
2ec20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
2ec30 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
2ec40 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
2ec50 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
2ec60 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2ec70 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
2ec80 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
2ec90 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
2eca0 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
2ecb0 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
2ecc0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
2ecd0 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
2ece0 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
2ecf0 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
2ed00 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
2ed10 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
2ed20 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
2ed30 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
2ed40 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
2ed50 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
2ed60 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
2ed70 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
2ed80 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
2ed90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2eda0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
2edb0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2edc0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2edd0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2ede0 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
2edf0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
2ee00 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
2ee10 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  if.  ){.    unix
2ee20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2ee30 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
2ee40 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
2ee50 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
2ee60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ee70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
2ee80 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
2ee90 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d in findInodeIn
2eea0 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
2eeb0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
2eec0 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
2eed0 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
2eee0 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
2eef0 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  . findInodeInfo(
2ef00 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20  ) may fail.     
2ef10 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61   ** in two scena
2ef20 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  rios:.      **. 
2ef30 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20       **   (a) A 
2ef40 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20  call to fstat() 
2ef50 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
2ef60 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20     (b) A malloc 
2ef70 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
2ef80 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72  .      ** Scenar
2ef90 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20  io (b) may only 
2efa0 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f  occur if the pro
2efb0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
2efc0 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  no other.      *
2efd0 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
2efe0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  rs open on the s
2eff0 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ame file. If the
2f000 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69  re were other fi
2f010 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
2f020 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20  riptors on this 
2f030 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61  file, then no ma
2f040 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65  lloc would be re
2f050 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
2f060 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  ** findInodeInfo
2f070 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  (). If this is t
2f080 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71  he case, it is q
2f090 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  uite safe to clo
2f0a0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
2f0b0 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20  le h - as it is 
2f0c0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
2f0d0 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77  no posix locks w
2f0e0 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a  ill be released.
2f0f0 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e        ** by doin
2f100 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  g so..      **. 
2f110 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61       ** If scena
2f120 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74  rio (a) caused t
2f130 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68  he error then th
2f140 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20  ings are not so 
2f150 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20  safe. The.      
2f160 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75  ** implicit assu
2f170 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74  mption here is t
2f180 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66  hat if fstat() f
2f190 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65  ails, things are
2f1a0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63   in.      ** suc
2f1b0 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74  h bad shape that
2f1c0 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b   dropping a lock
2f1d0 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20   or two doesn't 
2f1e0 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20  matter much..   
2f1f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
2f200 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2f210 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2f220 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     h = -1;.    }
2f230 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2f240 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  tex();.  }..#if 
2f250 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2f260 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
2f270 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2f280 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ).  else if( pLo
2f290 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61  ckingStyle == &a
2f2a0 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
2f2b0 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e     /* AFP lockin
2f2c0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2f2d0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2f2e0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
2f2f0 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66  in.    ** the af
2f300 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e  pLockingContext.
2f310 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c  .    */.    afpL
2f320 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
2f330 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  Ctx;.    pNew->l
2f340 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
2f350 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
2f360 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
2f370 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66  *pCtx) );.    if
2f380 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20  ( pCtx==0 ){.   
2f390 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2f3a0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  OMEM_BKPT;.    }
2f3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e  else{.      /* N
2f3c0 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69  B: zFilename exi
2f3d0 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20  sts and remains 
2f3e0 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
2f3f0 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20  file is closed. 
2f400 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e       ** accordin
2f410 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74  g to requirement
2f420 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20   F11141.  So we 
2f430 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d  do not need to m
2f440 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ake a.      ** c
2f450 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e  opy of the filen
2f460 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43  ame. */.      pC
2f470 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69  tx->dbPath = zFi
2f480 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43  lename;.      pC
2f490 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30  tx->reserved = 0
2f4a0 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64  ;.      srandomd
2f4b0 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78  ev();.      unix
2f4c0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
2f4d0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2f4e0 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2f4f0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2f500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2f510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2f520 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
2f530 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
2f540 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75  t);.        robu
2f550 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
2f560 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2f570 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2f580 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c     }.      unixL
2f590 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20  eaveMutex();    
2f5a0 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23      .    }.  }.#
2f5b0 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66  endif..  else if
2f5c0 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2f5d0 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74  == &dotlockIoMet
2f5e0 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44  hods ){.    /* D
2f5f0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75  otfile locking u
2f600 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
2f610 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
2f620 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
2f630 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f      ** the dotlo
2f640 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ckLockingContext
2f650 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61   .    */.    cha
2f660 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20  r *zLockFile;.  
2f670 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b    int nFilename;
2f680 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69  .    assert( zFi
2f690 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  lename!=0 );.   
2f6a0 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e   nFilename = (in
2f6b0 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61  t)strlen(zFilena
2f6c0 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f  me) + 6;.    zLo
2f6d0 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
2f6e0 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36  )sqlite3_malloc6
2f6f0 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  4(nFilename);.  
2f700 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d    if( zLockFile=
2f710 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
2f720 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
2f730 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  PT;.    }else{. 
2f740 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2f750 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c  rintf(nFilename,
2f760 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22   zLockFile, "%s"
2f770 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c   DOTLOCK_SUFFIX,
2f780 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20   zFilename);.   
2f790 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63   }.    pNew->loc
2f7a0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c  kingContext = zL
2f7b0 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69  ockFile;.  }..#i
2f7c0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65  f OS_VXWORKS.  e
2f7d0 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
2f7e0 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d  Style == &semIoM
2f7f0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a  ethods ){.    /*
2f800 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
2f810 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68   locking uses th
2f820 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69  e file path so i
2f830 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  t needs to be.  
2f840 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e    ** included in
2f850 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43   the semLockingC
2f860 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20  ontext.    */.  
2f870 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2f880 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2f890 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2f8a0 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2f8b0 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53 51  .    if( (rc==SQ
2f8c0 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65  LITE_OK) && (pNe
2f8d0 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d  w->pInode->pSem=
2f8e0 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  =NULL) ){.      
2f8f0 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d  char *zSemName =
2f900 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61   pNew->pInode->a
2f910 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  SemName;.      i
2f920 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt n;.      sqli
2f930 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58  te3_snprintf(MAX
2f940 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e  _PATHNAME, zSemN
2f950 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a  ame, "/%s.sem",.
2f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f970 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 64         pNew->pId
2f980 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
2f990 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e 3d  );.      for( n=
2f9a0 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20  1; zSemName[n]; 
2f9b0 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69 66  n++ ).        if
2f9c0 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27  ( zSemName[n]=='
2f9d0 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  /' ) zSemName[n]
2f9e0 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e   = '_';.      pN
2f9f0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
2fa00 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d   = sem_open(zSem
2fa10 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30  Name, O_CREAT, 0
2fa20 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  666, 1);.      i
2fa30 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d  f( pNew->pInode-
2fa40 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49  >pSem == SEM_FAI
2fa50 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 72  LED ){.        r
2fa60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2fa70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 70  _BKPT;.        p
2fa80 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65  New->pInode->aSe
2fa90 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b  mName[0] = '\0';
2faa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2fab0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2fac0 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  x();.  }.#endif.
2fad0 20 20 0a 20 20 73 74 6f 72 65 4c 61 73 74 45 72    .  storeLastEr
2fae0 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69  rno(pNew, 0);.#i
2faf0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
2fb00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2fb10 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30   ){.    if( h>=0
2fb20 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28   ) robust_close(
2fb30 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
2fb40 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a  _);.    h = -1;.
2fb50 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69      osUnlink(zFi
2fb60 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65  lename);.    pNe
2fb70 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2fb80 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
2fb90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
2fba0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2fbb0 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
2fbc0 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
2fbd0 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2fbe0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2fbf0 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
2fc00 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20  pLockingStyle;. 
2fc10 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b     OpenCounter(+
2fc20 31 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62  1);.    verifyDb
2fc30 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  File(pNew);.  }.
2fc40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fc50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
2fc60 20 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63   name of a direc
2fc70 74 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f  tory in which to
2fc80 20 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66   put temporary f
2fc90 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73  iles..** If no s
2fca0 75 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72  uitable temporar
2fcb0 79 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79  y file directory
2fcc0 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72   can be found, r
2fcd0 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
2fce0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
2fcf0 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69   *unixTempFileDi
2fd00 72 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  r(void){.  stati
2fd10 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
2fd20 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
2fd30 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  0,.     0,.     
2fd40 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
2fd50 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
2fd60 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22    "/tmp",.     "
2fd70 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  .".  };.  unsign
2fd80 65 64 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  ed int i = 0;.  
2fd90 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
2fda0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2fdb0 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  Dir = sqlite3_te
2fdc0 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20  mp_directory;.. 
2fdd0 20 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20   if( !azDirs[0] 
2fde0 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65  ) azDirs[0] = ge
2fdf0 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50  tenv("SQLITE_TMP
2fe00 44 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a  DIR");.  if( !az
2fe10 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73  Dirs[1] ) azDirs
2fe20 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d  [1] = getenv("TM
2fe30 50 44 49 52 22 29 3b 0a 20 20 77 68 69 6c 65 28  PDIR");.  while(
2fe40 31 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72  1){.    if( zDir
2fe50 21 3d 30 0a 20 20 20 20 20 26 26 20 6f 73 53 74  !=0.     && osSt
2fe60 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 3d 3d  at(zDir, &buf)==
2fe70 30 0a 20 20 20 20 20 26 26 20 53 5f 49 53 44 49  0.     && S_ISDI
2fe80 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20  R(buf.st_mode). 
2fe90 20 20 20 20 26 26 20 6f 73 41 63 63 65 73 73 28      && osAccess(
2fea0 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a 20 20 20  zDir, 03)==0.   
2feb0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2fec0 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20   zDir;.    }.   
2fed0 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
2fee0 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a  zDirs)/sizeof(az
2fef0 44 69 72 73 5b 30 5d 29 20 29 20 62 72 65 61 6b  Dirs[0]) ) break
2ff00 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44  ;.    zDir = azD
2ff10 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20  irs[i++];.  }.  
2ff20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2ff30 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70  ** Create a temp
2ff40 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20  orary file name 
2ff50 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d  in zBuf.  zBuf m
2ff60 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ust be allocated
2ff70 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69  .** by the calli
2ff80 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d  ng process and m
2ff90 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67  ust be big enoug
2ffa0 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61  h to hold at lea
2ffb0 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61  st.** pVfs->mxPa
2ffc0 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f  thname bytes..*/
2ffd0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2ffe0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
2fff0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
30000 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
30010 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69  *zDir;.  int iLi
30020 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  mit = 0;..  /* I
30030 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
30040 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
30050 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
30060 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
30070 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
30080 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
30090 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
300a0 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
300b0 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
300c0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
300d0 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30  */.  zBuf[0] = 0
300e0 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
300f0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
30100 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a  TE_IOERR );..  z
30110 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69  Dir = unixTempFi
30120 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a  leDir();.  if( z
30130 44 69 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Dir==0 ) return 
30140 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54  SQLITE_IOERR_GET
30150 54 45 4d 50 50 41 54 48 3b 0a 20 20 64 6f 7b 0a  TEMPPATH;.  do{.
30160 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 73      u64 r;.    s
30170 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
30180 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29  s(sizeof(r), &r)
30190 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e 42  ;.    assert( nB
301a0 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75 66  uf>2 );.    zBuf
301b0 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20  [nBuf-2] = 0;.  
301c0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
301d0 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22  tf(nBuf, zBuf, "
301e0 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f  %s/"SQLITE_TEMP_
301f0 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c 78  FILE_PREFIX"%llx
30200 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %c",.           
30210 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c 20            zDir, 
30220 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  r, 0);.    if( z
30230 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c  Buf[nBuf-2]!=0 |
30240 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20  | (iLimit++)>10 
30250 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
30260 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28  ERROR;.  }while(
30270 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30   osAccess(zBuf,0
30280 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  )==0 );.  return
30290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
302a0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
302b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
302c0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
302d0 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69  E__)./*.** Routi
302e0 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20  ne to transform 
302f0 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20  a unixFile into 
30300 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  a proxy-locking 
30310 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70  unixFile..** Imp
30320 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74  lementation in t
30330 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69  he proxy-lock di
30340 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64  vision, but used
30350 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a   by unixOpen().*
30360 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46  * if SQLITE_PREF
30370 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47  ER_PROXY_LOCKING
30380 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
30390 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
303a0 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
303b0 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e  e(unixFile*, con
303c0 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69  st char*);.#endi
303d0 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20  f../*.** Search 
303e0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
303f0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
30400 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e  at was opened on
30410 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a   the database .*
30420 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  * file (not a jo
30430 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d  urnal or master-
30440 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64  journal file) id
30450 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68  entified by path
30460 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69  name.** zPath wi
30470 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58  th SQLITE_OPEN_X
30480 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e  XX flags matchin
30490 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61  g those passed a
304a0 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20  s the second.** 
304b0 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
304c0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
304d0 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73   Such a file des
304e0 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73  criptor may exis
304f0 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  t if a database 
30500 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63  connection was c
30510 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65  losed.** but the
30520 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65   associated file
30530 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c   descriptor coul
30540 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20  d not be closed 
30550 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20  because some.** 
30560 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
30570 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  iptor open on th
30580 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68  e same file is h
30590 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f  olding a file-lo
305a0 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20  ck..** Refer to 
305b0 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
305c0 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63  unixClose() func
305d0 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e  tion and the len
305e0 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20  gthy comment.** 
305f0 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69  describing "Posi
30600 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
30610 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74  ng" at the start
30620 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f   of this file fo
30630 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65  r .** further de
30640 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63  tails. Also, tic
30650 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a  ket #4018..**.**
30660 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66   If a suitable f
30670 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
30680 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74  s found, then it
30690 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
306a0 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65   no.** such file
306b0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c   descriptor is l
306c0 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65  ocated, -1 is re
306d0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
306e0 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a  c UnixUnusedFd *
306f0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63  findReusableFd(c
30700 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
30710 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
30720 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
30730 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  nused = 0;..  /*
30740 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66   Do not search f
30750 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
30760 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  e descriptor on 
30770 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63  vxworks. Not bec
30780 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b  ause.  ** vxwork
30790 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65  s would not bene
307a0 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61  fit from the cha
307b0 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77  nge (it might, w
307c0 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a  e're not sure),.
307d0 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65    ** but because
307e0 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20   no way to test 
307f0 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
30800 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73  available. It is
30810 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f   better .  ** no
30820 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69  t to risk breaki
30830 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f  ng vxworks suppo
30840 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20  rt for the sake 
30850 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75  of such an obscu
30860 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65  re .  ** feature
30870 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58  .  */.#if !OS_VX
30880 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73  WORKS.  struct s
30890 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
308a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
308b0 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28  Results of stat(
308c0 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69  ) call */..  uni
308d0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a  xEnterMutex();..
308e0 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61    /* A stat() ca
308f0 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20  ll may fail for 
30900 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e  various reasons.
30910 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
30920 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d  , it is.  ** alm
30930 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74  ost certain that
30940 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20   an open() call 
30950 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
30960 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e   will also fail.
30970 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72  .  ** For this r
30980 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72  eason, if an err
30990 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65  or occurs in the
309a0 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72   stat() call her
309b0 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67  e, it is.  ** ig
309c0 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20  nored and -1 is 
309d0 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
309e0 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f  ller will try to
309f0 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
30a00 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  .  ** descriptor
30a10 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74   on the same pat
30a20 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74  h, fail, and ret
30a30 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  urn an error to 
30a40 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a  SQLite..  **.  *
30a50 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73  * Even if a subs
30a60 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61  equent open() ca
30a70 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c  ll does succeed,
30a80 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65   the consequence
30a90 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65  s of.  ** not se
30aa0 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65  arching for a re
30ab0 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63  usable file desc
30ac0 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64  riptor are not d
30ad0 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e  ire.  */.  if( n
30ae0 55 6e 75 73 65 64 46 64 3e 30 20 26 26 20 30 3d  UnusedFd>0 && 0=
30af0 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
30b00 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e  sStat) ){.    un
30b10 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
30b20 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e 6f 64 65  ode;..    pInode
30b30 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
30b40 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
30b50 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  && (pInode->file
30b60 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74  Id.dev!=sStat.st
30b70 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20  _dev.           
30b80 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e            || pIn
30b90 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21  ode->fileId.ino!
30ba0 3d 28 75 36 34 29 73 53 74 61 74 2e 73 74 5f 69  =(u64)sStat.st_i
30bb0 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49  no) ){.       pI
30bc0 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  node = pInode->p
30bd0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
30be0 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20  if( pInode ){.  
30bf0 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
30c00 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72   **pp;.      for
30c10 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e  (pp=&pInode->pUn
30c20 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70  used; *pp && (*p
30c30 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73  p)->flags!=flags
30c40 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e  ; pp=&((*pp)->pN
30c50 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e  ext));.      pUn
30c60 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20  used = *pp;.    
30c70 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
30c80 0a 20 20 20 20 20 20 20 20 6e 55 6e 75 73 65 64  .        nUnused
30c90 46 64 2d 2d 3b 0a 20 20 20 20 20 20 20 20 2a 70  Fd--;.        *p
30ca0 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65  p = pUnused->pNe
30cb0 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  xt;.      }.    
30cc0 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  }.  }.  unixLeav
30cd0 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e 64 69 66  eMutex();.#endif
30ce0 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58      /* if !OS_VX
30cf0 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72  WORKS */.  retur
30d00 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a  n pUnused;.}../*
30d10 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6d 6f 64  .** Find the mod
30d20 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20 6f  e, uid and gid o
30d30 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a  f file zFile. .*
30d40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
30d50 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73  FileMode(.  cons
30d60 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20  t char *zFile,  
30d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30d80 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f  ile name */.  mo
30d90 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
30da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30db0 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
30dc0 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20  s of zFile */.  
30dd0 75 69 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20  uid_t *pUid,    
30de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30df0 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a  /* OUT: uid of z
30e00 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74  File. */.  gid_t
30e10 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
30e20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
30e30 54 3a 20 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e  T: gid of zFile.
30e40 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
30e50 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
30e60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
30e70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20  ut of stat() on 
30e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
30e90 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
30ea0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d  TE_OK;.  if( 0==
30eb0 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c 20 26 73  osStat(zFile, &s
30ec0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d  Stat) ){.    *pM
30ed0 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d  ode = sStat.st_m
30ee0 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20  ode & 0777;.    
30ef0 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
30f00 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47 69 64 20  _uid;.    *pGid 
30f10 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a  = sStat.st_gid;.
30f20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
30f30 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  = SQLITE_IOERR_F
30f40 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  STAT;.  }.  retu
30f50 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30f60 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
30f70 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f   called by unixO
30f80 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69  pen() to determi
30f90 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d  ne the unix perm
30fa0 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72  issions.** to cr
30fb0 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77  eate new files w
30fc0 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  ith. If no error
30fd0 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51   occurs, then SQ
30fe0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
30ff0 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c  ned.** and a val
31000 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  ue suitable for 
31010 70 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74  passing as the t
31020 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  hird argument to
31030 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77   open(2) is.** w
31040 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65  ritten to *pMode
31050 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
31060 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69   occurs, an SQLi
31070 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
31080 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e   .** returned an
31090 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a  d the value of *
310a0 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64  pMode is not mod
310b0 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  ified..**.** In 
310c0 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73  most cases, this
310d0 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70   routine sets *p
310e0 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68  Mode to 0, which
310f0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20   will become.** 
31100 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f  an indication to
31110 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74   robust_open() t
31120 6f 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c  o create the fil
31130 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54  e using.** SQLIT
31140 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
31150 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73  ERMISSIONS adjus
31160 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
31170 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20  ..** But if the 
31180 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
31190 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65  d is a WAL or re
311a0 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
311b0 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69  le, then .** thi
311c0 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69  s function queri
311d0 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  es the file-syst
311e0 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69  em for the permi
311f0 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a  ssions on the .*
31200 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
31210 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
31220 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f  d sets *pMode to
31230 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65   this value. Whe
31240 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62  never .** possib
31250 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72  le, WAL and jour
31260 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72  nal files are cr
31270 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
31280 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73  same permissions
31290 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f   .** as the asso
312a0 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
312b0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  file..**.** If t
312c0 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
312d0 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f  _8_3_NAMES optio
312e0 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
312f0 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e  en the.** origin
31300 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75  al filename is u
31310 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74  navailable.  But
31320 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e   8_3_NAMES is on
31330 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46  ly used for.** F
31340 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61  AT filesystems a
31350 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64  nd permissions d
31360 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65  o not matter the
31370 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a  re, so just use.
31380 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70  ** the default p
31390 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  ermissions..*/.s
313a0 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
313b0 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20  eateFileMode(.  
313c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
313d0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
313e0 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20  /* Path of file 
313f0 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67  (possibly) being
31400 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e   created */.  in
31410 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
31420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31430 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73   Flags passed as
31440 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f   4th argument to
31450 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f   xOpen() */.  mo
31460 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20  de_t *pMode,    
31470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31480 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e   OUT: Permission
31490 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77  s to open file w
314a0 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a  ith */.  uid_t *
314b0 70 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  pUid,           
314c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
314d0 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74   uid to set on t
314e0 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64  he file */.  gid
314f0 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20  _t *pGid        
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31510 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20  OUT: gid to set 
31520 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29  on the file */.)
31530 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
31540 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
31550 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f      /* Return Co
31560 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d  de */.  *pMode =
31570 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b   0;.  *pUid = 0;
31580 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20  .  *pGid = 0;.  
31590 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c  if( flags & (SQL
315a0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
315b0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
315c0 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68  URNAL) ){.    ch
315d0 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e  ar zDb[MAX_PATHN
315e0 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44  AME+1];     /* D
315f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
31600 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62  h */.    int nDb
31610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31620 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
31630 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20   of valid bytes 
31640 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f  in zDb */..    /
31650 2a 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74  * zPath is a pat
31660 68 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f  h to a WAL or jo
31670 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
31680 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20  following block 
31690 64 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74  derives.    ** t
316a0 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61  he path to the a
316b0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
316c0 73 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61  se file from zPa
316d0 74 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68  th. This block h
316e0 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68  andles.    ** th
316f0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69  e following nami
31700 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a  ng conventions:.
31710 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
31720 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
31730 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  urnal".    **   
31740 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61  "<path to db>-wa
31750 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
31760 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
31770 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c  lNN".    **   "<
31780 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e  path to db>-walN
31790 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  N".    **.    **
317a0 20 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64   where NN is a d
317b0 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54  ecimal number. T
317c0 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68  he NN naming sch
317d0 65 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a  emes are .    **
317e0 20 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73   used by the tes
317f0 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f  t_multiplex.c mo
31800 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dule..    */.   
31810 20 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74   nDb = sqlite3St
31820 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20  rlen30(zPath) - 
31830 31 3b 20 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1; .    while( z
31840 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29  Path[nDb]!='-' )
31850 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f  {.      /* In no
31860 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20  rmal operation, 
31870 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31880 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79   name will alway
31890 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20  s contain.      
318a0 2a 2a 20 61 20 27 2d 27 20 63 68 61 72 61 63 74  ** a '-' charact
318b0 65 72 2e 20 20 48 6f 77 65 76 65 72 20 69 6e 20  er.  However in 
318c0 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64  8+3 filename mod
318d0 65 2c 20 6f 72 20 69 66 20 61 20 63 6f 72 72 75  e, or if a corru
318e0 70 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c  pt.      ** roll
318f0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65  back journal spe
31900 63 69 66 69 65 73 20 61 20 6d 61 73 74 65 72 20  cifies a master 
31910 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20 61 20 67  journal with a g
31920 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a  oofy name, then.
31930 20 20 20 20 20 20 2a 2a 20 74 68 65 20 27 2d 27        ** the '-'
31940 20 6d 69 67 68 74 20 62 65 20 6d 69 73 73 69 6e   might be missin
31950 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  g. */.      if( 
31960 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b  nDb==0 || zPath[
31970 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75  nDb]=='.' ) retu
31980 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
31990 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d      nDb--;.    }
319a0 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
319b0 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
319c0 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
319d0 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74  ';..    rc = get
319e0 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d  FileMode(zDb, pM
319f0 6f 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29  ode, pUid, pGid)
31a00 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
31a10 53 45 52 56 45 52 5f 45 44 49 54 49 4f 4e 0a 20  SERVER_EDITION. 
31a20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31a30 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 20 29 7b  E_IOERR_FSTAT ){
31a40 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 44  .      while( nD
31a50 62 20 26 26 20 7a 44 62 5b 6e 44 62 5d 21 3d 27  b && zDb[nDb]!='
31a60 2f 27 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20  /' ) nDb--;.    
31a70 20 20 69 66 28 20 6e 44 62 3e 38 20 26 26 20 6d    if( nDb>8 && m
31a80 65 6d 63 6d 70 28 22 2d 6a 6f 75 72 6e 61 6c 2f  emcmp("-journal/
31a90 22 2c 20 26 7a 44 62 5b 6e 44 62 2d 38 5d 2c 20  ", &zDb[nDb-8], 
31aa0 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  9)==0 ){.       
31ab0 20 7a 44 62 5b 6e 44 62 2d 38 5d 20 3d 20 27 5c   zDb[nDb-8] = '\
31ac0 30 27 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  0';.        rc =
31ad0 20 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62   getFileMode(zDb
31ae0 2c 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70  , pMode, pUid, p
31af0 47 69 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Gid);.      }.  
31b00 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
31b10 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
31b20 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
31b30 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20  EONCLOSE ){.    
31b40 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20  *pMode = 0600;. 
31b50 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
31b60 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
31b70 52 49 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  RI ){.    /* If 
31b80 74 68 69 73 20 69 73 20 61 20 6d 61 69 6e 20 64  this is a main d
31b90 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
31ba0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
31bb0 65 6e 65 64 20 75 73 69 6e 67 20 61 20 55 52 49  ened using a URI
31bc0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 6e 61 6d 65  .    ** filename
31bd0 2c 20 63 68 65 63 6b 20 66 6f 72 20 74 68 65 20  , check for the 
31be0 22 6d 6f 64 65 6f 66 22 20 70 61 72 61 6d 65 74  "modeof" paramet
31bf0 65 72 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20  er. If present, 
31c00 69 6e 74 65 72 70 72 65 74 0a 20 20 20 20 2a 2a  interpret.    **
31c10 20 69 74 73 20 76 61 6c 75 65 20 61 73 20 61 20   its value as a 
31c20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 74 72 79  filename and try
31c30 20 74 6f 20 63 6f 70 79 20 74 68 65 20 6d 6f 64   to copy the mod
31c40 65 2c 20 75 69 64 20 61 6e 64 20 67 69 64 20 66  e, uid and gid f
31c50 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  rom.    ** that 
31c60 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 63 6f  file.  */.    co
31c70 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
31c80 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
31c90 74 65 72 28 7a 50 61 74 68 2c 20 22 6d 6f 64 65  ter(zPath, "mode
31ca0 6f 66 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 20  of");.    if( z 
31cb0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 67 65  ){.      rc = ge
31cc0 74 46 69 6c 65 4d 6f 64 65 28 7a 2c 20 70 4d 6f  tFileMode(z, pMo
31cd0 64 65 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b  de, pUid, pGid);
31ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
31cf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
31d00 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
31d10 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
31d20 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
31d30 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
31d40 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
31d50 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
31d60 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
31d70 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
31d80 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
31d90 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
31da0 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
31db0 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
31dc0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
31dd0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
31de0 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
31df0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
31e00 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
31e10 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
31e20 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
31e30 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
31e40 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
31e50 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
31e60 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
31e70 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
31e80 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
31e90 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
31ea0 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
31eb0 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
31ec0 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
31ed0 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
31ee0 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
31ef0 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
31f00 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
31f10 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
31f20 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
31f30 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
31f40 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
31f50 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
31f60 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
31f70 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
31f80 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
31f90 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
31fa0 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
31fb0 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
31fc0 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
31fd0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
31fe0 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
31ff0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
32000 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
32010 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
32020 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
32030 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
32040 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
32050 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
32060 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
32070 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
32080 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
32090 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
320a0 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
320b0 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
320c0 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
320d0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
320e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
320f0 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
32100 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
32110 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
32120 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
32130 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
32140 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
32150 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
32160 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
32170 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
32180 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
32190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321a0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
321b0 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
321c0 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
321d0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
321e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
321f0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
32200 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
32210 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
32220 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
32230 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
32240 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
32250 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
32260 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
32270 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
32280 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
32290 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
322a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
322b0 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
322c0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   Code */.  int c
322d0 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  trlFlags = 0;   
322e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49            /* UNI
322f0 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
32300 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
32310 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
32320 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
32330 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
32340 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
32350 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
32360 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
32370 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
32380 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
32390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
323a0 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
323b0 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
323c0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
323d0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
323e0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
323f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
32400 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
32410 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
32420 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
32430 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
32440 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
32450 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
32460 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
32470 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
32480 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
32490 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
324a0 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
324b0 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
324c0 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
324d0 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
324e0 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
324f0 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
32500 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
32510 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
32520 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
32530 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
32540 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
32550 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
32560 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
32570 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
32580 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
32590 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
325a0 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4e 65 77 4a   */.  int isNewJ
325b0 72 6e 6c 20 3d 20 28 69 73 43 72 65 61 74 65 20  rnl = (isCreate 
325c0 26 26 20 28 0a 20 20 20 20 20 20 20 20 65 54 79  && (.        eTy
325d0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
325e0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
325f0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
32600 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
32610 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c  JOURNAL .     ||
32620 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
32630 50 45 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20  PEN_WAL.  ));.. 
32640 20 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20   /* If argument 
32650 7a 50 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20  zPath is a NULL 
32660 70 6f 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75  pointer, this fu
32670 6e 63 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  nction is requir
32680 65 64 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20  ed to open.  ** 
32690 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
326a0 2e 20 55 73 65 20 74 68 69 73 20 62 75 66 66 65  . Use this buffe
326b0 72 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  r to store the f
326c0 69 6c 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a  ile name in..  *
326d0 2f 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d  /.  char zTmpnam
326e0 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
326f0 5d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ];.  const char 
32700 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a  *zName = zPath;.
32710 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
32720 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d  following statem
32730 65 6e 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a  ents are true: .
32740 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20    **.  **   (a) 
32750 45 78 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74  Exactly one of t
32760 68 65 20 52 45 41 44 57 52 49 54 45 20 61 6e 64  he READWRITE and
32770 20 52 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20   READONLY flags 
32780 6d 75 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64  must be set, and
32790 20 0a 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20   .  **   (b) if 
327a0 43 52 45 41 54 45 20 69 73 20 73 65 74 2c 20 74  CREATE is set, t
327b0 68 65 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75  hen READWRITE mu
327c0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20  st also be set, 
327d0 61 6e 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69  and.  **   (c) i
327e0 66 20 45 58 43 4c 55 53 49 56 45 20 69 73 20 73  f EXCLUSIVE is s
327f0 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
32800 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
32810 2e 0a 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20  ..  **   (d) if 
32820 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73  DELETEONCLOSE is
32830 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54   set, then CREAT
32840 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
32850 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
32860 74 28 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30  t((isReadonly==0
32870 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d   || isReadWrite=
32880 3d 30 29 20 26 26 20 28 69 73 52 65 61 64 57 72  =0) && (isReadWr
32890 69 74 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c  ite || isReadonl
328a0 79 29 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  y));.  assert(is
328b0 43 72 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52  Create==0 || isR
328c0 65 61 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73  eadWrite);.  ass
328d0 65 72 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d  ert(isExclusive=
328e0 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b  =0 || isCreate);
328f0 0a 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65  .  assert(isDele
32900 74 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74  te==0 || isCreat
32910 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61  e);..  /* The ma
32920 69 6e 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72  in DB, main jour
32930 6e 61 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e  nal, WAL file an
32940 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
32950 20 61 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a   are never .  **
32960 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
32970 65 6c 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20  eleted. Nor are 
32980 74 68 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72  they ever tempor
32990 61 72 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20  ary files.  */. 
329a0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
329b0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
329c0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
329d0 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20  PEN_MAIN_DB );. 
329e0 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
329f0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
32a00 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
32a10 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
32a20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
32a30 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
32a40 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
32a50 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
32a60 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
32a70 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
32a80 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
32a90 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
32aa0 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73  WAL );..  /* Ass
32ab0 65 72 74 20 74 68 61 74 20 74 68 65 20 75 70 70  ert that the upp
32ac0 65 72 20 6c 61 79 65 72 20 68 61 73 20 73 65 74  er layer has set
32ad0 20 6f 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c   one of the "fil
32ae0 65 2d 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a  e-type" flags. *
32af0 2f 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70  /.  assert( eTyp
32b00 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
32b10 41 49 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65  AIN_DB      || e
32b20 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
32b30 4e 5f 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20  N_TEMP_DB .     
32b40 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
32b50 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
32b60 52 4e 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53  RNAL || eType==S
32b70 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
32b80 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
32b90 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
32ba0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
32bb0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
32bc0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f  ITE_OPEN_MASTER_
32bd0 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20  JOURNAL .       
32be0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
32bf0 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
32c00 44 42 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  DB || eType==SQL
32c10 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
32c20 3b 0a 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61  ;..  /* Detect a
32c30 20 70 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20   pid change and 
32c40 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20  reset the PRNG. 
32c50 20 54 68 65 72 65 20 69 73 20 61 20 72 61 63 65   There is a race
32c60 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20   condition.  ** 
32c70 68 65 72 65 20 73 75 63 68 20 74 68 61 74 20 74  here such that t
32c80 77 6f 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61  wo or more threa
32c90 64 73 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f  ds all trying to
32ca0 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 73 20   open databases 
32cb0 61 74 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  at.  ** the same
32cc0 20 69 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61   instant might a
32cd0 6c 6c 20 72 65 73 65 74 20 74 68 65 20 50 52 4e  ll reset the PRN
32ce0 47 2e 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65  G.  But multiple
32cf0 20 72 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65   resets.  ** are
32d00 20 68 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a   harmless..  */.
32d10 20 20 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73    if( randomness
32d20 50 69 64 21 3d 6f 73 47 65 74 70 69 64 28 30 29  Pid!=osGetpid(0)
32d30 20 29 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65   ){.    randomne
32d40 73 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64  ssPid = osGetpid
32d50 28 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (0);.    sqlite3
32d60 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
32d70 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70  ;.  }.  memset(p
32d80 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
32d90 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65  File));..  if( e
32da0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
32db0 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20  N_MAIN_DB ){.   
32dc0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
32dd0 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75  Unused;.    pUnu
32de0 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62  sed = findReusab
32df0 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67  leFd(zName, flag
32e00 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75  s);.    if( pUnu
32e10 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20  sed ){.      fd 
32e20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20  = pUnused->fd;. 
32e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32e40 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65  pUnused = sqlite
32e50 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f  3_malloc64(sizeo
32e60 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
32e70 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
32e80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
32e90 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
32ea0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
32eb0 20 20 7d 0a 20 20 20 20 70 2d 3e 70 50 72 65 61    }.    p->pPrea
32ec0 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 3d  llocatedUnused =
32ed0 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f   pUnused;..    /
32ee0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
32ef0 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
32f00 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
32f10 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
32f20 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68      ** URIs with
32f30 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
32f40 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
32f50 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
32f60 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  nto.    ** sqlit
32f70 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
32f80 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
32f90 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  t( (flags & SQLI
32fa0 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20  TE_OPEN_URI) || 
32fb0 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
32fc0 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
32fd0 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
32fe0 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
32ff0 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
33000 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
33010 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
33020 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
33030 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
33040 26 20 21 69 73 4e 65 77 4a 72 6e 6c 29 3b 0a 20  & !isNewJrnl);. 
33050 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54     rc = unixGetT
33060 65 6d 70 6e 61 6d 65 28 70 56 66 73 2d 3e 6d 78  empname(pVfs->mx
33070 50 61 74 68 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61  Pathname, zTmpna
33080 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
33090 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
330a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
330b0 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
330c0 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20   zTmpname;..    
330d0 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d  /* Generated tem
330e0 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73  porary filenames
330f0 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62   are always doub
33100 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
33110 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73  ed.    ** for us
33120 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69  e by sqlite3_uri
33130 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
33140 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61  .    assert( zNa
33150 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
33160 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  +1]==0 );.  }.. 
33170 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
33180 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
33190 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
331a0 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
331b0 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
331c0 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
331d0 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
331e0 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
331f0 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
33200 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
33210 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
33220 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
33230 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
33240 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
33250 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
33260 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
33270 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
33280 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
33290 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
332a0 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
332b0 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
332c0 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
332d0 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
332e0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
332f0 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
33300 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
33310 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
33320 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
33330 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
33340 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
33350 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
33360 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
33370 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
33380 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
33390 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
333a0 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74  ith */.    uid_t
333b0 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   uid;           
333c0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
333d0 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
333e0 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64  */.    gid_t gid
333f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33400 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20       /* Groupid 
33410 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
33420 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65      rc = findCre
33430 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d  ateFileMode(zNam
33440 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d  e, flags, &openM
33450 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29  ode, &uid, &gid)
33460 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
33470 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
33480 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 50 72   assert( !p->pPr
33490 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
334a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
334b0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
334c0 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70  OPEN_WAL || eTyp
334d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
334e0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
334f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
33500 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72      }.    fd = r
33510 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
33520 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
33530 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
33540 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
33550 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
33560 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
33570 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gs));.    assert
33580 28 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 7c  ( !isExclusive |
33590 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  | (openFlags & O
335a0 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a 20 20  _CREAT)!=0 );.  
335b0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
335c0 20 20 20 20 69 66 28 20 69 73 4e 65 77 4a 72 6e      if( isNewJrn
335d0 6c 20 26 26 20 65 72 72 6e 6f 3d 3d 45 41 43 43  l && errno==EACC
335e0 45 53 20 26 26 20 6f 73 41 63 63 65 73 73 28 7a  ES && osAccess(z
335f0 4e 61 6d 65 2c 20 46 5f 4f 4b 29 20 29 7b 0a 20  Name, F_OK) ){. 
33600 20 20 20 20 20 20 20 2f 2a 20 49 66 20 75 6e 61         /* If una
33610 62 6c 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ble to create a 
33620 6a 6f 75 72 6e 61 6c 20 62 65 63 61 75 73 65 20  journal because 
33630 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
33640 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20   not.        ** 
33650 77 72 69 74 61 62 6c 65 2c 20 63 68 61 6e 67 65  writable, change
33660 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
33670 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
33680 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  . */.        rc 
33690 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
336a0 59 5f 44 49 52 45 43 54 4f 52 59 3b 0a 20 20 20  Y_DIRECTORY;.   
336b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 72 72     }else if( err
336c0 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69 73  no!=EISDIR && is
336d0 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20 20  ReadWrite ){.   
336e0 20 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74       /* Failed t
336f0 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20  o open the file 
33700 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
33710 63 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d  ccess. Try read-
33720 6f 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20  only. */.       
33730 20 66 6c 61 67 73 20 26 3d 20 7e 28 53 51 4c 49   flags &= ~(SQLI
33740 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
33750 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
33760 45 41 54 45 29 3b 0a 20 20 20 20 20 20 20 20 6f  EATE);.        o
33770 70 65 6e 46 6c 61 67 73 20 26 3d 20 7e 28 4f 5f  penFlags &= ~(O_
33780 52 44 57 52 7c 4f 5f 43 52 45 41 54 29 3b 0a 20  RDWR|O_CREAT);. 
33790 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20         flags |= 
337a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
337b0 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 6f 70  ONLY;.        op
337c0 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 4f  enFlags |= O_RDO
337d0 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 69 73 52  NLY;.        isR
337e0 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadonly = 1;.   
337f0 20 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74       fd = robust
33800 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65  _open(zName, ope
33810 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65  nFlags, openMode
33820 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
33830 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
33840 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
33850 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
33860 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
33870 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e 61 6d  PT, "open", zNam
33880 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
33890 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63  ==SQLITE_OK ) rc
338a0 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 67 6f   = rc2;.      go
338b0 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64  to open_finished
338c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
338d0 49 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  If this process 
338e0 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  is running as ro
338f0 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61 74 69  ot and if creati
33900 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63  ng a new rollbac
33910 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  k.    ** journal
33920 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65   or WAL file, se
33930 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20  t the ownership 
33940 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f  of the journal o
33950 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20  r WAL to be.    
33960 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  ** the same as t
33970 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
33980 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  base..    */.   
33990 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53 51   if( flags & (SQ
339a0 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51  LITE_OPEN_WAL|SQ
339b0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
339c0 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20  OURNAL) ){.     
339d0 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28 66 64   robustFchown(fd
339e0 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20 20 20  , uid, gid);.   
339f0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
33a00 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20   fd>=0 );.  if( 
33a10 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20 20 20  pOutFlags ){.   
33a20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20 66 6c   *pOutFlags = fl
33a30 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ags;.  }..  if( 
33a40 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64  p->pPreallocated
33a50 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d  Unused ){.    p-
33a60 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e  >pPreallocatedUn
33a70 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20  used->fd = fd;. 
33a80 20 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61     p->pPrealloca
33a90 74 65 64 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73  tedUnused->flags
33aa0 20 3d 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20   = flags;.  }.. 
33ab0 20 69 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b   if( isDelete ){
33ac0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
33ad0 20 20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d      zPath = zNam
33ae0 65 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  e;.#elif defined
33af0 28 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41  (SQLITE_UNLINK_A
33b00 46 54 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20  FTER_CLOSE).    
33b10 7a 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f  zPath = sqlite3_
33b20 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
33b30 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  ame);.    if( zP
33b40 61 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ath==0 ){.      
33b50 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20  robust_close(p, 
33b60 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
33b70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
33b80 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
33b90 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 6f     }.#else.    o
33ba0 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b 0a  sUnlink(zName);.
33bb0 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20 53  #endif.  }.#if S
33bc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
33bd0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c 73  KING_STYLE.  els
33be0 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46 6c  e{.    p->openFl
33bf0 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
33c00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23  .  }.#endif.  .#
33c10 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
33c20 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f  LE__) || SQLITE_
33c30 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
33c40 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74 61 74  TYLE.  if( fstat
33c50 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f 29 20  fs(fd, &fsInfo) 
33c60 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73 74 6f  == -1 ){.    sto
33c70 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c 20 65  reLastErrno(p, e
33c80 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62 75 73  rrno);.    robus
33c90 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f  t_close(p, fd, _
33ca0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 72 65  _LINE__);.    re
33cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
33cc0 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20  R_ACCESS;.  }.  
33cd0 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
33ce0 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
33cf0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
33d00 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  )) {.    ((unixF
33d10 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46  ile*)pFile)->fsF
33d20 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46  lags |= SQLITE_F
33d30 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b  SFLAGS_IS_MSDOS;
33d40 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d 3d 20  .  }.  if (0 == 
33d50 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74 22 2c  strncmp("exfat",
33d60 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65   fsInfo.f_fstype
33d70 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20 20 20  name, 5)) {.    
33d80 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
33d90 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d 20 53  e)->fsFlags |= S
33da0 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53  QLITE_FSFLAGS_IS
33db0 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65 6e 64  _MSDOS;.  }.#end
33dc0 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75 70 20  if..  /* Set up 
33dd0 61 70 70 72 6f 70 72 69 61 74 65 20 63 74 72 6c  appropriate ctrl
33de0 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28 20 69  Flags */.  if( i
33df0 73 44 65 6c 65 74 65 20 29 20 20 20 20 20 20 20  sDelete )       
33e00 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
33e10 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44  gs |= UNIXFILE_D
33e20 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69 73 52  ELETE;.  if( isR
33e30 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20 20 20  eadonly )       
33e40 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
33e50 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f   |= UNIXFILE_RDO
33e60 4e 4c 59 3b 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  NLY;.  noLock = 
33e70 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
33e80 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 20 20 69 66  EN_MAIN_DB;.  if
33e90 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20 20 20 20  ( noLock )      
33ea0 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c              ctrl
33eb0 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
33ec0 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69 66 28 20  E_NOLOCK;.  if( 
33ed0 69 73 4e 65 77 4a 72 6e 6c 20 29 20 20 20 20 20  isNewJrnl )     
33ee0 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c            ctrlFl
33ef0 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
33f00 44 49 52 53 59 4e 43 3b 0a 20 20 69 66 28 20 66  DIRSYNC;.  if( f
33f10 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
33f20 45 4e 5f 55 52 49 20 29 20 63 74 72 6c 46 6c 61  EN_URI ) ctrlFla
33f30 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 55  gs |= UNIXFILE_U
33f40 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  RI;..#if SQLITE_
33f50 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
33f60 54 59 4c 45 0a 23 69 66 20 53 51 4c 49 54 45 5f  TYLE.#if SQLITE_
33f70 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
33f80 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f 50 72 6f  KING.  isAutoPro
33f90 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  xy = 1;.#endif. 
33fa0 20 69 66 28 20 69 73 41 75 74 6f 50 72 6f 78 79   if( isAutoProxy
33fb0 20 26 26 20 28 7a 50 61 74 68 21 3d 4e 55 4c 4c   && (zPath!=NULL
33fc0 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b 29 20 26  ) && (!noLock) &
33fd0 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e 20 29 7b  & pVfs->xOpen ){
33fe0 0a 20 20 20 20 63 68 61 72 20 2a 65 6e 76 66 6f  .    char *envfo
33ff0 72 63 65 20 3d 20 67 65 74 65 6e 76 28 22 53 51  rce = getenv("SQ
34000 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59  LITE_FORCE_PROXY
34010 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20 20 20 20  _LOCKING");.    
34020 69 6e 74 20 75 73 65 50 72 6f 78 79 20 3d 20 30  int useProxy = 0
34030 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ;..    /* SQLITE
34040 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43  _FORCE_PROXY_LOC
34050 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73 20 66 6f  KING==1 means fo
34060 72 63 65 20 61 6c 77 61 79 73 20 75 73 65 20 70  rce always use p
34070 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73 20 0a 20  roxy, 0 means . 
34080 20 20 20 2a 2a 20 6e 65 76 65 72 20 75 73 65 20     ** never use 
34090 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d 65 61 6e  proxy, NULL mean
340a0 73 20 75 73 65 20 70 72 6f 78 79 20 66 6f 72 20  s use proxy for 
340b0 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 73 20  non-local files 
340c0 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  only.  */.    if
340d0 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e 55 4c 4c  ( envforce!=NULL
340e0 20 29 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f   ){.      usePro
340f0 78 79 20 3d 20 61 74 6f 69 28 65 6e 76 66 6f 72  xy = atoi(envfor
34100 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65 6c 73 65  ce)>0;.    }else
34110 7b 0a 20 20 20 20 20 20 75 73 65 50 72 6f 78 79  {.      useProxy
34120 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66 5f 66 6c   = !(fsInfo.f_fl
34130 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 29 3b 0a  ags&MNT_LOCAL);.
34140 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73      }.    if( us
34150 65 50 72 6f 78 79 20 29 7b 0a 20 20 20 20 20 20  eProxy ){.      
34160 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46  rc = fillInUnixF
34170 69 6c 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46  ile(pVfs, fd, pF
34180 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c  ile, zPath, ctrl
34190 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69 66  Flags);.      if
341a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
341b0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
341c0 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e  proxyTransformUn
341d0 69 78 46 69 6c 65 28 28 75 6e 69 78 46 69 6c 65  ixFile((unixFile
341e0 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75 74 6f 3a  *)pFile, ":auto:
341f0 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ");.        if( 
34200 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34210 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  .          /* Us
34220 65 20 75 6e 69 78 43 6c 6f 73 65 20 74 6f 20 63  e unixClose to c
34230 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 73 6f  lean up the reso
34240 75 72 63 65 73 20 61 64 64 65 64 20 69 6e 20 66  urces added in f
34250 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 20 0a 20  illInUnixFile . 
34260 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20           ** and 
34270 63 6c 65 61 72 20 61 6c 6c 20 74 68 65 20 73 74  clear all the st
34280 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72 65  ructure's refere
34290 6e 63 65 73 2e 20 20 53 70 65 63 69 66 69 63 61  nces.  Specifica
342a0 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20 20 20 20  lly, .          
342b0 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  ** pFile->pMetho
342c0 64 73 20 77 69 6c 6c 20 62 65 20 4e 55 4c 4c 20  ds will be NULL 
342d0 73 6f 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  so sqlite3OsClos
342e0 65 20 77 69 6c 6c 20 62 65 20 61 20 6e 6f 2d 6f  e will be a no-o
342f0 70 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  p .          */.
34300 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 43 6c            unixCl
34310 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ose(pFile);.    
34320 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
34330 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
34340 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70   }.      goto op
34350 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20  en_finished;.   
34360 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
34370 0a 20 20 61 73 73 65 72 74 28 20 7a 50 61 74 68  .  assert( zPath
34380 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 30 5d 3d  ==0 || zPath[0]=
34390 3d 27 2f 27 20 0a 20 20 20 20 20 20 7c 7c 20 65  ='/' .      || e
343a0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
343b0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
343c0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
343d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
343e0 4e 41 4c 20 0a 20 20 29 3b 0a 20 20 72 63 20 3d  NAL .  );.  rc =
343f0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
34400 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c  pVfs, fd, pFile,
34410 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67   zPath, ctrlFlag
34420 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69 73 68  s);..open_finish
34430 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ed:.  if( rc!=SQ
34440 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
34450 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 70  qlite3_free(p->p
34460 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
34470 65 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ed);.  }.  retur
34480 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
34490 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20  Delete the file 
344a0 61 74 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65  at zPath. If the
344b0 20 64 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e   dirSync argumen
344c0 74 20 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63  t is true, fsync
344d0 28 29 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  ().** the direct
344e0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
344f0 6e 67 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a  ng the file..*/.
34500 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
34510 65 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33  elete(.  sqlite3
34520 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20  _vfs *NotUsed,  
34530 20 20 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69     /* VFS contai
34540 6e 69 6e 67 20 74 68 69 73 20 61 73 20 74 68 65  ning this as the
34550 20 78 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20   xDelete method 
34560 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
34570 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f  *zPath,        /
34580 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  * Name of file t
34590 6f 20 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a  o be deleted */.
345a0 20 20 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20    int dirSync   
345b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
345c0 66 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20  f true, fsync() 
345d0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
345e0 64 65 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f  deleting file */
345f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
34600 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53  QLITE_OK;.  UNUS
34610 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
34620 55 73 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74  Used);.  Simulat
34630 65 49 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20  eIOError(return 
34640 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
34650 45 54 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e  ETE);.  if( osUn
34660 6c 69 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31  link(zPath)==(-1
34670 29 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72  ) ){.    if( err
34680 6e 6f 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f  no==ENOENT.#if O
34690 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
346a0 20 20 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a 50    || osAccess(zP
346b0 61 74 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66  ath,0)!=0.#endif
346c0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63  .    ){.      rc
346d0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
346e0 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20  DELETE_NOENT;.  
346f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
34700 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
34710 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  (SQLITE_IOERR_DE
34720 4c 45 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20  LETE, "unlink", 
34730 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20  zPath);.    }.  
34740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
34750 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34760 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a  DISABLE_DIRSYNC.
34770 20 20 69 66 28 20 28 64 69 72 53 79 6e 63 20 26    if( (dirSync &
34780 20 31 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e   1)!=0 ){.    in
34790 74 20 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f  t fd;.    rc = o
347a0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a  sOpenDirectory(z
347b0 50 61 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20  Path, &fd);.    
347c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
347d0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  K ){.      if( f
347e0 75 6c 6c 5f 66 73 79 6e 63 28 66 64 2c 30 2c 30  ull_fsync(fd,0,0
347f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
34800 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
34810 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
34820 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22 2c 20  FSYNC, "fsync", 
34830 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a  zPath);.      }.
34840 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
34850 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(0, fd, __LINE
34860 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  __);.    }else{.
34870 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
34880 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
34890 4e 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  N );.      rc = 
348a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
348b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
348c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
348d0 2a 20 54 65 73 74 20 74 68 65 20 65 78 69 73 74  * Test the exist
348e0 65 6e 63 65 20 6f 66 20 6f 72 20 61 63 63 65 73  ence of or acces
348f0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 66  s permissions of
34900 20 66 69 6c 65 20 7a 50 61 74 68 2e 20 54 68 65   file zPath. The
34910 0a 2a 2a 20 74 65 73 74 20 70 65 72 66 6f 72 6d  .** test perform
34920 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  ed depends on th
34930 65 20 76 61 6c 75 65 20 6f 66 20 66 6c 61 67 73  e value of flags
34940 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
34950 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
34960 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
34970 65 20 66 69 6c 65 20 65 78 69 73 74 73 0a 2a 2a  e file exists.**
34980 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45       SQLITE_ACCE
34990 53 53 5f 52 45 41 44 57 52 49 54 45 3a 20 52 65  SS_READWRITE: Re
349a0 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66 69  turn 1 if the fi
349b0 6c 65 20 69 73 20 72 65 61 64 20 61 6e 64 20 77  le is read and w
349c0 72 69 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 20  ritable..**     
349d0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
349e0 41 44 4f 4e 4c 59 3a 20 52 65 74 75 72 6e 20 31  ADONLY: Return 1
349f0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
34a00 72 65 61 64 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  readable..**.** 
34a10 4f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  Otherwise return
34a20 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
34a30 74 20 75 6e 69 78 41 63 63 65 73 73 28 0a 20 20  t unixAccess(.  
34a40 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
34a50 55 73 65 64 2c 20 20 20 2f 2a 20 54 68 65 20 56  Used,   /* The V
34a60 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  FS containing th
34a70 69 73 20 78 41 63 63 65 73 73 20 6d 65 74 68 6f  is xAccess metho
34a80 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
34a90 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 2f  r *zPath,      /
34aa0 2a 20 50 61 74 68 20 6f 66 20 74 68 65 20 66 69  * Path of the fi
34ab0 6c 65 20 74 6f 20 65 78 61 6d 69 6e 65 20 2a 2f  le to examine */
34ac0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
34ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
34ae0 61 74 20 64 6f 20 77 65 20 77 61 6e 74 20 74 6f  at do we want to
34af0 20 6c 65 61 72 6e 20 61 62 6f 75 74 20 74 68 65   learn about the
34b00 20 7a 50 61 74 68 20 66 69 6c 65 3f 20 2a 2f 0a   zPath file? */.
34b10 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 20 20    int *pResOut  
34b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
34b30 74 65 20 72 65 73 75 6c 74 20 62 6f 6f 6c 65 61  te result boolea
34b40 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 55  n here */.){.  U
34b50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
34b60 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53 69 6d 75  NotUsed);.  Simu
34b70 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
34b80 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
34b90 5f 41 43 43 45 53 53 3b 20 29 3b 0a 20 20 61 73  _ACCESS; );.  as
34ba0 73 65 72 74 28 20 70 52 65 73 4f 75 74 21 3d 30  sert( pResOut!=0
34bb0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 73 70   );..  /* The sp
34bc0 65 63 20 73 61 79 73 20 74 68 65 72 65 20 61 72  ec says there ar
34bd0 65 20 74 68 72 65 65 20 70 6f 73 73 69 62 6c 65  e three possible
34be0 20 76 61 6c 75 65 73 20 66 6f 72 20 66 6c 61 67   values for flag
34bf0 73 2e 20 20 42 75 74 20 6f 6e 6c 79 0a 20 20 2a  s.  But only.  *
34c00 2a 20 74 77 6f 20 6f 66 20 74 68 65 6d 20 61 72  * two of them ar
34c10 65 20 61 63 74 75 61 6c 6c 79 20 75 73 65 64 20  e actually used 
34c20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  */.  assert( fla
34c30 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53  gs==SQLITE_ACCES
34c40 53 5f 45 58 49 53 54 53 20 7c 7c 20 66 6c 61 67  S_EXISTS || flag
34c50 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43 45 53 53  s==SQLITE_ACCESS
34c60 5f 52 45 41 44 57 52 49 54 45 20 29 3b 0a 0a 20  _READWRITE );.. 
34c70 20 69 66 28 20 66 6c 61 67 73 3d 3d 53 51 4c 49   if( flags==SQLI
34c80 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
34c90 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
34ca0 74 61 74 20 62 75 66 3b 0a 20 20 20 20 2a 70 52  tat buf;.    *pR
34cb0 65 73 4f 75 74 20 3d 20 28 30 3d 3d 6f 73 53 74  esOut = (0==osSt
34cc0 61 74 28 7a 50 61 74 68 2c 20 26 62 75 66 29 20  at(zPath, &buf) 
34cd0 26 26 20 62 75 66 2e 73 74 5f 73 69 7a 65 3e 30  && buf.st_size>0
34ce0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
34cf0 2a 70 52 65 73 4f 75 74 20 3d 20 6f 73 41 63 63  *pResOut = osAcc
34d00 65 73 73 28 7a 50 61 74 68 2c 20 57 5f 4f 4b 7c  ess(zPath, W_OK|
34d10 52 5f 4f 4b 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  R_OK)==0;.  }.  
34d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
34d30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74  ;.}../*.**.*/.st
34d40 61 74 69 63 20 69 6e 74 20 6d 6b 46 75 6c 6c 50  atic int mkFullP
34d50 61 74 68 6e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  athname(.  const
34d60 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
34d70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
34d80 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 63 68  put path */.  ch
34d90 61 72 20 2a 7a 4f 75 74 2c 20 20 20 20 20 20 20  ar *zOut,       
34da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34db0 20 4f 75 74 70 75 74 20 62 75 66 66 65 72 20 2a   Output buffer *
34dc0 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 20 20 20 20  /.  int nOut    
34dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34de0 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
34df0 20 73 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   size of buffer 
34e00 7a 4f 75 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zOut */.){.  int
34e10 20 6e 50 61 74 68 20 3d 20 73 71 6c 69 74 65 33   nPath = sqlite3
34e20 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29 3b  Strlen30(zPath);
34e30 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b  .  int iOff = 0;
34e40 0a 20 20 69 66 28 20 7a 50 61 74 68 5b 30 5d 21  .  if( zPath[0]!
34e50 3d 27 2f 27 20 29 7b 0a 20 20 20 20 69 66 28 20  ='/' ){.    if( 
34e60 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e  osGetcwd(zOut, n
34e70 4f 75 74 2d 32 29 3d 3d 30 20 29 7b 0a 20 20 20  Out-2)==0 ){.   
34e80 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
34e90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
34ea0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67 65  NTOPEN_BKPT, "ge
34eb0 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a 20  tcwd", zPath);. 
34ec0 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
34ed0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
34ee0 7a 4f 75 74 29 3b 0a 20 20 20 20 7a 4f 75 74 5b  zOut);.    zOut[
34ef0 69 4f 66 66 2b 2b 5d 20 3d 20 27 2f 27 3b 0a 20  iOff++] = '/';. 
34f00 20 7d 0a 20 20 69 66 28 20 28 69 4f 66 66 2b 6e   }.  if( (iOff+n
34f10 50 61 74 68 2b 31 29 3e 6e 4f 75 74 20 29 7b 0a  Path+1)>nOut ){.
34f20 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 61 73      /* SQLite as
34f30 73 75 6d 65 73 20 74 68 61 74 20 78 46 75 6c 6c  sumes that xFull
34f40 50 61 74 68 6e 61 6d 65 28 29 20 6e 75 6c 2d 74  Pathname() nul-t
34f50 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 6f 75  erminates the ou
34f60 74 70 75 74 20 62 75 66 66 65 72 0a 20 20 20 20  tput buffer.    
34f70 2a 2a 20 65 76 65 6e 20 69 66 20 69 74 20 72 65  ** even if it re
34f80 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2e 20  turns an error. 
34f90 20 2a 2f 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66   */.    zOut[iOf
34fa0 66 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 72  f] = '\0';.    r
34fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
34fc0 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 7d 0a  TOPEN_BKPT;.  }.
34fd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
34fe0 74 66 28 6e 4f 75 74 2d 69 4f 66 66 2c 20 26 7a  tf(nOut-iOff, &z
34ff0 4f 75 74 5b 69 4f 66 66 5d 2c 20 22 25 73 22 2c  Out[iOff], "%s",
35000 20 7a 50 61 74 68 29 3b 0a 20 20 72 65 74 75 72   zPath);.  retur
35010 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
35020 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
35030 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
35040 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
35050 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
35060 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
35070 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
35080 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
35090 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
350a0 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
350b0 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
350c0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
350d0 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
350e0 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
350f0 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
35100 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
35110 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
35120 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
35130 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
35140 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
35150 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
35160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
35170 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
35180 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
35190 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
351a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
351b0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
351c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
351d0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
351e0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
351f0 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
35200 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
35210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35220 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
35230 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
35240 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
35250 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
35260 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
35270 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 23 69 66  buffer */.){.#if
35280 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 52   !defined(HAVE_R
35290 45 41 44 4c 49 4e 4b 29 20 7c 7c 20 21 64 65 66  EADLINK) || !def
352a0 69 6e 65 64 28 48 41 56 45 5f 4c 53 54 41 54 29  ined(HAVE_LSTAT)
352b0 0a 20 20 72 65 74 75 72 6e 20 6d 6b 46 75 6c 6c  .  return mkFull
352c0 50 61 74 68 6e 61 6d 65 28 7a 50 61 74 68 2c 20  Pathname(zPath, 
352d0 7a 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 23 65 6c  zOut, nOut);.#el
352e0 73 65 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  se.  int rc = SQ
352f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
35300 42 79 74 65 3b 0a 20 20 69 6e 74 20 6e 4c 69 6e  Byte;.  int nLin
35310 6b 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20  k = 1;          
35320 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
35330 6f 66 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b  of symbolic link
35340 73 20 66 6f 6c 6c 6f 77 65 64 20 73 6f 20 66 61  s followed so fa
35350 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  r */.  const cha
35360 72 20 2a 7a 49 6e 20 3d 20 7a 50 61 74 68 3b 20  r *zIn = zPath; 
35370 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61       /* Input pa
35380 74 68 20 66 6f 72 20 65 61 63 68 20 69 74 65 72  th for each iter
35390 61 74 69 6f 6e 20 6f 66 20 6c 6f 6f 70 20 2a 2f  ation of loop */
353a0 0a 20 20 63 68 61 72 20 2a 7a 44 65 6c 20 3d 20  .  char *zDel = 
353b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 56  0;..  assert( pV
353c0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 3d 3d  fs->mxPathname==
353d0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 29 3b 0a  MAX_PATHNAME );.
353e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
353f0 45 52 28 70 56 66 73 29 3b 0a 0a 20 20 2f 2a 20  ER(pVfs);..  /* 
35400 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
35410 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
35420 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
35430 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
35440 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
35450 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
35460 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
35470 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
35480 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
35490 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
354a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
354b0 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
354c0 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
354d0 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
354e0 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
354f0 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
35500 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
35510 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
35520 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
35530 64 6f 20 7b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c  do {..    /* Cal
35540 6c 20 73 74 61 74 28 29 20 6f 6e 20 70 61 74 68  l stat() on path
35550 20 7a 49 6e 2e 20 53 65 74 20 62 4c 69 6e 6b 20   zIn. Set bLink 
35560 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 70  to true if the p
35570 61 74 68 20 69 73 20 61 20 73 79 6d 62 6f 6c 69  ath is a symboli
35580 63 0a 20 20 20 20 2a 2a 20 6c 69 6e 6b 2c 20 6f  c.    ** link, o
35590 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
355a0 65 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  e.  */.    int b
355b0 4c 69 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 73 74  Link = 0;.    st
355c0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
355d0 20 20 20 69 66 28 20 6f 73 4c 73 74 61 74 28 7a     if( osLstat(z
355e0 49 6e 2c 20 26 62 75 66 29 21 3d 30 20 29 7b 0a  In, &buf)!=0 ){.
355f0 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21        if( errno!
35600 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20  =ENOENT ){.     
35610 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
35620 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54  rror(SQLITE_CANT
35630 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6c 73 74 61  OPEN_BKPT, "lsta
35640 74 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20 20  t", zIn);.      
35650 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
35660 20 20 20 62 4c 69 6e 6b 20 3d 20 53 5f 49 53 4c     bLink = S_ISL
35670 4e 4b 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 3b  NK(buf.st_mode);
35680 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
35690 62 4c 69 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69  bLink ){.      i
356a0 66 28 20 7a 44 65 6c 3d 3d 30 20 29 7b 0a 20 20  f( zDel==0 ){.  
356b0 20 20 20 20 20 20 7a 44 65 6c 20 3d 20 73 71 6c        zDel = sql
356c0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4f 75 74  ite3_malloc(nOut
356d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
356e0 44 65 6c 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  Del==0 ) rc = SQ
356f0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
35700 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
35710 20 2b 2b 6e 4c 69 6e 6b 3e 53 51 4c 49 54 45 5f   ++nLink>SQLITE_
35720 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20 29 7b 0a  MAX_SYMLINKS ){.
35730 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35740 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
35750 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  T;.      }..    
35760 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35770 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  _OK ){.        n
35780 42 79 74 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e  Byte = osReadlin
35790 6b 28 7a 49 6e 2c 20 7a 44 65 6c 2c 20 6e 4f 75  k(zIn, zDel, nOu
357a0 74 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  t-1);.        if
357b0 28 20 6e 42 79 74 65 3c 30 20 29 7b 0a 20 20 20  ( nByte<0 ){.   
357c0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
357d0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
357e0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22  CANTOPEN_BKPT, "
357f0 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 49 6e 29 3b  readlink", zIn);
35800 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
35810 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 44            if( zD
35820 65 6c 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20  el[0]!='/' ){.  
35830 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b            int n;
35840 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
35850 28 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  (n = sqlite3Strl
35860 65 6e 33 30 28 7a 49 6e 29 3b 20 6e 3e 30 20 26  en30(zIn); n>0 &
35870 26 20 7a 49 6e 5b 6e 2d 31 5d 21 3d 27 2f 27 3b  & zIn[n-1]!='/';
35880 20 6e 2d 2d 29 3b 0a 20 20 20 20 20 20 20 20 20   n--);.         
35890 20 20 20 69 66 28 20 6e 42 79 74 65 2b 6e 2b 31     if( nByte+n+1
358a0 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 20 20 20  >nOut ){.       
358b0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
358c0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
358d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
358e0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
358f0 20 20 20 6d 65 6d 6d 6f 76 65 28 26 7a 44 65 6c     memmove(&zDel
35900 5b 6e 5d 2c 20 7a 44 65 6c 2c 20 6e 42 79 74 65  [n], zDel, nByte
35910 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  +1);.           
35920 20 20 20 6d 65 6d 63 70 79 28 7a 44 65 6c 2c 20     memcpy(zDel, 
35930 7a 49 6e 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  zIn, n);.       
35940 20 20 20 20 20 20 20 6e 42 79 74 65 20 2b 3d 20         nByte += 
35950 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n;.            }
35960 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35970 20 20 20 20 20 20 20 7a 44 65 6c 5b 6e 42 79 74         zDel[nByt
35980 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20  e] = '\0';.     
35990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
359a0 20 20 20 20 7a 49 6e 20 3d 20 7a 44 65 6c 3b 0a      zIn = zDel;.
359b0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72      }..    asser
359c0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc!=SQLITE_OK
359d0 20 7c 7c 20 7a 49 6e 21 3d 7a 4f 75 74 20 7c 7c   || zIn!=zOut ||
359e0 20 7a 49 6e 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a   zIn[0]=='/' );.
359f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35a00 54 45 5f 4f 4b 20 26 26 20 7a 49 6e 21 3d 7a 4f  TE_OK && zIn!=zO
35a10 75 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ut ){.      rc =
35a20 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28   mkFullPathname(
35a30 7a 49 6e 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 29  zIn, zOut, nOut)
35a40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
35a50 62 4c 69 6e 6b 3d 3d 30 20 29 20 62 72 65 61 6b  bLink==0 ) break
35a60 3b 0a 20 20 20 20 7a 49 6e 20 3d 20 7a 4f 75 74  ;.    zIn = zOut
35a70 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  ;.  }while( rc==
35a80 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
35a90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 65  sqlite3_free(zDe
35aa0 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
35ab0 0a 23 65 6e 64 69 66 20 20 20 2f 2a 20 48 41 56  .#endif   /* HAV
35ac0 45 5f 52 45 41 44 4c 49 4e 4b 20 26 26 20 48 41  E_READLINK && HA
35ad0 56 45 5f 4c 53 54 41 54 20 2a 2f 0a 7d 0a 0a 0a  VE_LSTAT */.}...
35ae0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35af0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
35b00 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  ON./*.** Interfa
35b10 63 65 73 20 66 6f 72 20 6f 70 65 6e 69 6e 67 20  ces for opening 
35b20 61 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79  a shared library
35b30 2c 20 66 69 6e 64 69 6e 67 20 65 6e 74 72 79 20  , finding entry 
35b40 70 6f 69 6e 74 73 0a 2a 2a 20 77 69 74 68 69 6e  points.** within
35b50 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
35b60 61 72 79 2c 20 61 6e 64 20 63 6c 6f 73 69 6e 67  ary, and closing
35b70 20 74 68 65 20 73 68 61 72 65 64 20 6c 69 62 72   the shared libr
35b80 61 72 79 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65  ary..*/.#include
35b90 20 3c 64 6c 66 63 6e 2e 68 3e 0a 73 74 61 74 69   <dlfcn.h>.stati
35ba0 63 20 76 6f 69 64 20 2a 75 6e 69 78 44 6c 4f 70  c void *unixDlOp
35bb0 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
35bc0 4e 6f 74 55 73 65 64 2c 20 63 6f 6e 73 74 20 63  NotUsed, const c
35bd0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
35be0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
35bf0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
35c00 72 65 74 75 72 6e 20 64 6c 6f 70 65 6e 28 7a 46  return dlopen(zF
35c10 69 6c 65 6e 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f  ilename, RTLD_NO
35c20 57 20 7c 20 52 54 4c 44 5f 47 4c 4f 42 41 4c 29  W | RTLD_GLOBAL)
35c30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74  ;.}../*.** SQLit
35c40 65 20 63 61 6c 6c 73 20 74 68 69 73 20 66 75 6e  e calls this fun
35c50 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61 74 65 6c  ction immediatel
35c60 79 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  y after a call t
35c70 6f 20 75 6e 69 78 44 6c 53 79 6d 28 29 20 6f 72  o unixDlSym() or
35c80 0a 2a 2a 20 75 6e 69 78 44 6c 4f 70 65 6e 28 29  .** unixDlOpen()
35c90 20 66 61 69 6c 73 20 28 72 65 74 75 72 6e 73 20   fails (returns 
35ca0 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 29 2e  a null pointer).
35cb0 20 49 66 20 61 20 6d 6f 72 65 20 64 65 74 61 69   If a more detai
35cc0 6c 65 64 20 65 72 72 6f 72 0a 2a 2a 20 6d 65 73  led error.** mes
35cd0 73 61 67 65 20 69 73 20 61 76 61 69 6c 61 62 6c  sage is availabl
35ce0 65 2c 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  e, it is written
35cf0 20 74 6f 20 7a 42 75 66 4f 75 74 2e 20 49 66 20   to zBufOut. If 
35d00 6e 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  no error message
35d10 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
35d20 2c 20 7a 42 75 66 4f 75 74 20 69 73 20 6c 65 66  , zBufOut is lef
35d30 74 20 75 6e 6d 6f 64 69 66 69 65 64 20 61 6e 64  t unmodified and
35d40 20 53 51 4c 69 74 65 20 75 73 65 73 20 61 20 64   SQLite uses a d
35d50 65 66 61 75 6c 74 0a 2a 2a 20 65 72 72 6f 72 20  efault.** error 
35d60 6d 65 73 73 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  message..*/.stat
35d70 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c 45 72  ic void unixDlEr
35d80 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
35d90 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6e 42  *NotUsed, int nB
35da0 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75  uf, char *zBufOu
35db0 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
35dc0 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55 53 45 44   *zErr;.  UNUSED
35dd0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
35de0 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  ed);.  unixEnter
35df0 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45 72 72 20  Mutex();.  zErr 
35e00 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a 20 20 69  = dlerror();.  i
35e10 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 73  f( zErr ){.    s
35e20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35e30 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74 2c 20 22  nBuf, zBufOut, "
35e40 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a  %s", zErr);.  }.
35e50 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
35e60 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ();.}.static voi
35e70 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d 28 73 71  d (*unixDlSym(sq
35e80 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
35e90 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  ed, void *p, con
35ea0 73 74 20 63 68 61 72 2a 7a 53 79 6d 29 29 28 76  st char*zSym))(v
35eb0 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a  oid){.  /* .  **
35ec0 20 47 43 43 20 77 69 74 68 20 2d 70 65 64 61 6e   GCC with -pedan
35ed0 74 69 63 2d 65 72 72 6f 72 73 20 73 61 79 73 20  tic-errors says 
35ee0 74 68 61 74 20 43 39 30 20 64 6f 65 73 20 6e 6f  that C90 does no
35ef0 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69 64 2a 20  t allow a void* 
35f00 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61 73 74 20  to be.  ** cast 
35f10 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
35f20 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 41  o a function.  A
35f30 6e 64 20 79 65 74 20 74 68 65 20 6c 69 62 72 61  nd yet the libra
35f40 72 79 20 64 6c 73 79 6d 28 29 20 72 6f 75 74 69  ry dlsym() routi
35f50 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20  ne.  ** returns 
35f60 61 20 76 6f 69 64 2a 20 77 68 69 63 68 20 69 73  a void* which is
35f70 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65   really a pointe
35f80 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
35f90 20 20 53 6f 20 68 6f 77 20 64 6f 20 77 65 0a 20    So how do we. 
35fa0 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d 28 29 20   ** use dlsym() 
35fb0 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65  with -pedantic-e
35fc0 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  rrors?.  **.  **
35fd0 20 56 61 72 69 61 62 6c 65 20 78 20 62 65 6c 6f   Variable x belo
35fe0 77 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  w is defined to 
35ff0 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
36000 61 20 66 75 6e 63 74 69 6f 6e 20 74 61 6b 69 6e  a function takin
36010 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65 74 65 72  g.  ** parameter
36020 73 20 76 6f 69 64 2a 20 61 6e 64 20 63 6f 6e 73  s void* and cons
36030 74 20 63 68 61 72 2a 20 61 6e 64 20 72 65 74 75  t char* and retu
36040 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  rning a pointer 
36050 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e 0a 20  to a function.. 
36060 20 2a 2a 20 57 65 20 69 6e 69 74 69 61 6c 69 7a   ** We initializ
36070 65 20 78 20 62 79 20 61 73 73 69 67 6e 69 6e 67  e x by assigning
36080 20 69 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   it a pointer to
36090 20 74 68 65 20 64 6c 73 79 6d 28 29 20 66 75 6e   the dlsym() fun
360a0 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28 54 68 61  ction..  ** (Tha
360b0 74 20 61 73 73 69 67 6e 6d 65 6e 74 20 72 65 71  t assignment req
360c0 75 69 72 65 73 20 61 20 63 61 73 74 2e 29 20 20  uires a cast.)  
360d0 54 68 65 6e 20 77 65 20 63 61 6c 6c 20 74 68 65  Then we call the
360e0 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 20   function that. 
360f0 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20 74 6f 2e   ** x points to.
36100 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69    .  **.  ** Thi
36110 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 69 73  s work-around is
36120 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 77 6f 72   unlikely to wor
36130 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f 6e 20 61  k correctly on a
36140 6e 79 20 73 79 73 74 65 6d 20 77 68 65 72 65 0a  ny system where.
36150 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c 6c 79 20    ** you really 
36160 63 61 6e 6e 6f 74 20 63 61 73 74 20 61 20 66 75  cannot cast a fu
36170 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20 69  nction pointer i
36180 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42 75 74 20  nto void*.  But 
36190 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a 20 20 2a  then, on the.  *
361a0 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 64 6c  * other hand, dl
361b0 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f 74 20 77  sym() will not w
361c0 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61 20 73 79  ork on such a sy
361d0 73 74 65 6d 20 65 69 74 68 65 72 2c 20 73 6f 20  stem either, so 
361e0 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 6e 6f 74  we have.  ** not
361f0 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20 61 6e 79   really lost any
36200 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f  thing..  */.  vo
36210 69 64 20 28 2a 28 2a 78 29 28 76 6f 69 64 2a 2c  id (*(*x)(void*,
36220 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28 76 6f  const char*))(vo
36230 69 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  id);.  UNUSED_PA
36240 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
36250 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64 28 2a 28  ;.  x = (void(*(
36260 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  *)(void*,const c
36270 68 61 72 2a 29 29 28 76 6f 69 64 29 29 64 6c 73  har*))(void))dls
36280 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20 28 2a 78  ym;.  return (*x
36290 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74  )(p, zSym);.}.st
362a0 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 44 6c  atic void unixDl
362b0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
362c0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69 64  s *NotUsed, void
362d0 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 55 4e   *pHandle){.  UN
362e0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
362f0 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c 63 6c 6f  otUsed);.  dlclo
36300 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  se(pHandle);.}.#
36310 65 6c 73 65 20 2f 2a 20 69 66 20 53 51 4c 49 54  else /* if SQLIT
36320 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
36330 4e 53 49 4f 4e 20 69 73 20 64 65 66 69 6e 65 64  NSION is defined
36340 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 75  : */.  #define u
36350 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a 20 20 23  nixDlOpen  0.  #
36360 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 45 72 72  define unixDlErr
36370 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20 75  or 0.  #define u
36380 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a 20 20 23  nixDlSym   0.  #
36390 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 43 6c 6f  define unixDlClo
363a0 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  se 0.#endif../*.
363b0 2a 2a 20 57 72 69 74 65 20 6e 42 75 66 20 62 79  ** Write nBuf by
363c0 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d 20 64 61  tes of random da
363d0 74 61 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ta to the suppli
363e0 65 64 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a  ed buffer zBuf..
363f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
36400 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  ixRandomness(sql
36410 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
36420 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
36430 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55 4e 55 53  r *zBuf){.  UNUS
36440 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
36450 55 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 28  Used);.  assert(
36460 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e 3d 28 73  (size_t)nBuf>=(s
36470 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29 2b 73 69  izeof(time_t)+si
36480 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a 0a 20 20  zeof(int)));..  
36490 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e  /* We have to in
364a0 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f  itialize zBuf to
364b0 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e   prevent valgrin
364c0 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67  d from reporting
364d0 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54  .  ** errors.  T
364e0 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75 65  he reports issue
364f0 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72  d by valgrind ar
36500 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65  e incorrect - we
36510 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66   would.  ** pref
36520 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e 64  er that the rand
36530 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61  omness be increa
36540 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73  sed by making us
36550 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e of the.  ** un
36560 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63  initialized spac
36570 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20  e in zBuf - but 
36580 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20  valgrind errors 
36590 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20  tend to worry.  
365a0 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20  ** some users.  
365b0 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67 75  Rather than argu
365c0 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73 69  e, it seems easi
365d0 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69  er just to initi
365e0 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77  alize.  ** the w
365f0 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73  hole array and s
36600 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c  ilence valgrind,
36610 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
36620 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e  ans less randomn
36630 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  ess.  ** in the 
36640 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a  random seed..  *
36650 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74  *.  ** When test
36660 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e  ing, initializin
36670 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f  g zBuf[] to zero
36680 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20   is all we do.  
36690 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  That means.  ** 
366a0 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20 75  that we always u
366b0 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64  se the same rand
366c0 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e  om number sequen
366d0 63 65 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ce.  This makes 
366e0 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72  the.  ** tests r
366f0 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  epeatable..  */.
36700 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
36710 2c 20 6e 42 75 66 29 3b 0a 20 20 72 61 6e 64 6f  , nBuf);.  rando
36720 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65 74  mnessPid = osGet
36730 70 69 64 28 30 29 3b 20 20 0a 23 69 66 20 21 64  pid(0);  .#if !d
36740 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45  efined(SQLITE_TE
36750 53 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  ST) && !defined(
36760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 52 41 4e 44  SQLITE_OMIT_RAND
36770 4f 4d 4e 45 53 53 29 0a 20 20 7b 0a 20 20 20 20  OMNESS).  {.    
36780 69 6e 74 20 66 64 2c 20 67 6f 74 3b 0a 20 20 20  int fd, got;.   
36790 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65   fd = robust_ope
367a0 6e 28 22 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 22  n("/dev/urandom"
367b0 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a  , O_RDONLY, 0);.
367c0 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a      if( fd<0 ){.
367d0 20 20 20 20 20 20 74 69 6d 65 5f 74 20 74 3b 0a        time_t t;.
367e0 20 20 20 20 20 20 74 69 6d 65 28 26 74 29 3b 0a        time(&t);.
367f0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
36800 66 2c 20 26 74 2c 20 73 69 7a 65 6f 66 28 74 29  f, &t, sizeof(t)
36810 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
36820 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 29 5d  &zBuf[sizeof(t)]
36830 2c 20 26 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  , &randomnessPid
36840 2c 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e  , sizeof(randomn
36850 65 73 73 50 69 64 29 29 3b 0a 20 20 20 20 20 20  essPid));.      
36860 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 74  assert( sizeof(t
36870 29 2b 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e  )+sizeof(randomn
36880 65 73 73 50 69 64 29 3c 3d 28 73 69 7a 65 5f 74  essPid)<=(size_t
36890 29 6e 42 75 66 20 29 3b 0a 20 20 20 20 20 20 6e  )nBuf );.      n
368a0 42 75 66 20 3d 20 73 69 7a 65 6f 66 28 74 29 20  Buf = sizeof(t) 
368b0 2b 20 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e  + sizeof(randomn
368c0 65 73 73 50 69 64 29 3b 0a 20 20 20 20 7d 65 6c  essPid);.    }el
368d0 73 65 7b 0a 20 20 20 20 20 20 64 6f 7b 20 67 6f  se{.      do{ go
368e0 74 20 3d 20 6f 73 52 65 61 64 28 66 64 2c 20 7a  t = osRead(fd, z
368f0 42 75 66 2c 20 6e 42 75 66 29 3b 20 7d 77 68 69  Buf, nBuf); }whi
36900 6c 65 28 20 67 6f 74 3c 30 20 26 26 20 65 72 72  le( got<0 && err
36910 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  no==EINTR );.   
36920 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
36930 30 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  0, fd, __LINE__)
36940 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
36950 69 66 0a 20 20 72 65 74 75 72 6e 20 6e 42 75 66  if.  return nBuf
36960 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ;.}.../*.** Slee
36970 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
36980 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
36990 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
369a0 20 73 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61   slept..** The a
369b0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
369c0 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
369d0 63 6f 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f  conds we want to
369e0 20 73 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72   sleep..** The r
369f0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
36a00 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63  he number of mic
36a10 72 6f 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65  roseconds of sle
36a20 65 70 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72  ep actually.** r
36a30 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68  equested from th
36a40 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65  e underlying ope
36a50 72 61 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61  rating system, a
36a60 20 6e 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a   number which.**
36a70 20 6d 69 67 68 74 20 62 65 20 67 72 65 61 74 65   might be greate
36a80 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
36a90 74 6f 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c  to the argument,
36aa0 20 62 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a   but not less.**
36ab0 20 74 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65   than the argume
36ac0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
36ad0 74 20 75 6e 69 78 53 6c 65 65 70 28 73 71 6c 69  t unixSleep(sqli
36ae0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
36af0 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e  , int microsecon
36b00 64 73 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ds){.#if OS_VXWO
36b10 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69 6d  RKS.  struct tim
36b20 65 73 70 65 63 20 73 70 3b 0a 0a 20 20 73 70 2e  espec sp;..  sp.
36b30 74 76 5f 73 65 63 20 3d 20 6d 69 63 72 6f 73 65  tv_sec = microse
36b40 63 6f 6e 64 73 20 2f 20 31 30 30 30 30 30 30 3b  conds / 1000000;
36b50 0a 20 20 73 70 2e 74 76 5f 6e 73 65 63 20 3d 20  .  sp.tv_nsec = 
36b60 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 25 20  (microseconds % 
36b70 31 30 30 30 30 30 30 29 20 2a 20 31 30 30 30 3b  1000000) * 1000;
36b80 0a 20 20 6e 61 6e 6f 73 6c 65 65 70 28 26 73 70  .  nanosleep(&sp
36b90 2c 20 4e 55 4c 4c 29 3b 0a 20 20 55 4e 55 53 45  , NULL);.  UNUSE
36ba0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
36bb0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
36bc0 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
36bd0 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
36be0 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
36bf0 55 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28  USLEEP.  usleep(
36c00 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 20  microseconds);. 
36c10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
36c20 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
36c30 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f 6e 64  turn microsecond
36c40 73 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  s;.#else.  int s
36c50 65 63 6f 6e 64 73 20 3d 20 28 6d 69 63 72 6f 73  econds = (micros
36c60 65 63 6f 6e 64 73 2b 39 39 39 39 39 39 29 2f 31  econds+999999)/1
36c70 30 30 30 30 30 30 3b 0a 20 20 73 6c 65 65 70 28  000000;.  sleep(
36c80 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53  seconds);.  UNUS
36c90 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
36ca0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
36cb0 73 65 63 6f 6e 64 73 2a 31 30 30 30 30 30 30 3b  seconds*1000000;
36cc0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
36cd0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
36ce0 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20  ariable, if set 
36cf0 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
36d00 6c 75 65 2c 20 69 73 20 69 6e 74 65 72 70 72 65  lue, is interpre
36d10 74 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 6e 75  ted as.** the nu
36d20 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
36d30 73 69 6e 63 65 20 31 39 37 30 20 61 6e 64 20 69  since 1970 and i
36d40 73 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68  s used to set th
36d50 65 20 72 65 73 75 6c 74 20 6f 66 0a 2a 2a 20 73  e result of.** s
36d60 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54  qlite3OsCurrentT
36d70 69 6d 65 28 29 20 64 75 72 69 6e 67 20 74 65 73  ime() during tes
36d80 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ting..*/.#ifdef 
36d90 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
36da0 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
36db0 74 69 6d 65 20 3d 20 30 3b 20 20 2f 2a 20 46 61  time = 0;  /* Fa
36dc0 6b 65 20 73 79 73 74 65 6d 20 74 69 6d 65 20 69  ke system time i
36dd0 6e 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  n seconds since 
36de0 31 39 37 30 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  1970. */.#endif.
36df0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
36e00 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e  current time (in
36e10 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64   Universal Coord
36e20 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57  inated Time).  W
36e30 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 4e 6f 77  rite into *piNow
36e40 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
36e50 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73  time and date as
36e60 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
36e70 6d 62 65 72 20 74 69 6d 65 73 20 38 36 5f 34 30  mber times 86_40
36e80 30 5f 30 30 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74  0_000.  In.** ot
36e90 68 65 72 20 77 6f 72 64 73 2c 20 77 72 69 74 65  her words, write
36ea0 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 20 74 68 65   into *piNow the
36eb0 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
36ec0 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 74 68  seconds since th
36ed0 65 20 4a 75 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63  e Julian.** epoc
36ee0 68 20 6f 66 20 6e 6f 6f 6e 20 69 6e 20 47 72 65  h of noon in Gre
36ef0 65 6e 77 69 63 68 20 6f 6e 20 4e 6f 76 65 6d 62  enwich on Novemb
36f00 65 72 20 32 34 2c 20 34 37 31 34 20 42 2e 43 20  er 24, 4714 B.C 
36f10 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
36f20 0a 2a 2a 20 70 72 6f 6c 65 70 74 69 63 20 47 72  .** proleptic Gr
36f30 65 67 6f 72 69 61 6e 20 63 61 6c 65 6e 64 61 72  egorian calendar
36f40 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
36f50 73 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ss, return SQLIT
36f60 45 5f 4f 4b 2e 20 20 52 65 74 75 72 6e 20 53 51  E_OK.  Return SQ
36f70 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20 74 68  LITE_ERROR if th
36f80 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
36f90 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  .** cannot be fo
36fa0 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  und..*/.static i
36fb0 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  nt unixCurrentTi
36fc0 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
36fd0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73 71  vfs *NotUsed, sq
36fe0 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69 4e  lite3_int64 *piN
36ff0 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ow){.  static co
37000 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  nst sqlite3_int6
37010 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32 34  4 unixEpoch = 24
37020 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33 5f  405875*(sqlite3_
37030 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a 20  int64)8640000;. 
37040 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37050 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  _OK;.#if defined
37060 28 4e 4f 5f 47 45 54 54 4f 44 29 0a 20 20 74 69  (NO_GETTOD).  ti
37070 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
37080 74 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 28  t);.  *piNow = (
37090 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 74  (sqlite3_int64)t
370a0 29 2a 31 30 30 30 20 2b 20 75 6e 69 78 45 70 6f  )*1000 + unixEpo
370b0 63 68 3b 0a 23 65 6c 69 66 20 4f 53 5f 56 58 57  ch;.#elif OS_VXW
370c0 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 74 69  ORKS.  struct ti
370d0 6d 65 73 70 65 63 20 73 4e 6f 77 3b 0a 20 20 63  mespec sNow;.  c
370e0 6c 6f 63 6b 5f 67 65 74 74 69 6d 65 28 43 4c 4f  lock_gettime(CLO
370f0 43 4b 5f 52 45 41 4c 54 49 4d 45 2c 20 26 73 4e  CK_REALTIME, &sN
37100 6f 77 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d 20  ow);.  *piNow = 
37110 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30  unixEpoch + 1000
37120 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
37130 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e  sNow.tv_sec + sN
37140 6f 77 2e 74 76 5f 6e 73 65 63 2f 31 30 30 30 30  ow.tv_nsec/10000
37150 30 30 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  00;.#else.  stru
37160 63 74 20 74 69 6d 65 76 61 6c 20 73 4e 6f 77 3b  ct timeval sNow;
37170 0a 20 20 28 76 6f 69 64 29 67 65 74 74 69 6d 65  .  (void)gettime
37180 6f 66 64 61 79 28 26 73 4e 6f 77 2c 20 30 29 3b  ofday(&sNow, 0);
37190 20 20 2f 2a 20 43 61 6e 6e 6f 74 20 66 61 69 6c    /* Cannot fail
371a0 20 67 69 76 65 6e 20 76 61 6c 69 64 20 61 72 67   given valid arg
371b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 2a 70 69 4e  uments */.  *piN
371c0 6f 77 20 3d 20 75 6e 69 78 45 70 6f 63 68 20 2b  ow = unixEpoch +
371d0 20 31 30 30 30 2a 28 73 71 6c 69 74 65 33 5f 69   1000*(sqlite3_i
371e0 6e 74 36 34 29 73 4e 6f 77 2e 74 76 5f 73 65 63  nt64)sNow.tv_sec
371f0 20 2b 20 73 4e 6f 77 2e 74 76 5f 75 73 65 63 2f   + sNow.tv_usec/
37200 31 30 30 30 3b 0a 23 65 6e 64 69 66 0a 0a 23 69  1000;.#endif..#i
37210 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
37220 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63  .  if( sqlite3_c
37230 75 72 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20  urrent_time ){. 
37240 20 20 20 2a 70 69 4e 6f 77 20 3d 20 31 30 30 30     *piNow = 1000
37250 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
37260 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
37270 74 69 6d 65 20 2b 20 75 6e 69 78 45 70 6f 63 68  time + unixEpoch
37280 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 55  ;.  }.#endif.  U
37290 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
372a0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
372b0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
372c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
372d0 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 46  PRECATED./*.** F
372e0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
372f0 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
37300 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
37310 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65  ime).  Write the
37320 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65  .** current time
37330 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
37340 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
37350 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64   into *prNow and
37360 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52  .** return 0.  R
37370 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74  eturn 1 if the t
37380 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e  ime and date can
37390 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
373a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
373b0 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69  CurrentTime(sqli
373c0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
373d0 2c 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29  , double *prNow)
373e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
373f0 34 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  4 i = 0;.  int r
37400 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  c;.  UNUSED_PARA
37410 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
37420 20 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65    rc = unixCurre
37430 6e 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26  ntTimeInt64(0, &
37440 69 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69  i);.  *prNow = i
37450 2f 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72  /86400000.0;.  r
37460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73  eturn rc;.}.#els
37470 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 43  e.# define unixC
37480 75 72 72 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e  urrentTime 0.#en
37490 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 78  dif../*.** The x
374a0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d  GetLastError() m
374b0 65 74 68 6f 64 20 69 73 20 64 65 73 69 67 6e 65  ethod is designe
374c0 64 20 74 6f 20 72 65 74 75 72 6e 20 61 20 62 65  d to return a be
374d0 74 74 65 72 0a 2a 2a 20 6c 6f 77 2d 6c 65 76 65  tter.** low-leve
374e0 6c 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  l error message 
374f0 77 68 65 6e 20 6f 70 65 72 61 74 69 6e 67 2d 73  when operating-s
37500 79 73 74 65 6d 20 70 72 6f 62 6c 65 6d 73 20 63  ystem problems c
37510 6f 6d 65 20 75 70 0a 2a 2a 20 64 75 72 69 6e 67  ome up.** during
37520 20 53 51 4c 69 74 65 20 6f 70 65 72 61 74 69 6f   SQLite operatio
37530 6e 2e 20 20 4f 6e 6c 79 20 74 68 65 20 69 6e 74  n.  Only the int
37540 65 67 65 72 20 72 65 74 75 72 6e 20 63 6f 64 65  eger return code
37550 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a   is currently.**
37560 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63   used..*/.static
37570 20 69 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74   int unixGetLast
37580 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
37590 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
375a0 4e 6f 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a  NotUsed2, char *
375b0 4e 6f 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55  NotUsed3){.  UNU
375c0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
375d0 74 55 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44  tUsed);.  UNUSED
375e0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
375f0 65 64 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ed2);.  UNUSED_P
37600 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
37610 33 29 3b 0a 20 20 72 65 74 75 72 6e 20 65 72 72  3);.  return err
37620 6e 6f 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a  no;.}.../*.*****
37630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37640 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71 6c 69 74  *** End of sqlit
37650 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
37660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
37680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
376a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
376b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
376c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
376d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
376e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
376f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
37720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37730 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 50 72 6f  ****** Begin Pro
37740 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  xy Locking *****
37750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
37770 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  * Proxy locking 
37780 69 73 20 61 20 22 75 62 65 72 2d 6c 6f 63 6b 69  is a "uber-locki
37790 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  ng-method" in th
377a0 69 73 20 73 65 6e 73 65 3a 20 20 49 74 20 75 73  is sense:  It us
377b0 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68 65 72 20  es the.** other 
377c0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
377d0 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20 6c 6f 63  on secondary loc
377e0 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f 78 79 20  k files.  Proxy 
377f0 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a 2a 2a 20  locking is a.** 
37800 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76 65 72 20  meta-layer over 
37810 74 6f 70 20 6f 66 20 74 68 65 20 70 72 69 6d 69  top of the primi
37820 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  tive locking imp
37830 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76 65 2e 20  lemented above. 
37840 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20 72 65 61   For.** this rea
37850 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
37860 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
37870 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s of proxy locki
37880 6e 67 20 69 73 20 64 65 66 65 72 72 65 64 0a 2a  ng is deferred.*
37890 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20 69 6e 20  * until late in 
378a0 74 68 65 20 66 69 6c 65 20 28 68 65 72 65 29 20  the file (here) 
378b0 61 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65  after all of the
378c0 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65 74 68 6f   other I/O metho
378d0 64 73 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20  ds have.** been 
378e0 64 65 66 69 6e 65 64 20 2d 20 73 6f 20 74 68 61  defined - so tha
378f0 74 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20  t the primitive 
37900 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20  locking methods 
37910 61 72 65 20 61 76 61 69 6c 61 62 6c 65 0a 2a 2a  are available.**
37920 20 61 73 20 73 65 72 76 69 63 65 73 20 74 6f 20   as services to 
37930 68 65 6c 70 20 77 69 74 68 20 74 68 65 20 69 6d  help with the im
37940 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
37950 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a  proxy locking..*
37960 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  *.****.**.** The
37970 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67   default locking
37980 20 73 63 68 65 6d 65 73 20 69 6e 20 53 51 4c 69   schemes in SQLi
37990 74 65 20 75 73 65 20 62 79 74 65 2d 72 61 6e 67  te use byte-rang
379a0 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 0a 2a  e locks on the.*
379b0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
379c0 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 73 61  to coordinate sa
379d0 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 61  fe, concurrent a
379e0 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70 6c  ccess by multipl
379f0 65 20 72 65 61 64 65 72 73 0a 2a 2a 20 61 6e 64  e readers.** and
37a00 20 77 72 69 74 65 72 73 20 5b 68 74 74 70 3a 2f   writers [http:/
37a10 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c 6f 63 6b  /sqlite.org/lock
37a20 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20 20 54 68  ingv3.html].  Th
37a30 65 20 66 69 76 65 20 66 69 6c 65 20 6c 6f 63 6b  e five file lock
37a40 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73 20 28 55  ing.** states (U
37a50 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44 49 4e 47  NLOCKED, PENDING
37a60 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52 56  , SHARED, RESERV
37a70 45 44 2c 20 45 58 43 4c 55 53 49 56 45 29 20 61  ED, EXCLUSIVE) a
37a80 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a  re implemented.*
37a90 2a 20 61 73 20 50 4f 53 49 58 20 72 65 61 64 20  * as POSIX read 
37aa0 26 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 6f 76  & write locks ov
37ab0 65 72 20 66 69 78 65 64 20 73 65 74 20 6f 66 20  er fixed set of 
37ac0 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69 61 20 66  locations (via f
37ad0 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20 41 46 50  sctl),.** on AFP
37ae0 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79 20 65 78   and SMB only ex
37af0 63 6c 75 73 69 76 65 20 62 79 74 65 2d 72 61 6e  clusive byte-ran
37b00 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 61 76 61  ge locks are ava
37b10 69 6c 61 62 6c 65 20 76 69 61 20 66 73 63 74 6c  ilable via fsctl
37b20 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57 52 28 27  .** with _IOWR('
37b30 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
37b40 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
37b50 20 74 6f 20 74 72 61 63 6b 20 74 68 65 20 73 61   to track the sa
37b60 6d 65 20 35 20 73 74 61 74 65 73 2e 0a 2a 2a 20  me 5 states..** 
37b70 54 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 46 5f  To simulate a F_
37b80 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20 73 68 61  RDLCK on the sha
37b90 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e 20 41 46  red range, on AF
37ba0 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20 73 65 6c  P a randomly sel
37bb0 65 63 74 65 64 0a 2a 2a 20 61 64 64 72 65 73 73  ected.** address
37bc0 20 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 72   in the shared r
37bd0 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f  ange is taken fo
37be0 72 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  r a SHARED lock,
37bf0 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 73   the entire.** s
37c00 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20 74  hared range is t
37c10 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45 58 43 4c  aken for an EXCL
37c20 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a 2a 2a 0a  USIVE lock):.**.
37c30 2a 2a 20 20 20 20 20 20 50 45 4e 44 49 4e 47 5f  **      PENDING_
37c40 42 59 54 45 20 20 20 20 20 20 20 20 30 78 34 30  BYTE        0x40
37c50 30 30 30 30 30 30 0a 2a 2a 20 20 20 20 20 20 52  000000.**      R
37c60 45 53 45 52 56 45 44 5f 42 59 54 45 20 20 20 20  ESERVED_BYTE    
37c70 20 20 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a     0x40000001.**
37c80 20 20 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e        SHARED_RAN
37c90 47 45 20 20 20 20 20 20 20 20 30 78 34 30 30 30  GE        0x4000
37ca0 30 30 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32  0002 -> 0x400002
37cb0 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f  00.**.** This wo
37cc0 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20  rks well on the 
37cd0 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65  local file syste
37ce0 6d 2c 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e  m, but shows a n
37cf0 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c  early 100x.** sl
37d00 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70  owdown in read p
37d10 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46  erformance on AF
37d20 50 20 62 65 63 61 75 73 65 20 74 68 65 20 41 46  P because the AF
37d30 50 20 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65  P client disable
37d40 73 0a 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61  s.** the read ca
37d50 63 68 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61  che when byte-ra
37d60 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72  nge locks are pr
37d70 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67  esent.  Enabling
37d80 20 74 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63   the read.** cac
37d90 68 65 20 65 78 70 6f 73 65 73 20 61 20 63 61 63  he exposes a cac
37da0 68 65 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f  he coherency pro
37db0 62 6c 65 6d 20 74 68 61 74 20 69 73 20 70 72 65  blem that is pre
37dc0 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58  sent on all OS X
37dd0 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65  .** supported ne
37de0 74 77 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65  twork file syste
37df0 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50  ms.  NFS and AFP
37e00 20 62 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68   both observe th
37e10 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70  e.** close-to-op
37e20 65 6e 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72  en semantics for
37e30 20 65 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20   ensuring cache 
37e40 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74  coherency.** [ht
37e50 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66  tp://nfs.sourcef
37e60 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38  orge.net/#faq_a8
37e70 5d 2c 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f  ], which does no
37e80 74 20 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a  t effectively.**
37e90 20 61 64 64 72 65 73 73 20 74 68 65 20 72 65 71   address the req
37ea0 75 69 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f  uirements for co
37eb0 6e 63 75 72 72 65 6e 74 20 64 61 74 61 62 61 73  ncurrent databas
37ec0 65 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  e access by mult
37ed0 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20  iple.** readers 
37ee0 61 6e 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b  and writers.** [
37ef0 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c  http://www.nabbl
37f00 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d  e.com/SQLite-on-
37f10 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65  NFS-cache-cohere
37f20 6e 63 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68  ncy-td15655701.h
37f30 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  tml]..**.** To a
37f40 64 64 72 65 73 73 20 74 68 65 20 70 65 72 66 6f  ddress the perfo
37f50 72 6d 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65  rmance and cache
37f60 20 63 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65   coherency issue
37f70 73 2c 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f  s, proxy file lo
37f80 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  cking.** changes
37f90 20 74 68 65 20 77 61 79 20 64 61 74 61 62 61 73   the way databas
37fa0 65 20 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74  e access is cont
37fb0 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69  rolled by limiti
37fc0 6e 67 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a  ng access to a.*
37fd0 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74  * single host at
37fe0 20 61 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69   a time and movi
37ff0 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66  ng file locks of
38000 66 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  f of the databas
38010 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e  e file.** and on
38020 74 6f 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20  to a proxy file 
38030 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c  on the local fil
38040 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a  e system.  .**.*
38050 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79  *.** Using proxy
38060 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d   locks.** ------
38070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a  -----------.**.*
38080 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20  * C APIs.**.**  
38090 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
380a0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
380b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
380c0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
380d0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
380e0 20 20 20 20 20 20 20 20 20 20 3c 70 72 6f 78 79            <proxy
380f0 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75 74 6f 3a  _path> | ":auto:
38100 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74 65 33 5f  ");.**  sqlite3_
38110 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
38120 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f   dbname, SQLITE_
38130 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52  FCNTL_GET_LOCKPR
38140 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
38150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38160 20 20 26 3c 70 72 6f 78 79 5f 70 61 74 68 3e 29    &<proxy_path>)
38170 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51 4c 20 70  ;.**.**.** SQL p
38180 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20 20 50 52  ragmas.**.**  PR
38190 41 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d  AGMA [database.]
381a0 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 3d  lock_proxy_file=
381b0 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c 20 3a  <proxy_path> | :
381c0 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41 47 4d 41  auto:.**  PRAGMA
381d0 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b   [database.]lock
381e0 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a 2a 0a 2a  _proxy_file.**.*
381f0 2a 20 53 70 65 63 69 66 79 69 6e 67 20 22 3a 61  * Specifying ":a
38200 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74 68 61 74  uto:" means that
38210 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 63   if there is a c
38220 6f 6e 63 68 20 66 69 6c 65 20 77 69 74 68 20 61  onch file with a
38230 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20 68 6f 73   matching.** hos
38240 74 20 49 44 20 69 6e 20 69 74 2c 20 74 68 65 20  t ID in it, the 
38250 70 72 6f 78 79 20 70 61 74 68 20 69 6e 20 74 68  proxy path in th
38260 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 6c  e conch file wil
38270 6c 20 62 65 20 75 73 65 64 2c 20 6f 74 68 65 72  l be used, other
38280 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f 78 79 20  wise.** a proxy 
38290 70 61 74 68 20 62 61 73 65 64 20 6f 6e 20 74 68  path based on th
382a0 65 20 75 73 65 72 27 73 20 74 65 6d 70 20 64 69  e user's temp di
382b0 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e 66 73 74  r.** (via confst
382c0 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55 53 45  r(_CS_DARWIN_USE
382d0 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e 2e 29 29  R_TEMP_DIR,...))
382e0 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 61 6e   will be used an
382f0 64 20 74 68 65 0a 2a 2a 20 61 63 74 75 61 6c 20  d the.** actual 
38300 70 72 6f 78 79 20 66 69 6c 65 20 6e 61 6d 65 20  proxy file name 
38310 69 73 20 67 65 6e 65 72 61 74 65 64 20 66 72 6f  is generated fro
38320 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e 64 20 70  m the name and p
38330 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ath of the.** da
38340 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 46 6f  tabase file.  Fo
38350 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a 0a 2a 2a  r example:.**.**
38360 20 20 20 20 20 20 20 46 6f 72 20 64 61 74 61 62         For datab
38370 61 73 65 20 70 61 74 68 20 22 2f 55 73 65 72 73  ase path "/Users
38380 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a 2a 2a 20  /me/foo.db" .** 
38390 20 20 20 20 20 20 54 68 65 20 6c 6f 63 6b 20 70        The lock p
383a0 61 74 68 20 77 69 6c 6c 20 62 65 20 22 3c 74 6d  ath will be "<tm
383b0 70 64 69 72 3e 2f 73 71 6c 69 74 65 70 6c 6f 63  pdir>/sqliteploc
383c0 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f 66 6f 6f  ks/_Users_me_foo
383d0 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a 2a 0a 2a  .db:auto:").**.*
383e0 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b 20 70 72  * Once a lock pr
383f0 6f 78 79 20 69 73 20 63 6f 6e 66 69 67 75 72 65  oxy is configure
38400 64 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  d for a database
38410 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20 69 74 20   connection, it 
38420 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65 20 72 65  can not.** be re
38430 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65 72 20 69  moved, however i
38440 74 20 6d 61 79 20 62 65 20 73 77 69 74 63 68 65  t may be switche
38450 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74  d to a different
38460 20 70 72 6f 78 79 20 70 61 74 68 20 76 69 61 0a   proxy path via.
38470 2a 2a 20 74 68 65 20 61 62 6f 76 65 20 41 50 49  ** the above API
38480 73 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 20  s (assuming the 
38490 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 20 6e 6f  conch file is no
384a0 74 20 62 65 69 6e 67 20 68 65 6c 64 20 62 79 20  t being held by 
384b0 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f 6e 6e 65  another.** conne
384c0 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63 65 73 73  ction or process
384d0 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 48 6f 77  ). .**.**.** How
384e0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 77   proxy locking w
384f0 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  orks.** --------
38500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
38510 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66 69 6c 65  **.** Proxy file
38520 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69 65 73 20   locking relies 
38530 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20 74 77 6f  primarily on two
38540 20 6e 65 77 20 73 75 70 70 6f 72 74 69 6e 67 20   new supporting 
38550 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 20  files: .**.**   
38560 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65 20 74 6f  *  conch file to
38570 20 6c 69 6d 69 74 20 61 63 63 65 73 73 20 74 6f   limit access to
38580 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
38590 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 68  le to a single h
385a0 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61 74 20 61  ost.**      at a
385b0 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20 20 2a 20   time.**.**   * 
385c0 20 70 72 6f 78 79 20 66 69 6c 65 20 74 6f 20 61   proxy file to a
385d0 63 74 20 61 73 20 61 20 70 7