/ Hex Artifact Content
Login

Artifact 8aaa2ee9c87f7323d741454dc62d70f93990031d0d937f86b0d4f40d45a9b8d4:


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 69 66 28 20 72 63 3c 30 20 26 26 20  ;.  if( rc<0 && 
c810: 70 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65  pFile->iBusyTime
c820: 6f 75 74 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20  out>0 ){.    /* 
c830: 4f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  On systems that 
c840: 73 75 70 70 6f 72 74 20 73 6f 6d 65 20 6b 69 6e  support some kin
c850: 64 20 6f 66 20 62 6c 6f 63 6b 69 6e 67 20 66 69  d of blocking fi
c860: 6c 65 20 6c 6f 63 6b 20 77 69 74 68 20 61 20 74  le lock with a t
c870: 69 6d 65 6f 75 74 2c 0a 20 20 20 20 2a 2a 20 6d  imeout,.    ** m
c880: 61 6b 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  ake appropriate 
c890: 63 68 61 6e 67 65 73 20 68 65 72 65 20 74 6f 20  changes here to 
c8a0: 69 6e 76 6f 6b 65 20 74 68 61 74 20 62 6c 6f 63  invoke that bloc
c8b0: 6b 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 2e 20  king file lock. 
c8c0: 20 4f 6e 0a 20 20 20 20 2a 2a 20 67 65 6e 65 72   On.    ** gener
c8d0: 69 63 20 70 6f 73 69 78 2c 20 68 6f 77 65 76 65  ic posix, howeve
c8e0: 72 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  r, there is no s
c8f0: 75 63 68 20 41 50 49 2e 20 20 53 6f 20 77 65 20  uch API.  So we 
c900: 73 69 6d 70 6c 79 20 74 72 79 20 74 68 65 0a 20  simply try the. 
c910: 20 20 20 2a 2a 20 6c 6f 63 6b 20 6f 6e 63 65 20     ** lock once 
c920: 65 76 65 72 79 20 6d 69 6c 6c 69 73 65 63 6f 6e  every millisecon
c930: 64 20 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74  d until either t
c940: 68 65 20 74 69 6d 65 6f 75 74 20 65 78 70 69 72  he timeout expir
c950: 65 73 2c 20 6f 72 20 75 6e 74 69 6c 0a 20 20 20  es, or until.   
c960: 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69 73 20   ** the lock is 
c970: 6f 62 74 61 69 6e 65 64 2e 20 2a 2f 0a 20 20 20  obtained. */.   
c980: 20 64 6f 7b 0a 20 20 20 20 20 20 75 73 6c 65 65   do{.      uslee
c990: 70 28 31 30 30 30 29 3b 0a 20 20 20 20 20 20 72  p(1000);.      r
c9a0: 63 20 3d 20 6f 73 46 63 6e 74 6c 28 68 2c 46 5f  c = osFcntl(h,F_
c9b0: 53 45 54 4c 4b 2c 70 4c 6f 63 6b 29 3b 0a 20 20  SETLK,pLock);.  
c9c0: 20 20 20 20 70 46 69 6c 65 2d 3e 69 42 75 73 79      pFile->iBusy
c9d0: 54 69 6d 65 6f 75 74 2d 2d 3b 0a 20 20 20 20 7d  Timeout--;.    }
c9e0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 70  while( rc<0 && p
c9f0: 46 69 6c 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f  File->iBusyTimeo
ca00: 75 74 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ut>0 );.    pFil
ca10: 65 2d 3e 69 42 75 73 79 54 69 6d 65 6f 75 74 20  e->iBusyTimeout 
ca20: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
ca30: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
ca40: 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
ca50: 53 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 20 2a 2f  SETLK_TIMEOUT */
ca60: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  .../*.** Attempt
ca70: 20 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d   to set a system
ca80: 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
ca90: 65 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f  e pFile.  The lo
caa0: 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69  ck is .** descri
cab0: 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a  bed by pLock..**
cac0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65  .** If the pFile
cad0: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
cae0: 2f 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78  /write from unix
caf0: 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20  -excl, then the 
cb00: 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65  only lock.** eve
cb10: 72 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e  r obtained is an
cb20: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
cb30: 20 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69   and it is obtai
cb40: 6e 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  ned exactly once
cb50: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69  .** the first ti
cb60: 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61  me any lock is a
cb70: 74 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73  ttempted.  All s
cb80: 75 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d  ubsequent system
cb90: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72   locking.** oper
cba0: 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f  ations become no
cbb0: 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f  -ops.  Locking o
cbc0: 70 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20  perations still 
cbd0: 68 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c  happen internall
cbe0: 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  y,.** in order t
cbf0: 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63  o coordinate acc
cc00: 65 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61  ess between sepa
cc10: 72 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f  rate database co
cc20: 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74  nnections.** wit
cc30: 68 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73  hin this process
cc40: 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61  , but all of tha
cc50: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20  t is handled in 
cc60: 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a  memory and the.*
cc70: 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
cc80: 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74  em does not part
cc90: 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54  icipate..**.** T
cca0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ccb0: 61 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74  a pass-through t
ccc0: 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29  o fcntl(F_SETLK)
ccd0: 20 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69   if pFile is usi
cce0: 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74  ng.** any VFS ot
ccf0: 68 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65  her than "unix-e
cd00: 78 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65  xcl" or if pFile
cd10: 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75   is opened on "u
cd20: 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64  nix-excl".** and
cd30: 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a   is read-only..*
cd40: 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74  *.** Zero is ret
cd50: 75 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c  urned if the cal
cd60: 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63  l completes succ
cd70: 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20  essfully, or -1 
cd80: 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20  if a call.** to 
cd90: 66 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49  fcntl() fails. I
cda0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72  n this case, err
cdb0: 6e 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70  no is set approp
cdc0: 72 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74  riately (by fcnt
cdd0: 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  l())..*/.static 
cde0: 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  int unixFileLock
cdf0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
ce00: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
ce10: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
ce20: 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
ce30: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
ce40: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
ce50: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
ce60: 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ld() );.  assert
ce70: 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20  ( pInode!=0 );. 
ce80: 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74 72   if( (pFile->ctr
ce90: 6c 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46 49  lFlags & (UNIXFI
cea0: 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c 45  LE_EXCL|UNIXFILE
ceb0: 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58 46  _RDONLY))==UNIXF
cec0: 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20 20  ILE_EXCL ){.    
ced0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  if( pInode->bPro
cee0: 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  cessLock==0 ){. 
cef0: 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63       struct floc
cf00: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73  k lock;.      as
cf10: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
cf20: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock==0 );.      
cf30: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
cf40: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20  SEEK_SET;.      
cf50: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
cf60: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
cf70: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
cf80: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
cf90: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
cfa0: 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20   F_WRLCK;.      
cfb0: 72 63 20 3d 20 6f 73 53 65 74 50 6f 73 69 78 41  rc = osSetPosixA
cfc0: 64 76 69 73 6f 72 79 4c 6f 63 6b 28 70 46 69 6c  dvisoryLock(pFil
cfd0: 65 2d 3e 68 2c 20 26 6c 6f 63 6b 2c 20 70 46 69  e->h, &lock, pFi
cfe0: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
cff0: 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  c<0 ) return rc;
d000: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62  .      pInode->b
d010: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b  ProcessLock = 1;
d020: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
d030: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  Lock++;.    }els
d040: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  e{.      rc = 0;
d050: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
d060: 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50 6f      rc = osSetPo
d070: 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28  sixAdvisoryLock(
d080: 70 46 69 6c 65 2d 3e 68 2c 20 70 4c 6f 63 6b 2c  pFile->h, pLock,
d090: 20 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72   pFile);.  }.  r
d0a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d0b0: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
d0c0: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
d0d0: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
d0e0: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
d0f0: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
d100: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
d110: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
d120: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
d130: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
d140: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
d150: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
d160: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
d170: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
d180: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
d190: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
d1a0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
d1b0: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
d1c0: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
d1d0: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
d1e0: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
d1f0: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
d200: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
d210: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
d220: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
d230: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
d240: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
d250: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
d260: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
d270: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
d280: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
d290: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
d2a0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
d2b0: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
d2c0: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
d2d0: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
d2e0: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
d2f0: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
d300: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
d310: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
d320: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
d330: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
d340: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
d350: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
d360: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
d370: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
d380: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
d390: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
d3a0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
d3b0: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
d3c0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
d3d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
d3e0: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
d3f0: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
d400: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
d410: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
d420: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
d430: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
d440: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
d450: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
d460: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
d470: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
d480: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
d490: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
d4a0: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
d4b0: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
d4c0: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
d4d0: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
d4e0: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
d4f0: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
d500: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
d510: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
d520: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
d530: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
d540: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
d550: 20 77 69 74 68 20 57 69 6e 64 6f 77 73 39 35 20   with Windows95 
d560: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
d570: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
d580: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
d590: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
d5a0: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
d5b0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
d5c0: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
d5d0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
d5e0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
d5f0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
d600: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
d610: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
d620: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
d630: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
d640: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
d650: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
d660: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
d670: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
d680: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
d690: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
d6a0: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
d6b0: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
d6c0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
d6d0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
d6e0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
d6f0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
d700: 20 27 73 68 61 72 65 64 20 62 79 74 65 20 72 61   'shared byte ra
d710: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
d720: 6b 65 64 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  ked.  ** and the
d730: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
d740: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
d750: 61 73 65 64 2e 20 20 28 4c 65 67 61 63 79 20 6e  ased.  (Legacy n
d760: 6f 74 65 3a 20 20 57 68 65 6e 0a 20 20 2a 2a 20  ote:  When.  ** 
d770: 53 51 4c 69 74 65 20 77 61 73 20 66 69 72 73 74  SQLite was first
d780: 20 64 65 76 65 6c 6f 70 65 64 2c 20 57 69 6e 64   developed, Wind
d790: 6f 77 73 39 35 20 73 79 73 74 65 6d 73 20 77 65  ows95 systems we
d7a0: 72 65 20 73 74 69 6c 6c 20 76 65 72 79 20 63 6f  re still very co
d7b0: 6d 6d 6f 6e 2c 0a 20 20 2a 2a 20 61 6e 64 20 57  mmon,.  ** and W
d7c0: 69 64 6e 6f 77 73 39 35 20 6c 61 63 6b 73 20 61  idnows95 lacks a
d7d0: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 63 61 70   shared-lock cap
d7e0: 61 62 69 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 20  ability.  So on 
d7f0: 57 69 6e 64 6f 77 73 39 35 2c 20 61 0a 20 20 2a  Windows95, a.  *
d800: 2a 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c  * single randoml
d810: 79 20 73 65 6c 65 63 74 65 64 20 62 79 20 66 72  y selected by fr
d820: 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62  om the 'shared b
d830: 79 74 65 20 72 61 6e 67 65 27 20 69 73 20 6c 6f  yte range' is lo
d840: 63 6b 65 64 2e 0a 20 20 2a 2a 20 57 69 6e 64 6f  cked..  ** Windo
d850: 77 73 39 35 20 69 73 20 6e 6f 77 20 70 72 65 74  ws95 is now pret
d860: 74 79 20 6d 75 63 68 20 65 78 74 69 6e 63 74 2c  ty much extinct,
d870: 20 62 75 74 20 74 68 69 73 20 77 6f 72 6b 2d 61   but this work-a
d880: 72 6f 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20  round for the.  
d890: 2a 2a 20 6c 61 63 6b 20 6f 66 20 73 68 61 72 65  ** lack of share
d8a0: 64 2d 6c 6f 63 6b 73 20 6f 6e 20 57 69 6e 64 6f  d-locks on Windo
d8b0: 77 73 39 35 20 6c 69 76 65 73 20 6f 6e 2c 20 66  ws95 lives on, f
d8c0: 6f 72 20 62 61 63 6b 77 61 72 64 73 0a 20 20 2a  or backwards.  *
d8d0: 2a 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e  * compatibility.
d8e0: 29 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72  ).  **.  ** A pr
d8f0: 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f  ocess may only o
d900: 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44  btain a RESERVED
d910: 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68   lock after it h
d920: 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  as a SHARED lock
d930: 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45  ..  ** A RESERVE
d940: 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  D lock is implem
d950: 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e  ented by grabbin
d960: 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f  g a write-lock o
d970: 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65  n the.  ** 'rese
d980: 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a  rved byte'. .  *
d990: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
d9a0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
d9b0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
d9c0: 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74  after it has obt
d9d0: 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41  ained a.  ** SHA
d9e0: 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44  RED lock. A PEND
d9f0: 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c  ING lock is impl
da00: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
da10: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
da20: 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70  k.  ** on the 'p
da30: 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68  ending byte'. Th
da40: 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  is ensures that 
da50: 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f  no new SHARED lo
da60: 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20  cks can be.  ** 
da70: 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78  obtained, but ex
da80: 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f  isting SHARED lo
da90: 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20  cks are allowed 
daa0: 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72  to persist. A pr
dab0: 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20  ocess.  ** does 
dac0: 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61  not have to obta
dad0: 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  in a RESERVED lo
dae0: 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ck on the way to
daf0: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e   a PENDING lock.
db00: 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65  .  ** This prope
db10: 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74  rty is used by t
db20: 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72  he algorithm for
db30: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20   rolling back a 
db40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a  journal file.  *
db50: 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e  * after a crash.
db60: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58  .  **.  ** An EX
db70: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62  CLUSIVE lock, ob
db80: 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50  tained after a P
db90: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68  ENDING lock is h
dba0: 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70  eld, is.  ** imp
dbb0: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
dbc0: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
dbd0: 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65  ck on the entire
dbe0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
dbf0: 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65  ** range'. Since
dc00: 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73   all other locks
dc10: 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d   require a read-
dc20: 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  lock on one of t
dc30: 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69  he bytes.  ** wi
dc40: 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c  thin this range,
dc50: 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   this ensures th
dc60: 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b  at no other lock
dc70: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68  s are held on th
dc80: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
dc90: 20 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20   .  */.  int rc 
dca0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
dcb0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
dcc0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
dcd0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
dce0: 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63  *pInode;.  struc
dcf0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
dd00: 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a  int tErrno = 0;.
dd10: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
dd20: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
dd30: 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61  LOCK    %d %s wa
dd40: 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d  s %s(%s,%d) pid=
dd50: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
dd60: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a  ile->h,.      az
dd70: 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
dd80: 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
dd90: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
dda0: 29 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c  ),.      azFileL
ddb0: 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ock(pFile->pInod
ddc0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
ddd0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
dde0: 68 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47  hared,.      osG
ddf0: 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f  etpid(0)));..  /
de00: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
de10: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
de20: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
de30: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
de40: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
de50: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
de60: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
de70: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
de80: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
de90: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
dea0: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
deb0: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
dec0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
ded0: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
dee0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
def0: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
df00: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
df10: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
df20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
df30: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
df40: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
df50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
df60: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
df70: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
df80: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
df90: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
dfa0: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
dfb0: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
dfc0: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
dfd0: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
dfe0: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
dff0: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
e000: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
e010: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
e020: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
e030: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
e040: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
e050: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
e060: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
e070: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
e080: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
e090: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
e0a0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
e0b0: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
e0c0: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
e0d0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
e0e0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
e0f0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e100: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
e110: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
e120: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
e130: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
e140: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
e150: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
e160: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
e170: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
e180: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
e190: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
e1a0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
e1b0: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
e1c0: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
e1d0: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
e1e0: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
e1f0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
e200: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
e210: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
e220: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
e230: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
e240: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
e250: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
e260: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
e270: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
e280: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
e290: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
e2a0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
e2b0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
e2c0: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
e2d0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
e2e0: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
e2f0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
e300: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
e310: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
e320: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
e330: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
e340: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
e350: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
e360: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
e370: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
e380: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
e390: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
e3a0: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
e3b0: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
e3c0: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
e3d0: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
e3e0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e3f0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
e400: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
e410: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e420: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
e430: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
e440: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
e450: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
e460: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
e470: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
e480: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
e490: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
e4a0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
e4b0: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
e4c0: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
e4d0: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
e4e0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
e4f0: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
e500: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
e510: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
e520: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
e530: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
e540: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
e550: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
e560: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
e570: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
e580: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
e590: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
e5a0: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
e5b0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
e5c0: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
e5d0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
e5e0: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
e5f0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
e600: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
e610: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
e620: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
e630: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
e640: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
e650: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
e660: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
e670: 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
e680: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e690: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e6a0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e6b0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e6c0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
e6d0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e6e0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
e6f0: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
e700: 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
e710: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
e720: 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
e730: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
e740: 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
e750: 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
e760: 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
e770: 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
e780: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
e790: 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
e7a0: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
e7b0: 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
e7c0: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
e7d0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
e7e0: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e7f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
e800: 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
e810: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Lock==0 );.    a
e820: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
e830: 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  E_OK );..    /* 
e840: 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64  Now get the read
e850: 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63  -lock */.    loc
e860: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
e870: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f  ED_FIRST;.    lo
e880: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
e890: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20  D_SIZE;.    if( 
e8a0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
e8b0: 6c 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20  le, &lock) ){.  
e8c0: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
e8d0: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
e8e0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e8f0: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e900: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
e910: 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  CK);.    }..    
e920: 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70  /* Drop the temp
e930: 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f  orary PENDING lo
e940: 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck */.    lock.l
e950: 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47  _start = PENDING
e960: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
e970: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
e980: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
e990: 55 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75  UNLCK;.    if( u
e9a0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e9b0: 65 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d  e, &lock) && rc=
e9c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
e9d0: 20 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c      /* This coul
e9e0: 64 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20  d happen with a 
e9f0: 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f  network mount */
ea00: 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
ea10: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
ea20: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
ea30: 4e 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20  NLOCK; .    }.. 
ea40: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
ea50: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ea60: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
ea70: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
ea80: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
ea90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
eaa0: 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
eab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
eac0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
ead0: 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
eae0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
eaf0: 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
eb00: 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
eb10: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
eb20: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
eb30: 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
eb40: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
eb50: 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
eb60: 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
eb70: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
eb80: 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
eb90: 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a  ad in this.    *
eba0: 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69  * same process i
ebb0: 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  s still holding 
ebc0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a  a shared lock. *
ebd0: 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  /.    rc = SQLIT
ebe0: 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b  E_BUSY;.  }else{
ebf0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
ec00: 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45  est was for a RE
ec10: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
ec20: 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73  IVE lock.  It is
ec30: 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20  .    ** assumed 
ec40: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20  that there is a 
ec50: 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65  SHARED or greate
ec60: 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  r lock on the fi
ec70: 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  le.    ** alread
ec80: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  y..    */.    as
ec90: 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
eca0: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
ecb0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
ecc0: 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73  _WRLCK;..    ass
ecd0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ert( eFileLock==
ece0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
ecf0: 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
ed00: 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
ed10: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
ed20: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
ed30: 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
ed40: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
ed50: 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  BYTE;.      lock
ed60: 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20  .l_len = 1L;.   
ed70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f   }else{.      lo
ed80: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
ed90: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
eda0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
edb0: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d  ARED_SIZE;.    }
edc0: 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ..    if( unixFi
edd0: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
ede0: 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45  ock) ){.      tE
edf0: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
ee00: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
ee10: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
ee20: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
ee30: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
ee40: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
ee50: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
ee60: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
ee70: 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
ee80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ee90: 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20  .  }.  ..#ifdef 
eea0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
eeb0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61  * Set up the tra
eec0: 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72  nsaction-counter
eed0: 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67   change checking
eee0: 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a   flags when.  **
eef0: 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66   transitioning f
ef00: 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20  rom a SHARED to 
ef10: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e  a RESERVED lock.
ef20: 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a    The change.  *
ef30: 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f  * from SHARED to
ef40: 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20   RESERVED marks 
ef50: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
ef60: 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77   a normal.  ** w
ef70: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28  rite operation (
ef80: 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61  not a hot journa
ef90: 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a  l rollback)..  *
efa0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
efb0: 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c  TE_OK.   && pFil
efc0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  e->eFileLock<=SH
efd0: 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20  ARED_LOCK.   && 
efe0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
eff0: 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20  VED_LOCK.  ){.  
f000: 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
f010: 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20  trChng = 0;.    
f020: 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
f030: 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
f040: 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
f050: 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  1;.  }.#endif...
f060: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f070: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  _OK ){.    pFile
f080: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
f090: 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e  ileLock;.    pIn
f0a0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
f0b0: 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65   eFileLock;.  }e
f0c0: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
f0d0: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
f0e0: 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
f0f0: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
f100: 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  ING_LOCK;.    pI
f110: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
f120: 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
f130: 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20    }..end_lock:. 
f140: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
f150: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
f160: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
f170: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
f180: 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
f190: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
f1a0: 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
f1b0: 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
f1c0: 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
f1d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
f1e0: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
f1f0: 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65  tor used by file
f200: 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f   handle pFile to
f210: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
f220: 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69  ng.** pUnused li
f230: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
f240: 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28  id setPendingFd(
f250: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
f260: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
f270: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
f280: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
f290: 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70  xUnusedFd *p = p
f2a0: 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61  File->pPrealloca
f2b0: 74 65 64 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e  tedUnused;.  p->
f2c0: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
f2d0: 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64  pUnused;.  pInod
f2e0: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a  e->pUnused = p;.
f2f0: 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b    pFile->h = -1;
f300: 0a 20 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c  .  pFile->pPreal
f310: 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20  locatedUnused = 
f320: 30 3b 0a 20 20 6e 55 6e 75 73 65 64 46 64 2b 2b  0;.  nUnusedFd++
f330: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
f340: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
f350: 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
f360: 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
f370: 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
f380: 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
f390: 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
f3a0: 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
f3b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
f3c0: 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
f3d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
f3e0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
f3f0: 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
f400: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
f410: 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
f420: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
f430: 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c  .** .** If handl
f440: 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72  eNFSUnlock is tr
f450: 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e  ue, then on down
f460: 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55  grading an EXCLU
f470: 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41  SIVE_LOCK to SHA
f480: 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20  RED.** the byte 
f490: 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64  range is divided
f4a0: 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e   into 2 parts an
f4b0: 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74  d the first part
f4c0: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65   is unlocked the
f4d0: 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65  n.** set to a re
f4e0: 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ad lock, then th
f4f0: 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20  e other part is 
f500: 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e  simply unlocked.
f510: 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a    This works .**
f520: 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e   around a bug in
f530: 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28   BSD NFS lockd (
f540: 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63  also seen on Mac
f550: 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20  OSX 10.3+) that 
f560: 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d  fails to .** rem
f570: 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ove the write lo
f580: 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77  ck on a region w
f590: 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
f5a0: 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69  is set..*/.stati
f5b0: 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63  c int posixUnloc
f5c0: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
f5d0: 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
f5e0: 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53  k, int handleNFS
f5f0: 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46  Unlock){.  unixF
f600: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
f610: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
f620: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
f630: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
f640: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
f650: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f660: 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
f670: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
f680: 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
f690: 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d  s %d(%d,%d) pid=
f6a0: 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  %d (unix)\n", pF
f6b0: 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
f6c0: 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k,.      pFile->
f6d0: 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
f6e0: 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ->pInode->eFileL
f6f0: 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
f700: 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20  de->nShared,.   
f710: 20 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29     osGetpid(0)))
f720: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
f730: 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
f740: 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
f750: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
f760: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
f770: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
f780: 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
f790: 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
f7a0: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
f7b0: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
f7c0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
f7d0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
f7e0: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
f7f0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
f800: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
f810: 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
f820: 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69  eFileLock );..#i
f830: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
f840: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
f850: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
f860: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
f870: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
f880: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
f890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
f8a0: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
f8b0: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
f8c0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
f8d0: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
f8e0: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
f8f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
f900: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
f910: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
f920: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
f930: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
f940: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
f950: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
f960: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
f970: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
f980: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
f990: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
f9a0: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
f9b0: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
f9c0: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
f9d0: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
f9e0: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
f9f0: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
fa00: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
fa10: 20 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d     */.    pFile-
fa20: 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
fa30: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
fa40: 2f 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74  /* downgrading t
fa50: 6f 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  o a shared lock 
fa60: 6f 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20  on NFS involves 
fa70: 63 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69  clearing the wri
fa80: 74 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62  te lock.    ** b
fa90: 65 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69  efore establishi
faa0: 6e 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20  ng the readlock 
fab0: 2d 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63  - to avoid a rac
fac0: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64  e condition we d
fad0: 6f 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20  owngrade.    ** 
fae0: 74 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c  the lock in 2 bl
faf0: 6f 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61  ocks, so that pa
fb00: 72 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20  rt of the range 
fb10: 77 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20  will be covered 
fb20: 62 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69  by a .    ** wri
fb30: 74 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68  te lock until th
fb40: 65 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65  e rest is covere
fb50: 64 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b  d by a read lock
fb60: 3a 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b  :.    **  1:   [
fb70: 57 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32  WWWWW].    **  2
fb80: 3a 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20  :   [....W].    
fb90: 2a 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d  **  3:   [RRRRW]
fba0: 0a 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52  .    **  4:   [R
fbb0: 52 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20  RRR.].    */.   
fbc0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
fbd0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23  SHARED_LOCK ){.#
fbe0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50  if !defined(__AP
fbf0: 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54  PLE__) || !SQLIT
fc00: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
fc10: 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f  _STYLE.      (vo
fc20: 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  id)handleNFSUnlo
fc30: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
fc40: 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  ( handleNFSUnloc
fc50: 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23  k==0 );.#endif.#
fc60: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
fc70: 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
fc80: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
fc90: 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68  TYLE.      if( h
fca0: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29  andleNFSUnlock )
fcb0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45  {.        int tE
fcc0: 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  rrno;           
fcd0: 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
fce0: 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61  e from system ca
fcf0: 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ll errors */.   
fd00: 20 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69       off_t divSi
fd10: 7a 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  ze = SHARED_SIZE
fd20: 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20   - 1;.        . 
fd30: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
fd40: 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20  pe = F_UNLCK;.  
fd50: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
fd60: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
fd70: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
fd80: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
fd90: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
fda0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
fdb0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
fdc0: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
fdd0: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
fde0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
fdf0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
fe00: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
fe10: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
fe20: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
fe30: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
fe40: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
fe50: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
fe60: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
fe70: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79         lock.l_ty
fe80: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
fe90: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
fea0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
feb0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73          lock.l_s
fec0: 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
fed0: 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  RST;.        loc
fee0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a  k.l_len = divSiz
fef0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
ff00: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
ff10: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
ff20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
ff30: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ff40: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
ff50: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
ff60: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
ff70: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
ff80: 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
ff90: 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
ffa0: 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
ffb0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ffc0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
ffd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ffe0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
fff0: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
10000 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
10010 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
10020 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
10030 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
10040 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
10050 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
10060 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b  D_FIRST+divSize;
10070 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
10080 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
10090 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  E-divSize;.     
100a0 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
100b0 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
100c0 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
100d0 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
100e0 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
100f0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10100 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
10110 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10120 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
10130 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
10140 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
10150 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
10160 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
10170 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
10180 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
10190 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
101a0 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
101b0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
101c0 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
101d0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
101e0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
101f0 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10200 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
10210 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
10220 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
10230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
10240 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10250 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
10260 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
10270 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
10280 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
10290 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
102a0 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
102b0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
102c0 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
102d0 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
102e0 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
102f0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
10300 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
10310 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
10320 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
10330 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
10340 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
10350 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
10360 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
10370 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
10380 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
10390 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
103a0 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
103b0 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
103c0 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
103d0 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
103e0 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
103f0 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
10400 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
10410 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
10420 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
10430 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10440 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
10450 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
10460 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
10470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10480 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10490 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
104a0 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
104b0 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
104c0 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
104d0 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
104e0 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
104f0 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
10500 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
10510 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
10520 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
10530 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
10540 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
10550 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
10560 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
10570 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
10580 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
10590 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
105a0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
105b0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74  rrno);.      got
105c0 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
105d0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
105e0 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
105f0 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
10600 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
10610 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
10620 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
10630 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
10640 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
10650 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
10660 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
10670 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
10680 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
10690 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
106a0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
106b0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
106c0 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
106d0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
106e0 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
106f0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
10700 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
10710 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10720 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
10730 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
10740 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
10750 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
10760 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
10770 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
10780 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
10790 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
107a0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
107b0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
107c0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
107d0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49  rno);.        pI
107e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
107f0 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
10800 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10810 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
10820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10830 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
10840 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
10850 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
10860 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
10870 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
10880 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
10890 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
108a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
108b0 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
108c0 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
108d0 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
108e0 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
108f0 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
10900 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
10910 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
10920 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
10930 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
10940 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
10950 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
10960 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65  e);.    }.  }..e
10970 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
10980 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
10990 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
109a0 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
109b0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
109c0 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
109d0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
109e0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
109f0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
10a00 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
10a10 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
10a20 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
10a30 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
10a40 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
10a50 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
10a60 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
10a70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10a80 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
10a90 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
10aa0 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
10ab0 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
10ac0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
10ad0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
10ae0 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
10af0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
10b00 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51  ileLock){.#if SQ
10b10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
10b20 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65  ZE>0.  assert( e
10b30 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
10b40 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46  _LOCK || ((unixF
10b50 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63  ile *)id)->nFetc
10b60 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut==0 );.#endi
10b70 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  f.  return posix
10b80 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
10b90 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Lock, 0);.}..#if
10ba0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
10bb0 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
10bc0 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
10bd0 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
10be0 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63  4 nByte);.static
10bf0 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
10c00 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
10c10 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d);.#endif../*.*
10c20 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10c30 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
10c40 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
10c50 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
10c60 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
10c70 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
10c80 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
10c90 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
10ca0 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
10cb0 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
10cc0 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
10cd0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
10ce0 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
10cf0 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
10d00 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
10d10 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
10d20 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
10d30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
10d40 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
10d50 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
10d60 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
10d70 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
10d80 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
10d90 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
10da0 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
10db0 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
10dc0 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
10dd0 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
10de0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10df0 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53  xFile*)id;.#if S
10e00 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
10e10 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61  IZE>0.  unixUnma
10e20 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
10e30 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
10e40 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
10e50 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
10e60 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
10e70 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
10e80 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
10e90 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
10ea0 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
10eb0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
10ec0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
10ed0 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
10ee0 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
10ef0 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
10f00 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
10f10 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
10f20 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
10f30 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
10f40 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
10f50 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
10f60 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
10f70 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69  _CLOSE.  if( pFi
10f80 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
10f90 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
10fa0 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  ){.    osUnlink(
10fb0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
10fc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10fd0 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d  *(char**)&pFile-
10fe0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
10ff0 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20  le->zPath = 0;. 
11000 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
11010 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
11020 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
11030 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
11040 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
11050 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 50 72 65  free(pFile->pPre
11060 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 29  allocatedUnused)
11070 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69 6c 65  ;.  memset(pFile
11080 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78  , 0, sizeof(unix
11090 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75 72 6e  File));.  return
110a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
110b0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
110c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
110d0 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c 69 74   unixClose(sqlit
110e0 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20  e3_file *id){.  
110f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11100 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
11110 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
11120 65 20 2a 29 69 64 3b 0a 20 20 76 65 72 69 66 79  e *)id;.  verify
11130 44 62 46 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20  DbFile(pFile);. 
11140 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20   unixUnlock(id, 
11150 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78  NO_LOCK);.  unix
11160 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20  EnterMutex();.. 
11170 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e   /* unixFile.pIn
11180 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20 76 61  ode is always va
11190 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77  lid here. Otherw
111a0 69 73 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74  ise, a different
111b0 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74   close.  ** rout
111c0 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b  ine (e.g. nolock
111d0 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62  Close()) would b
111e0 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
111f0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
11200 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
11210 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65  nLock>0 || pFile
11220 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
11230 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69  ssLock==0 );.  i
11240 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d  f( ALWAYS(pFile-
11250 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c  >pInode) && pFil
11260 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
11270 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
11280 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
11290 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
112a0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
112b0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
112c0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
112d0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
112e0 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
112f0 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
11300 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
11310 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
11320 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74  de->pUnused list
11330 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
11340 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
11350 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20  ed .    ** when 
11360 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
11370 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f   cleared..    */
11380 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46  .    setPendingF
11390 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20  d(pFile);.  }.  
113a0 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
113b0 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20  (pFile);.  rc = 
113c0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
113d0 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
113e0 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
113f0 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
11400 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
11410 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
11420 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
11430 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
11440 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2f 0a 0a 2f 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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
114f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11500 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63  ****** No-op Loc
11510 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
11520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11530 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66  *******.**.** Of
11540 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63   the various loc
11550 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74  king implementat
11560 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  ions available, 
11570 74 68 69 73 20 69 73 20 62 79 20 66 61 72 20 74  this is by far t
11580 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20  he.** simplest: 
11590 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f   locking is igno
115a0 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74  red.  No attempt
115b0 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b   is made to lock
115c0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
115d0 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64 69 6e   file for readin
115e0 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  g or writing..**
115f0 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67  .** This locking
11600 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f 70 72   mode is appropr
11610 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f 6e 20  iate for use on 
11620 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
11630 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61  ses.** (ex: data
11640 62 61 73 65 73 20 74 68 61 74 20 61 72 65 20 62  bases that are b
11650 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f  urned into CD-RO
11660 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29  M, for example.)
11670 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f    It can.** also
11680 20 62 65 20 75 73 65 64 20 69 66 20 74 68 65 20   be used if the 
11690 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c  application empl
116a0 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72 6e 61  oys some externa
116b0 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a  l mechanism to.*
116c0 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75 6c 74  * prevent simult
116d0 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20 6f 66  aneous access of
116e0 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62 61   the same databa
116f0 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72  se by two or mor
11700 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
11710 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75 74 20  nnections.  But 
11720 74 68 65 72 65 20 69 73 20 61 20 73 65 72 69 6f  there is a serio
11730 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74 61 62  us risk of datab
11740 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  ase.** corruptio
11750 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e  n if this lockin
11760 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64 20 69  g mode is used i
11770 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77 68 65  n situations whe
11780 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64  re multiple.** d
11790 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
117a0 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73 69 6e  ons are accessin
117b0 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
117c0 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
117d0 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64  same.** time and
117e0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
117f0 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  those connection
11800 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a  s are writing..*
11810 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  /..static int no
11820 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
11830 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
11840 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  le *NotUsed, int
11850 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e   *pResOut){.  UN
11860 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
11870 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52 65 73  otUsed);.  *pRes
11880 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Out = 0;.  retur
11890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
118a0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
118b0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
118c0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
118d0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
118e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
118f0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
11900 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
11910 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  TE_OK;.}.static 
11920 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  int nolockUnlock
11930 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
11940 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
11950 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
11960 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
11970 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
11980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11990 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
119a0 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  e the file..*/.s
119b0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
119c0 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
119d0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65 74 75  le *id) {.  retu
119e0 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65  rn closeUnixFile
119f0 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  (id);.}../******
11a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
11a10 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c  d of the no-op l
11a20 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
11a30 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
11a40 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
11aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
11af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b00 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69  *** Begin dot-fi
11b10 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  le Locking *****
11b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
11b40 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  The dotfile lock
11b50 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ing implementati
11b60 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78 69 73  on uses the exis
11b70 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74  tence of separat
11b80 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20  e lock.** files 
11b90 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74  (really a direct
11ba0 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  ory) to control 
11bb0 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
11bc0 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f  tabase.  This wo
11bd0 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61  rks.** on just a
11be0 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c 65 73  bout every files
11bf0 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65  ystem imaginable
11c00 2e 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65  .  But there are
11c10 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64   serious downsid
11c20 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  es:.**.**    (1)
11c30 20 20 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20    There is zero 
11c40 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20  concurrency.  A 
11c50 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c  single reader bl
11c60 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a  ocks all other.*
11c70 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63  *         connec
11c80 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69  tions from readi
11c90 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  ng or writing th
11ca0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
11cb0 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61 70 70  *    (2)  An app
11cc0 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f  lication crash o
11cd0 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e  r power loss can
11ce0 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63   leave stale loc
11cf0 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20  k files.**      
11d00 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e     sitting aroun
11d10 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  d that need to b
11d20 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c  e cleared manual
11d30 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74  ly..**.** Nevert
11d40 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63  heless, a dotloc
11d50 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69  k is an appropri
11d60 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  ate locking mode
11d70 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a   for use if no.*
11d80 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
11d90 73 74 72 61 74 65 67 79 20 69 73 20 61 76 61 69  strategy is avai
11da0 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74  lable..**.** Dot
11db0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72  file locking wor
11dc0 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  ks by creating a
11dd0 20 73 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e   subdirectory in
11de0 20 74 68 65 20 73 61 6d 65 20 64 69 72 65 63 74   the same direct
11df0 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61  ory as.** the da
11e00 74 61 62 61 73 65 20 61 6e 64 20 77 69 74 68 20  tabase and with 
11e10 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75  the same name bu
11e20 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22  t with a ".lock"
11e30 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64   extension added
11e40 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e  ..** The existen
11e50 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72  ce of a lock dir
11e60 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61  ectory implies a
11e70 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
11e80 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  .  All other.** 
11e90 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48 41 52  lock types (SHAR
11ea0 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45  ED, RESERVED, PE
11eb0 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65  NDING) are mappe
11ec0 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45  d into EXCLUSIVE
11ed0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ..*/../*.** The 
11ee0 66 69 6c 65 20 73 75 66 66 69 78 20 61 64 64 65  file suffix adde
11ef0 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 62 61  d to the data ba
11f00 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f  se filename in o
11f10 72 64 65 72 20 74 6f 20 63 72 65 61 74 65 20 74  rder to create t
11f20 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63  he.** lock direc
11f30 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  tory..*/.#define
11f40 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20   DOTLOCK_SUFFIX 
11f50 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54  ".lock"../*.** T
11f60 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
11f70 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
11f80 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
11f90 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
11fa0 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
11fb0 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
11fc0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
11fd0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
11fe0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
11ff0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
12000 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
12010 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
12020 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
12030 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
12040 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
12050 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
12060 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
12070 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
12080 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74  ng..**.** In dot
12090 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69  file locking, ei
120a0 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73  ther a lock exis
120b0 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f  ts or it does no
120c0 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a  t.  So in this.*
120d0 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43  * variation of C
120e0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
120f0 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20  (), *pResOut is 
12100 73 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61  set to true if a
12110 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65  ny lock.** is he
12120 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61  ld on the file a
12130 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68 65 20  nd false if the 
12140 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
12150 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12160 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
12170 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
12180 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
12190 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74  pResOut) {.  int
121a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
121b0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
121c0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
121d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
121e0 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
121f0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
12200 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
12210 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
12220 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
12230 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 72 65  t( pFile );.  re
12240 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73  served = osAcces
12250 73 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  s((const char*)p
12260 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
12270 74 65 78 74 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f  text, 0)==0;.  O
12280 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
12290 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
122a0 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
122b0 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
122c0 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
122d0 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
122e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
122f0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
12300 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
12310 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
12320 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
12330 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
12340 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
12350 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
12360 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
12370 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
12380 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
12390 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
123a0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
123b0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
123c0 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
123d0 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
123e0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
123f0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
12400 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
12410 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
12420 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
12430 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
12440 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
12450 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
12460 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
12470 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
12480 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
12490 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
124a0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
124b0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
124c0 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
124d0 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
124e0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
124f0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
12500 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
12510 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
12520 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
12530 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
12540 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12550 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12560 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
12570 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
12580 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
12590 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
125a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
125b0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
125c0 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
125d0 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
125e0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
125f0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
12600 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
12610 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
12620 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
12630 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
12640 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
12650 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
12660 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
12670 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
12680 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
12690 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
126a0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
126b0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
126c0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
126d0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
126e0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
126f0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
12700 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
12710 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
12720 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12730 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
12740 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
12750 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
12760 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
12770 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
12780 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
12790 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
127a0 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
127b0 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
127c0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
127d0 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
127e0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
127f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
12800 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
12810 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
12820 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
12830 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
12840 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
12850 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
12860 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
12870 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
12880 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
12890 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
128a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
128b0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
128c0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
128d0 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69  */.  rc = osMkdi
128e0 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37  r(zLockFile, 077
128f0 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  7);.  if( rc<0 )
12900 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
12910 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
12920 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  he lock director
12930 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  y */.    int tEr
12940 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12950 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
12960 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
12970 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
12980 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
12990 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
129a0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
129b0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
129c0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
129d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
129e0 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
129f0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
12a00 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
12a10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12a20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
12a30 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74    } .  .  /* got
12a40 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
12a50 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
12a60 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  */.  pFile->eFil
12a70 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
12a80 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
12a90 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
12aa0 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12ab0 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
12ac0 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
12ad0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
12ae0 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
12af0 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
12b00 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
12b10 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
12b20 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
12b30 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
12b40 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
12b50 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
12b60 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
12b70 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
12b80 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
12b90 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f  *.** When the lo
12ba0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63  cking level reac
12bb0 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c  hes NO_LOCK, del
12bc0 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  ete the lock fil
12bd0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
12be0 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73   dotlockUnlock(s
12bf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
12c00 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
12c10 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
12c20 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
12c30 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f  )id;.  char *zLo
12c40 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a  ckFile = (char *
12c50 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
12c60 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63  ontext;.  int rc
12c70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
12c80 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
12c90 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
12ca0 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 64  was %d pid=%d (d
12cb0 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  otlock)\n", pFil
12cc0 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
12cd0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
12ce0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73  e->eFileLock, os
12cf0 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61  Getpid(0)));.  a
12d00 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
12d10 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
12d20 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
12d30 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
12d40 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
12d50 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
12d60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
12d70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
12d80 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64 65 20  /* To downgrade 
12d90 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d 70 6c  to shared, simpl
12da0 79 20 75 70 64 61 74 65 20 6f 75 72 20 69 6e 74  y update our int
12db0 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20  ernal notion of 
12dc0 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 73 74  the.  ** lock st
12dd0 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f  ate.  No need to
12de0 20 6d 65 73 73 20 77 69 74 68 20 74 68 65 20 66   mess with the f
12df0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a  ile on disk..  *
12e00 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
12e10 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
12e20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
12e30 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
12e40 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
12e50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12e60 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c 6c 79    .  /* To fully
12e70 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   unlock the data
12e80 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74 68 65  base, delete the
12e90 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 20 20   lock file */.  
12ea0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
12eb0 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  k==NO_LOCK );.  
12ec0 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a 4c 6f  rc = osRmdir(zLo
12ed0 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72  ckFile);.  if( r
12ee0 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 74  c<0 ){.    int t
12ef0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
12f00 20 20 20 69 66 28 20 74 45 72 72 6e 6f 3d 3d 45     if( tErrno==E
12f10 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 72  NOENT ){.      r
12f20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12f30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12f40 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
12f50 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
12f60 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12f70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
12f80 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
12f90 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65  rc; .  }.  pFile
12fa0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
12fb0 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  _LOCK;.  return 
12fc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12fd0 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
12fe0 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  .  Make sure the
12ff0 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 72   lock has been r
13000 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65 20 63  eleased before c
13010 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  losing..*/.stati
13020 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f  c int dotlockClo
13030 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13040 2a 69 64 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  *id) {.  unixFil
13050 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13060 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73 65  File*)id;.  asse
13070 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 64  rt( id!=0 );.  d
13080 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c  otlockUnlock(id,
13090 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c   NO_LOCK);.  sql
130a0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
130b0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
130c0 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65  ;.  return close
130d0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a  UnixFile(id);.}.
130e0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
130f0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64  *** End of the d
13100 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70  ot-file lock imp
13110 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
13120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
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 2a 2a 2a 2f 0a  **************/.
13180 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
13190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
131a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a  ****************
131d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
131e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
131f0 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20  n flock Locking 
13200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13220 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  .**.** Use the f
13230 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61  lock() system ca
13240 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f  ll to do file lo
13250 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f  cking..**.** flo
13260 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20  ck() locking is 
13270 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f  like dot-file lo
13280 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68  cking in that th
13290 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e  e various.** fin
132a0 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20  e-grain locking 
132b0 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64  levels supported
132c0 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63   by SQLite are c
132d0 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a  ollapsed into.**
132e0 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73   a single exclus
132f0 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74  ive lock.  In ot
13300 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45  her words, SHARE
13310 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64  D, RESERVED, and
13320 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  .** PENDING lock
13330 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74  s are the same t
13340 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55  hing as an EXCLU
13350 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69  SIVE lock.  SQLi
13360 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b  te.** still work
13370 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68  s when you do th
13380 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65  is, but concurre
13390 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73  ncy is reduced s
133a0 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73  ince.** only a s
133b0 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
133c0 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65  n be reading the
133d0 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74   database at a t
133e0 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20  ime..**.** Omit 
133f0 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20  this section if 
13400 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
13410 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74  CKING_STYLE is t
13420 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66  urned off.*/.#if
13430 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
13440 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
13450 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28  .** Retry flock(
13460 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
13470 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a  l with EINTR.*/.
13480 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61  #ifdef EINTR.sta
13490 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
134a0 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74  lock(int fd, int
134b0 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   op){.  int rc;.
134c0 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b    do{ rc = flock
134d0 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28  (fd,op); }while(
134e0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
134f0 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
13500 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
13510 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c  define robust_fl
13520 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61  ock(a,b) flock(a
13530 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ,b).#endif.     
13540 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
13550 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
13560 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
13570 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
13580 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
13590 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
135a0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
135b0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
135c0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
135d0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
135e0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
135f0 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
13600 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
13610 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
13620 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
13630 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
13640 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
13650 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
13660 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
13670 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
13680 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
13690 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
136a0 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
136b0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
136c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
136d0 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
136e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
136f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13700 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
13710 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
13720 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
13730 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
13740 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
13750 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
13760 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
13770 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
13780 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
13790 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
137a0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
137b0 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
137c0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
137d0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
137e0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
137f0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
13800 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
13810 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
13820 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
13830 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
13840 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62     int lrc = rob
13850 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
13860 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
13870 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
13880 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
13890 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
138a0 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
138b0 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66    lrc = robust_f
138c0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
138d0 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
138e0 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
138f0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
13900 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
13910 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
13920 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
13930 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  /.        lrc = 
13940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
13950 4f 43 4b 3b 20 0a 20 20 20 20 20 20 20 20 73 74  OCK; .        st
13960 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
13970 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
13980 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20       rc = lrc;. 
13990 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73       }.    } els
139a0 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45  e {.      int tE
139b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
139c0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
139d0 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f  ;.      /* someo
139e0 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68 61  ne else might ha
139f0 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20 2a  ve it reserved *
13a00 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73 71  /.      lrc = sq
13a10 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
13a20 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
13a30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
13a40 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20 49  K); .      if( I
13a50 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
13a60 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
13a70 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
13a80 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
13a90 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20      rc = lrc;.  
13aa0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13ab0 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
13ac0 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
13ad0 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  d (flock)\n", pF
13ae0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
13af0 72 76 65 64 29 29 3b 0a 0a 23 69 66 64 65 66 20  rved));..#ifdef 
13b00 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
13b10 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
13b20 20 20 69 66 28 20 28 72 63 20 26 20 30 78 66 66    if( (rc & 0xff
13b30 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
13b40 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
13b50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
13b60 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
13b70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13b80 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13b90 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
13ba0 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
13bb0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13bc0 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
13bd0 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
13be0 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
13bf0 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
13c00 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
13c10 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
13c20 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
13c30 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
13c40 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
13c50 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
13c60 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
13c70 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
13c80 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
13c90 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13ca0 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13cb0 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13cc0 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13cd0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
13ce0 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
13cf0 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
13d00 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
13d10 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
13d20 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
13d30 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
13d40 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
13d50 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
13d60 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
13d70 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
13d80 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
13d90 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13da0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13db0 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13dc0 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13dd0 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13de0 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13df0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13e00 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
13e10 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
13e20 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
13e30 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
13e40 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
13e50 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
13e60 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
13e70 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
13e80 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
13e90 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
13ea0 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
13eb0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
13ec0 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
13ed0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
13ee0 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
13ef0 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
13f00 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
13f10 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
13f20 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
13f30 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
13f40 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
13f50 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
13f60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13f70 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
13f80 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
13f90 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
13fa0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
13fb0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
13fc0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
13fd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13fe0 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
13ff0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
14000 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
14010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14020 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
14030 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
14040 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
14050 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
14060 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
14070 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
14080 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
14090 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
140a0 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
140b0 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
140c0 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
140d0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
140e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
140f0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
14100 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
14110 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
14120 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
14130 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
14140 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
14150 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
14160 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
14170 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
14180 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14190 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
141a0 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
141b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
141c0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
141d0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
141e0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
141f0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
14200 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
14210 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
14220 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
14230 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
14240 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
14250 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
14260 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
14270 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14280 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
14290 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
142a0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
142b0 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
142c0 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
142d0 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
142e0 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
142f0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
14300 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
14310 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
14320 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
14330 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
14340 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45   0xff) == SQLITE
14350 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
14360 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
14370 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
14380 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
14390 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
143a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
143b0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
143c0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
143d0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
143e0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
143f0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
14400 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
14410 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
14420 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
14430 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
14440 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
14450 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
14460 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
14470 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
14480 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
14490 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
144a0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
144b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
144c0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
144d0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
144e0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
144f0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14500 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14510 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
14520 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
14530 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
14540 73 20 25 64 20 70 69 64 3d 25 64 20 28 66 6c 6f  s %d pid=%d (flo
14550 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
14560 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
14570 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
14580 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
14590 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
145a0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
145b0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
145c0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
145d0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
145e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
145f0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
14600 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14610 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
14620 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
14630 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
14640 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
14650 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
14660 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
14670 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
14680 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
14690 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
146a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
146b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
146c0 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75  /* no, really, u
146d0 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20  nlock. */.  if( 
146e0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
146f0 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20  le->h, LOCK_UN) 
14700 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
14710 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
14720 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 65  CK_ERRORS.    re
14730 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14740 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
14750 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
14760 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
14770 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14780 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d  OERR_UNLOCK;.  }
14790 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d  else{.    pFile-
147a0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
147b0 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  LOCK;.    return
147c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
147d0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
147e0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
147f0 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28   int flockClose(
14800 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14810 29 20 7b 0a 20 20 61 73 73 65 72 74 28 20 69 64  ) {.  assert( id
14820 21 3d 30 20 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e  !=0 );.  flockUn
14830 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
14840 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73  );.  return clos
14850 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d  eUnixFile(id);.}
14860 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
14870 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
14880 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
14890 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  XWORK */../*****
148a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
148b0 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20  nd of the flock 
148c0 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
148d0 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
148e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
14940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149a0 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20  *** Begin Named 
149b0 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e  Semaphore Lockin
149c0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
149e0 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   Named semaphore
149f0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79   locking is only
14a00 20 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78   supported on Vx
14a10 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d  Works..**.** Sem
14a20 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
14a30 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20  s like dot-lock 
14a40 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61  and flock in tha
14a50 74 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  t it really only
14a60 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43  .** supports EXC
14a70 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20  LUSIVE locking. 
14a80 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   Only a single p
14a90 72 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20  rocess can read 
14aa0 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20  or write.** the 
14ab0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
14ac0 20 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72   a time.  This r
14ad0 65 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c  educes potential
14ae0 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75   concurrency, bu
14af0 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c  t.** makes the l
14b00 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14b10 6f 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a  on much easier..
14b20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
14b30 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  S../*.** This ro
14b40 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
14b50 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
14b60 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
14b70 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
14b80 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
14b90 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
14ba0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
14bb0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
14bc0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
14bd0 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
14be0 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
14bf0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
14c00 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
14c10 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
14c20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
14c30 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
14c40 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
14c50 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
14c60 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14c70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
14c80 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14c90 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
14ca0 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
14cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
14cc0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
14cd0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
14ce0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
14cf0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
14d00 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
14d10 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
14d20 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
14d30 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
14d40 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
14d50 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
14d60 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
14d70 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
14d80 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14d90 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
14da0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
14db0 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
14dc0 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
14dd0 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
14de0 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
14df0 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  it. */.  if( !re
14e00 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65  served ){.    se
14e10 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
14e20 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
14e30 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72  ..    if( sem_tr
14e40 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
14e50 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72  ){.      int tEr
14e60 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
14e70 20 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d     if( EAGAIN !=
14e80 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20   tErrno ){.     
14e90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
14ea0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
14eb0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
14ec0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
14ed0 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RVEDLOCK);.     
14ee0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
14ef0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
14f00 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
14f10 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  .        /* some
14f20 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65  one else has the
14f30 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72   lock when we ar
14f40 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a  e in NO_LOCK */.
14f50 20 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64          reserved
14f60 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65   = (pFile->eFile
14f70 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f  Lock < SHARED_LO
14f80 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
14f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
14fa0 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69   we could have i
14fb0 74 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20  t if we want it 
14fc0 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73  */.      sem_pos
14fd0 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  t(pSem);.    }. 
14fe0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
14ff0 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
15000 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70  d %d (sem)\n", p
15010 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
15020 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
15030 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
15040 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15050 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
15060 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
15070 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
15080 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
15090 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
150a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
150b0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
150c0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
150d0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
150e0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
150f0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
15100 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
15110 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
15120 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
15130 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
15140 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
15150 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
15160 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
15170 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
15180 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
15190 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
151a0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
151b0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
151c0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
151d0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
151e0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
151f0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
15200 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
15210 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
15220 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
15230 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
15240 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
15250 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
15260 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
15270 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
15280 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15290 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
152a0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
152b0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
152c0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
152d0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
152e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
152f0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
15300 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68  IVE.**.** Semaph
15310 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72  ore locks only r
15320 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58  eally support EX
15330 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20  CLUSIVE locks.  
15340 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65  We track interme
15350 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74  diate.** lock st
15360 61 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69  ates in the sqli
15370 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75  te3_file structu
15380 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b  re, but all lock
15390 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61  s SHARED or.** a
153a0 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20  bove are really 
153b0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20  EXCLUSIVE locks 
153c0 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20  and exclude all 
153d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
153e0 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74  from.** access t
153f0 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
15400 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
15410 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61   only increase a
15420 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20   lock.  Use the 
15430 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
15440 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20  ).** routine to 
15450 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20  lower a locking 
15460 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
15470 20 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71   int semXLock(sq
15480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
15490 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
154a0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
154b0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
154c0 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  id;.  sem_t *pSe
154d0 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  m = pFile->pInod
154e0 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72  e->pSem;.  int r
154f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
15500 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61    /* if we alrea
15510 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20  dy have a lock, 
15520 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e  it is exclusive.
15530 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a    .  ** Just adj
15540 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75  ust level and pu
15550 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65  nt on outta here
15560 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65  . */.  if (pFile
15570 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f  ->eFileLock > NO
15580 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
15590 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
155a0 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
155b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
155c0 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
155d0 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
155e0 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65  * lock semaphore
155f0 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75   now but bail ou
15600 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c  t when already l
15610 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20  ocked. */.  if( 
15620 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
15630 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  )==-1 ){.    rc 
15640 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
15650 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f     goto sem_end_
15660 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  lock;.  }..  /* 
15670 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
15680 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
15690 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
156a0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
156b0 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f  Lock;.. sem_end_
156c0 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72  lock:.  return r
156d0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
156e0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
156f0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15700 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
15710 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
15720 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
15730 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
15740 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
15750 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
15760 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
15770 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15780 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
15790 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
157a0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
157b0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
157c0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
157d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
157e0 73 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  semXUnlock(sqlit
157f0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
15800 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
15810 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15820 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15830 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
15840 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
15850 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pSem;..  assert(
15860 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
15870 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53  rt( pSem );.  OS
15880 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
15890 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
158a0 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46  =%d (sem)\n", pF
158b0 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
158c0 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
158d0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
158e0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
158f0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
15900 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
15910 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
15920 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
15930 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
15940 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
15950 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
15960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
15970 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
15980 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
15990 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
159a0 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
159b0 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
159c0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
159d0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
159e0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
159f0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
15a00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15a10 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
15a20 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
15a30 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
15a40 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
15a50 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
15a60 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
15a70 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
15a80 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
15a90 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
15aa0 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
15ab0 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
15ac0 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  rc) ){.      sto
15ad0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
15ae0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
15af0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
15b00 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65   .  }.  pFile->e
15b10 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
15b20 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
15b30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ITE_OK;.}../*. *
15b40 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
15b50 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73   */.static int s
15b60 65 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  emXClose(sqlite3
15b70 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
15b80 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69  f( id ){.    uni
15b90 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
15ba0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
15bb0 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c    semXUnlock(id,
15bc0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61   NO_LOCK);.    a
15bd0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15be0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
15bf0 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  ex();.    releas
15c00 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
15c10 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
15c20 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f  Mutex();.    clo
15c30 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
15c40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
15c50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69  ITE_OK;.}..#endi
15c60 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
15c70 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73  */./*.** Named s
15c80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
15c90 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
15ca0 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  le on VxWorks..*
15cb0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15cc0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d  * End of the nam
15cd0 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
15ce0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
15cf0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15d00 2a 0a 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 2a 2a  ****************
15d50 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /.../***********
15d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a  ****************
15da0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
15db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
15dc0 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e  Begin AFP Lockin
15dd0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
15de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15df0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73  ***.**.** AFP is
15e00 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e   the Apple Filin
15e10 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50  g Protocol.  AFP
15e20 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69   is a network fi
15e30 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a  lesystem found.*
15e40 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e  * on Apple Macin
15e50 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d  tosh computers -
15e60 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53   both OS9 and OS
15e70 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70  X..**.** Third-p
15e80 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74  arty implementat
15e90 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20  ions of AFP are 
15ea0 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
15eb0 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a  this code here.*
15ec0 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20  * only works on 
15ed0 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66  OSX..*/..#if def
15ee0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
15ef0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
15f00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
15f10 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b  *.** The afpLock
15f20 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63  ingContext struc
15f30 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c  ture contains al
15f40 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69  l afp lock speci
15f50 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70  fic state.*/.typ
15f60 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c  edef struct afpL
15f70 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66  ockingContext af
15f80 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  pLockingContext;
15f90 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69  .struct afpLocki
15fa0 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e  ngContext {.  in
15fb0 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f  t reserved;.  co
15fc0 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68  nst char *dbPath
15fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
15fe0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65   Name of the ope
15ff0 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74  n file */.};..st
16000 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
16010 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e  ckPB2.{.  unsign
16020 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66  ed long long off
16030 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f  set;        /* o
16040 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62  ffset to first b
16050 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  yte to lock */. 
16060 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
16070 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20  ong length;     
16080 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74     /* nbr of byt
16090 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
160a0 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
160b0 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74  ng retRangeStart
160c0 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20  ; /* nbr of 1st 
160d0 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73  byte locked if s
160e0 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75  uccessful */.  u
160f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c  nsigned char unL
16100 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20  ockFlag;        
16110 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20   /* 1 = unlock, 
16120 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  0 = lock */.  un
16130 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72  signed char star
16140 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20  tEndFlag;       
16150 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20  /* 1=rel to end 
16160 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74  of fork, 0=rel t
16170 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74  o start */.  int
16180 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
161a0 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61  * file desc to a
161b0 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77  ssoc this lock w
161c0 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69  ith */.};..#defi
161d0 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67  ne afpfsByteRang
161e0 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20  eLock2FSCTL     
161f0 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33     _IOWR('z', 23
16200 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
16210 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a  geLockPB2)../*.*
16220 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
16230 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20  ity for setting 
16240 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69  or clearing a bi
16250 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20  t-range lock on 
16260 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79  an.** AFP filesy
16270 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74  stem..** .** Ret
16280 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
16290 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45   success, SQLITE
162a0 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65  _BUSY on failure
162b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
162c0 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f  afpSetLock(.  co
162d0 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20  nst char *path, 
162e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
162f0 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
16300 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72   to be locked or
16310 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75   unlocked */.  u
16320 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16340 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
16350 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f  iptor on path */
16360 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
16370 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20   long offset,   
16380 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
16390 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
163a0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
163b0 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20  long length,    
163c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
163d0 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
163e0 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67   int setLockFlag
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16400 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c  /* True to set l
16410 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63  ock.  False to c
16420 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  lear lock */.){.
16430 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e    struct ByteRan
16440 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20  geLockPB2 pb;.  
16450 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62  int err;.  .  pb
16460 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65  .unLockFlag = se
16470 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20  tLockFlag ? 0 : 
16480 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64  1;.  pb.startEnd
16490 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f  Flag = 0;.  pb.o
164a0 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a  ffset = offset;.
164b0 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65    pb.length = le
164c0 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d  ngth; .  pb.fd =
164d0 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20   pFile->h;.  .  
164e0 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54  OSTRACE(("AFPSET
164f0 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64  LOCK [%s] for %d
16500 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78  %s in range %llx
16510 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28  :%llx\n", .    (
16520 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22  setLockFlag?"ON"
16530 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e  :"OFF"), pFile->
16540 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b  h, (pb.fd==-1?"[
16550 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c  testval-1]":""),
16560 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e  .    offset, len
16570 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66  gth));.  err = f
16580 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73  sctl(path, afpfs
16590 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53  ByteRangeLock2FS
165a0 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20  CTL, &pb, 0);.  
165b0 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b  if ( err==-1 ) {
165c0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
165d0 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
165e0 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45  rno;.    OSTRACE
165f0 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61  (("AFPSETLOCK fa
16600 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20  iled to fsctl() 
16610 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20  '%s' %d %s\n",. 
16620 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68              path
16630 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72  , tErrno, strerr
16640 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69  or(tErrno)));.#i
16650 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
16660 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
16670 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  RS.    rc = SQLI
16680 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20  TE_BUSY;.#else. 
16690 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
166a0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
166b0 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20  r(tErrno,.      
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
166d0 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49  tLockFlag ? SQLI
166e0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20  TE_IOERR_LOCK : 
166f0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
16700 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  OCK);.#endif /* 
16710 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
16720 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  P_LOCK_ERRORS */
16730 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
16740 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
16750 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
16760 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
16770 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
16780 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65  urn rc;.  } else
16790 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   {.    return SQ
167a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
167b0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
167c0 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
167d0 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
167e0 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
167f0 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
16800 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
16810 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
16820 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
16830 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
16840 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
16850 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
16860 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
16870 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
16880 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
16890 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
168a0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
168b0 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
168c0 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
168d0 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74   checking..*/.st
168e0 61 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63  atic int afpChec
168f0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
16900 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
16910 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
16920 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16930 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
16940 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
16950 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
16960 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66  ixFile*)id;.  af
16970 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16980 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53  *context;.  .  S
16990 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
169a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
169b0 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
169c0 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
169d0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
169e0 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70    context = (afp
169f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
16a00 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
16a10 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63  Context;.  if( c
16a20 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
16a30 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74   ){.    *pResOut
16a40 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
16a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16a60 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
16a70 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
16a80 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
16a90 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
16aa0 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a  reads */.  .  /*
16ab0 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
16ac0 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
16ad0 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
16ae0 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
16af0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
16b00 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
16b10 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76  CK ){.    reserv
16b20 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20  ed = 1;.  }.  . 
16b30 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65   /* Otherwise se
16b40 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  e if some other 
16b50 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74  process holds it
16b60 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72  ..   */.  if( !r
16b70 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f  eserved ){.    /
16b80 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52  * lock the RESER
16b90 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20  VED byte */.    
16ba0 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74  int lrc = afpSet
16bb0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
16bc0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
16bd0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29  ERVED_BYTE, 1,1)
16be0 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49  ;  .    if( SQLI
16bf0 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20  TE_OK==lrc ){.  
16c00 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63      /* if we suc
16c10 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67  ceeded in taking
16c20 20 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f   the reserved lo
16c30 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f  ck, unlock it to
16c40 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a   restore.      *
16c50 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73  * the original s
16c60 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72  tate */.      lr
16c70 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16c80 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16c90 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
16ca0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
16cb0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
16cc0 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20  /* if we failed 
16cd0 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20  to get the lock 
16ce0 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73  then someone els
16cf0 65 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a  e must have it *
16d00 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  /.      reserved
16d10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
16d20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
16d30 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
16d40 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20  rc=lrc;.    }.  
16d50 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
16d60 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
16d70 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
16d80 4b 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29  K %d %d %d (afp)
16d90 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
16da0 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20  c, reserved));. 
16db0 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72   .  *pResOut = r
16dc0 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72  eserved;.  retur
16dd0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
16de0 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
16df0 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
16e00 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
16e10 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
16e20 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
16e30 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
16e40 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
16e50 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
16e60 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
16e70 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
16e80 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
16e90 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
16ea0 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
16eb0 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
16ec0 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
16ed0 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
16ee0 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
16ef0 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
16f00 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
16f10 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
16f20 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
16f30 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
16f40 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
16f50 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
16f60 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
16f70 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
16f80 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
16f90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
16fa0 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
16fb0 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
16fc0 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
16fd0 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
16fe0 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
16ff0 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
17000 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
17010 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
17020 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
17030 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
17040 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
17050 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
17060 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
17070 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
17080 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
17090 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
170a0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
170b0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
170c0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
170d0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
170e0 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
170f0 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
17100 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28  tic int afpLock(
17110 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17120 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
17130 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17140 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
17150 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17160 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
17170 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
17180 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
17190 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
171a0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
171b0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
171c0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
171d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
171e0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
171f0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
17200 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
17210 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69  was %s(%s,%d) pi
17220 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
17230 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20  File->h,.       
17240 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
17250 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
17260 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
17270 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20  leLock),.       
17280 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70      azFileLock(p
17290 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
172a0 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  ), pInode->nShar
172b0 65 64 20 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ed , osGetpid(0)
172c0 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  ));..  /* If the
172d0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
172e0 6c 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70  lock of this typ
172f0 65 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69  e or more restri
17300 63 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a  ctive on the.  *
17310 2a 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e  * unixFile, do n
17320 6f 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73  othing. Don't us
17330 65 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f  e the afp_end_lo
17340 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
17350 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
17360 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
17370 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
17380 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
17390 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
173a0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
173b0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
173c0 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
173d0 79 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22  y held) (afp)\n"
173e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  , pFile->h,.    
173f0 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63         azFileLoc
17400 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a  k(eFileLock)));.
17410 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17420 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  E_OK;.  }..  /* 
17430 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
17440 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69  cking sequence i
17450 73 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20  s correct.  **  
17460 28 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76  (1) We never mov
17470 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  e from unlocked 
17480 74 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68  to anything high
17490 65 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c  er than shared l
174a0 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53  ock..  **  (2) S
174b0 51 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c  QLite never expl
174c0 69 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20  icitly requests 
174d0 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20  a pendig lock.. 
174e0 20 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65   **  (3) A share
174f0 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  d lock is always
17500 20 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73   held when a res
17510 65 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71  erve lock is req
17520 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  uested..  */.  a
17530 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
17540 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b  ileLock!=NO_LOCK
17550 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   || eFileLock==S
17560 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
17570 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
17580 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k!=PENDING_LOCK 
17590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
175a0 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44  leLock!=RESERVED
175b0 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e  _LOCK || pFile->
175c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
175d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
175e0 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20  * This mutex is 
175f0 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70  needed because p
17600 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
17610 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
17620 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69  reads.  */.  uni
17630 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
17640 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d   pInode = pFile-
17650 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49  >pInode;..  /* I
17660 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73  f some thread us
17670 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73  ing this PID has
17680 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69   a lock via a di
17690 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65  fferent unixFile
176a0 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68  *.  ** handle th
176b0 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65  at precludes the
176c0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c   requested lock,
176d0 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20   return BUSY..  
176e0 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d  */.  if( (pFile-
176f0 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f  >eFileLock!=pIno
17700 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26  de->eFileLock &&
17710 20 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65   .       (pInode
17720 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
17730 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  DING_LOCK || eFi
17740 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
17750 43 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20  CK)).     ){.   
17760 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
17770 59 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  Y;.    goto afp_
17780 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  end_lock;.  }.  
17790 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45  .  /* If a SHARE
177a0 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73  D lock is reques
177b0 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68  ted, and some th
177c0 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20  read using this 
177d0 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  PID already.  **
177e0 20 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72   has a SHARED or
177f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20   RESERVED lock, 
17800 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72  then increment r
17810 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20  eference counts 
17820 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20  and.  ** return 
17830 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a  SQLITE_OK..  */.
17840 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
17850 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20  =SHARED_LOCK && 
17860 0a 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65  .     (pInode->e
17870 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
17880 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
17890 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
178a0 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
178b0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
178c0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
178d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
178e0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
178f0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
17900 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
17910 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
17920 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
17930 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
17940 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
17950 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
17960 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
17970 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
17980 20 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50   }.    .  /* A P
17990 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
179a0 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
179b0 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
179c0 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
179d0 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
179e0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
179f0 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
17a00 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
17a10 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
17a20 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
17a30 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
17a40 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20  =SHARED_LOCK .  
17a50 20 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63      || (eFileLoc
17a60 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
17a70 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
17a80 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f  eLock<PENDING_LO
17a90 43 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74  CK).  ){.    int
17aa0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69   failed;.    fai
17ab0 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  led = afpSetLock
17ac0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
17ad0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
17ae0 5f 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20  _BYTE, 1, 1);.  
17af0 20 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a    if (failed) {.
17b00 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
17b10 64 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  d;.      goto af
17b20 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17b30 7d 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  }.  }.  .  /* If
17b40 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
17b50 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
17b60 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
17b70 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
17b80 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
17b90 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
17ba0 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
17bb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
17bc0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
17bd0 43 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72  CK ){.    int lr
17be0 63 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72  c1, lrc2, lrc1Er
17bf0 72 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e  rno = 0;.    lon
17c00 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20  g lk, mask;.    
17c10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
17c20 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
17c30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
17c40 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
17c50 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a  ==0 );.        .
17c60 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65      mask = (size
17c70 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c  of(long)==8) ? L
17c80 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30  ARGEST_INT64 : 0
17c90 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f  x7fffffff;.    /
17ca0 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
17cb0 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c  ad-lock SHARED_L
17cc0 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f  OCK */.    /* no
17cd0 74 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c  te that the qual
17ce0 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f  ity of the rando
17cf0 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61  mness doesn't ma
17d00 74 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a  tter that much *
17d10 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f  /.    lk = rando
17d20 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65  m(); .    pInode
17d30 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28  ->sharedByte = (
17d40 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52  lk & mask)%(SHAR
17d50 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20  ED_SIZE - 1);.  
17d60 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c    lrc1 = afpSetL
17d70 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17d80 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20  ath, pFile, .   
17d90 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49         SHARED_FI
17da0 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72  RST+pInode->shar
17db0 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20  edByte, 1, 1);. 
17dc0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
17dd0 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20  RROR(lrc1) ){.  
17de0 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20      lrc1Errno = 
17df0 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
17e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44  ;.    }.    /* D
17e10 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72  rop the temporar
17e20 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a  y PENDING lock *
17e30 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70  /.    lrc2 = afp
17e40 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17e50 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17e60 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c  PENDING_BYTE, 1,
17e70 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66   0);.    .    if
17e80 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
17e90 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20  lrc1) ) {.      
17ea0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
17eb0 46 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29  File, lrc1Errno)
17ec0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  ;.      rc = lrc
17ed0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  1;.      goto af
17ee0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17ef0 7d 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f  } else if( IS_LO
17f00 43 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29  CK_ERROR(lrc2) )
17f10 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63  {.      rc = lrc
17f20 32 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66  2;.      goto af
17f30 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17f40 7d 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20  } else if( lrc1 
17f50 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b  != SQLITE_OK ) {
17f60 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
17f70 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
17f80 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
17f90 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
17fa0 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  OCK;.      pInod
17fb0 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
17fc0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
17fd0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
17fe0 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
17ff0 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
18000 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK && pInode->nS
18010 68 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f  hared>1 ){.    /
18020 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20  * We are trying 
18030 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
18040 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65   lock but anothe
18050 72 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  r thread in this
18060 0a 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72  .     ** same pr
18070 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68  ocess is still h
18080 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20  olding a shared 
18090 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20  lock. */.    rc 
180a0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
180b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
180c0 68 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66  he request was f
180d0 6f 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  or a RESERVED or
180e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
180f0 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61    It is.    ** a
18100 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72  ssumed that ther
18110 65 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72  e is a SHARED or
18120 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e   greater lock on
18130 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
18140 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
18150 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20  .    int failed 
18160 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
18170 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
18180 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28  Lock );.    if (
18190 65 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53  eFileLock >= RES
181a0 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46  ERVED_LOCK && pF
181b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
181c0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20   RESERVED_LOCK) 
181d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71  {.        /* Acq
181e0 75 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20  uire a RESERVED 
181f0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
18200 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
18210 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18220 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
18230 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
18240 0a 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c  .      if( !fail
18250 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  ed ){.        co
18260 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
18270 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
18280 20 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c   }.    if (!fail
18290 65 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20  ed && eFileLock 
182a0 3d 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  == EXCLUSIVE_LOC
182b0 4b 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63  K) {.      /* Ac
182c0 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
182d0 56 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  VE lock */.     
182e0 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d     .      /* Rem
182f0 6f 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c  ove the shared l
18300 6f 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e  ock before tryin
18310 67 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65  g the range.  we
18320 27 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20  'll need to .   
18330 20 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73     ** reestablis
18340 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
18350 6b 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65  k if we can't ge
18360 74 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b  t the  afpUnlock
18370 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
18380 69 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61  if( !(failed = a
18390 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
183a0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
183b0 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b  , SHARED_FIRST +
183c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
183d0 20 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65            pInode
183e0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
183f0 20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   0)) ){.        
18400 69 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51  int failed2 = SQ
18410 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
18420 20 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74   /* now attemmpt
18430 20 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c   to get the excl
18440 75 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65  usive lock range
18450 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
18460 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
18470 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
18480 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
18490 49 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20  IRST, .         
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184b0 20 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a        SHARED_SIZ
184c0 45 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  E, 1);.        i
184d0 66 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61  f( failed && (fa
184e0 69 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f  iled2 = afpSetLo
184f0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
18500 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20     SHARED_FIRST 
18530 2b 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  + pInode->shared
18540 42 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a  Byte, 1, 1)) ){.
18550 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e            /* Can
18560 27 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74  't reestablish t
18570 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20  he shared lock. 
18580 20 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65   Sqlite can't de
18590 61 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20  al, this is.    
185a0 20 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69        ** a criti
185b0 63 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20  cal I/O error.  
185c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
185d0 20 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c       rc = ((fail
185e0 65 64 20 26 20 30 78 66 66 29 20 3d 3d 20 53 51  ed & 0xff) == SQ
185f0 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
18600 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
18610 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
18620 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
18630 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
18640 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
18650 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
18660 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
18670 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
18680 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
18690 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
186a0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
186b0 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
186c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
186d0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
186e0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
186f0 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
18700 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
18710 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
18720 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
18730 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
18740 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18750 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
18760 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
18770 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
18780 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
18790 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
187a0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
187b0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
187c0 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
187d0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
187e0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
187f0 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
18800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
18810 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
18820 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
18830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
18840 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
18850 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
18860 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
18870 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
18880 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
18890 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
188a0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
188b0 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
188c0 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
188d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
188e0 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
188f0 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
18900 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
18910 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
18920 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
18930 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
18940 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
18950 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
18960 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
18970 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18980 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
18990 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
189a0 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
189b0 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
189c0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
189d0 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
189e0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
189f0 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
18a00 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
18a10 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
18a20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
18a30 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
18a40 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
18a50 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
18a60 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
18a70 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
18a80 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
18a90 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
18aa0 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
18ab0 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
18ac0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
18ad0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
18ae0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
18af0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
18b00 20 20 20 20 20 20 20 20 20 6f 73 47 65 74 70 69           osGetpi
18b10 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  d(0)));..  asser
18b20 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
18b30 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
18b40 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
18b50 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
18b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
18b70 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
18b80 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
18b90 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
18ba0 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
18bb0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
18bc0 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
18bd0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18be0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
18bf0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
18c00 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
18c10 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
18c20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18c30 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
18c40 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18c50 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20  rror( h=(-1) ). 
18c60 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
18c70 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
18c80 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f   .#ifdef SQLITE_
18c90 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65  DEBUG.    /* Whe
18ca0 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63  n reducing a loc
18cb0 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74 68 65  k such that othe
18cc0 72 20 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20  r processes can 
18cd0 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61  start.    ** rea
18ce0 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
18cf0 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61  e file again, ma
18d00 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
18d10 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
18d20 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20  ion counter was 
18d30 75 70 64 61 74 65 64 20 69 66 20 61 6e 79 20 70  updated if any p
18d40 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  art of the datab
18d50 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ase.    ** file 
18d60 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65  changed.  If the
18d70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
18d80 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61  nter is not upda
18d90 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65  ted,.    ** othe
18da0 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f  r connections to
18db0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d   the same file m
18dc0 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65  ight not realize
18dd0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
18de0 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65   file has change
18df0 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68  d and hence migh
18e00 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c  t not know to fl
18e10 75 73 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a  ush their.    **
18e20 20 63 61 63 68 65 2e 20 20 54 68 65 20 75 73 65   cache.  The use
18e30 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61 63 68   of a stale cach
18e40 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  e can lead to da
18e50 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18e60 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  n..    */.    as
18e70 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e  sert( pFile->inN
18e80 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20  ormalWrite==0.  
18e90 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
18ea0 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
18eb0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69            || pFi
18ec0 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e  le->transCntrChn
18ed0 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c  g==1 );.    pFil
18ee0 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65  e->inNormalWrite
18ef0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20   = 0;.#endif.   
18f00 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d   .    if( pFile-
18f10 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c  >eFileLock==EXCL
18f20 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
18f30 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
18f40 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
18f50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
18f60 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
18f70 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20  _SIZE, 0);.     
18f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18f90 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
18fa0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
18fb0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18fc0 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  >1) ){.        /
18fd0 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c  * only re-establ
18fe0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
18ff0 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79  ock if necessary
19000 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
19010 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
19020 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
19030 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
19040 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
19050 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19060 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19070 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  , sharedLockByte
19080 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  , 1, 1);.      }
19090 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
190a0 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a  skipShared = 1;.
190b0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
190c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
190d0 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46  _OK && pFile->eF
190e0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
190f0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72  _LOCK ){.      r
19100 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
19110 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
19120 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42  pFile, PENDING_B
19130 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
19140 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  } .    if( rc==S
19150 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
19160 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45  e->eFileLock>=RE
19170 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63  SERVED_LOCK && c
19180 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
19190 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   ){.      rc = a
191a0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
191b0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
191c0 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
191d0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   1, 0);.      if
191e0 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20  ( !rc ){ .      
191f0 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72    context->reser
19200 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20  ved = 0; .      
19210 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
19220 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
19230 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
19240 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
19250 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b  de->nShared>1)){
19260 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
19270 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
19280 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
19290 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
192a0 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f  TE_OK && eFileLo
192b0 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a  ck==NO_LOCK ){..
192c0 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
192d0 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
192e0 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61   counter.  Relea
192f0 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e  se the lock usin
19300 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63  g an.    ** OS c
19310 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c  all only when al
19320 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68 69  l threads in thi
19330 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68  s same process h
19340 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20  ave released.   
19350 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20   ** the lock..  
19360 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65    */.    unsigne
19370 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
19380 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41  edLockByte = SHA
19390 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
193a0 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20  ->sharedByte;.  
193b0 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65    pInode->nShare
193c0 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  d--;.    if( pIn
193d0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
193e0 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ){.      Simulat
193f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
19400 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
19410 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
19420 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74   ).      Simulat
19430 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
19440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b  );.      if( !sk
19450 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20  ipShared ){.    
19460 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
19470 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
19480 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72  ath, pFile, shar
19490 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30  edLockByte, 1, 0
194a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
194b0 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20   if( !rc ){.    
194c0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
194d0 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
194e0 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
194f0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
19500 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  OCK;.      }.   
19510 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
19520 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19530 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
19540 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  -;.      assert(
19550 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d   pInode->nLock>=
19560 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
19570 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
19580 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
19590 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65  PendingFds(pFile
195a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
195b0 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65  .  }.  .  unixLe
195c0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
195d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
195e0 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ) pFile->eFileLo
195f0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
19600 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19610 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
19620 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50  le & cleanup AFP
19630 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e   specific lockin
19640 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74  g context .*/.st
19650 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73  atic int afpClos
19660 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
19670 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  id) {.  int rc =
19680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
19690 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
196a0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
196b0 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29   assert( id!=0 )
196c0 3b 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64  ;.  afpUnlock(id
196d0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
196e0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
196f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
19700 6f 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  ode && pFile->pI
19710 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
19720 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
19730 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
19740 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
19750 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
19760 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a  file just.    **
19770 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61   yet because tha
19780 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68  t would clear th
19790 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74  ose locks.  Inst
197a0 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c  ead, add the fil
197b0 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70  e.    ** descrip
197c0 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61  tor to pInode->a
197d0 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c  Pending.  It wil
197e0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
197f0 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20  ly closed when. 
19800 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
19810 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
19820 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
19830 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
19840 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
19850 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
19860 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
19870 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
19880 65 78 74 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ext);.  rc = clo
19890 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
198a0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
198b0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
198c0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
198d0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
198e0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
198f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
19900 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
19910 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41  e above is the A
19920 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FP lock implemen
19930 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
19940 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
19950 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
19960 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
19970 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
19980 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
19990 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
199a0 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64  lable.  If you d
199b0 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72  on't compile for
199c0 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65   a mac, then the
199d0 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56   "unix-afp".** V
199e0 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  FS is not availa
199f0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ble..**.********
19a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
19a10 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63  d of the AFP loc
19a20 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
19a30 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
19a40 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
19aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ae0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
19af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19b00 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c  **** Begin NFS L
19b10 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
19b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19b30 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65  *******/..#if de
19b40 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
19b50 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
19b60 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
19b70 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65  /*. ** Lower the
19b80 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
19b90 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
19ba0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
19bb0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
19bc0 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  . ** must be eit
19bd0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
19be0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a  HARED_LOCK.. **.
19bf0 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69   ** If the locki
19c00 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
19c10 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
19c20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
19c30 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72   below. ** the r
19c40 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
19c50 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
19c60 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
19c70 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
19c80 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nfsUnlock(sqlite
19c90 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
19ca0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65  eFileLock){.  re
19cb0 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b  turn posixUnlock
19cc0 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20  (id, eFileLock, 
19cd0 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  1);.}..#endif /*
19ce0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
19cf0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
19d00 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
19d10 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20  LE */./*.** The 
19d20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68  code above is th
19d30 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
19d40 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
19d50 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63  code is specific
19d60 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e  .** to MacOSX an
19d70 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
19d80 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c  on other unix pl
19d90 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74  atforms.  No alt
19da0 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61  ernative.** is a
19db0 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a  vailable.  .**.*
19dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19dd0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
19de0 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  NFS lock impleme
19df0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
19e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 2a 2a 2a 2f 0a 0a  *************/..
19e60 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
19e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a 0a  ***************.
19eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19ec0 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c   Non-locking sql
19ed0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
19ee0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
19ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
19f00 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64  **.** The next d
19f10 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
19f20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
19f30 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73   for all methods
19f40 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69   of the .** sqli
19f50 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20  te3_file object 
19f60 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c  other than the l
19f70 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20  ocking methods. 
19f80 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   The locking.** 
19f90 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66  methods were def
19fa0 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e  ined in division
19fb0 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63  s above (one loc
19fc0 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a  king method per.
19fd0 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54  ** division).  T
19fe0 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61  hose methods tha
19ff0 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20  t are common to 
1a000 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65  all locking mode
1a010 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20  s.** are gather 
1a020 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68  together into th
1a030 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a  is division..*/.
1a040 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74  ./*.** Seek to t
1a050 68 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64  he offset passed
1a060 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
1a070 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65  rgument, then re
1a080 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73  ad cnt .** bytes
1a090 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75   into pBuf. Retu
1a0a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1a0b0 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20   bytes actually 
1a0c0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20  read..**.** NB: 
1a0d0 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55   If you define U
1a0e0 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f  SE_PREAD or USE_
1a0f0 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74  PREAD64, then it
1a100 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62   might also.** b
1a110 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  e necessary to d
1a120 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55  efine _XOPEN_SOU
1a130 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20  RCE to be 500.  
1a140 54 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d  This varies from
1a150 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74  .** one system t
1a160 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63  o another.  Sinc
1a170 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f  e SQLite does no
1a180 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45  t define USE_PRE
1a190 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72  AD.** in any for
1a1a0 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65  m by default, we
1a1b0 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70   will not attemp
1a1c0 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50  t to define _XOP
1a1d0 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65  EN_SOURCE..** Se
1a1e0 65 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20  e tickets #2741 
1a1f0 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a  and #2681..**.**
1a200 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69   To avoid stompi
1a210 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c  ng the errno val
1a220 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72  ue on a failed r
1a230 65 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e  ead the lastErrn
1a240 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  o value.** is se
1a250 74 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  t before returni
1a260 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1a270 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e  t seekAndRead(un
1a280 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69  ixFile *id, sqli
1a290 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
1a2a0 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e  , void *pBuf, in
1a2b0 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f  t cnt){.  int go
1a2c0 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d  t;.  int prior =
1a2d0 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65   0;.#if (!define
1a2e0 64 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20  d(USE_PREAD) && 
1a2f0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
1a300 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77  AD64)).  i64 new
1a310 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20  Offset;.#endif. 
1a320 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20   TIMER_START;.  
1a330 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e  assert( cnt==(cn
1a340 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20  t&0x1ffff) );.  
1a350 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20  assert( id->h>2 
1a360 29 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65 66  );.  do{.#if def
1a370 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
1a380 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61      got = osPrea
1a390 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  d(id->h, pBuf, c
1a3a0 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
1a3b0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1a3c0 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
1a3d0 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  lif defined(USE_
1a3e0 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f 74  PREAD64).    got
1a3f0 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64 2d   = osPread64(id-
1a400 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
1a410 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
1a420 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
1a430 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20   = -1 );.#else. 
1a440 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c     newOffset = l
1a450 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73  seek(id->h, offs
1a460 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20  et, SEEK_SET);. 
1a470 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1a480 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 20  or( newOffset = 
1a490 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  -1 );.    if( ne
1a4a0 77 4f 66 66 73 65 74 3c 30 20 29 7b 0a 20 20 20  wOffset<0 ){.   
1a4b0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
1a4c0 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c  o((unixFile*)id,
1a4d0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
1a4e0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1a4f0 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64      got = osRead
1a500 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
1a510 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  t);.#endif.    i
1a520 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72  f( got==cnt ) br
1a530 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74  eak;.    if( got
1a540 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
1a550 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20  errno==EINTR ){ 
1a560 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75  got = 1; continu
1a570 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72  e; }.      prior
1a580 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72   = 0;.      stor
1a590 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78  eLastErrno((unix
1a5a0 46 69 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f  File*)id,  errno
1a5b0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a5c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f      }else if( go
1a5d0 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  t>0 ){.      cnt
1a5e0 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f   -= got;.      o
1a5f0 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20  ffset += got;.  
1a600 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74      prior += got
1a610 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 28  ;.      pBuf = (
1a620 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68  void*)(got + (ch
1a630 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d  ar*)pBuf);.    }
1a640 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30  .  }while( got>0
1a650 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b   );.  TIMER_END;
1a660 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
1a670 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
1a680 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20  lld %llu\n",.   
1a690 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20           id->h, 
1a6a0 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65  got+prior, offse
1a6b0 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45  t-prior, TIMER_E
1a6c0 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75  LAPSED));.  retu
1a6d0 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a  rn got+prior;.}.
1a6e0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
1a6f0 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74   from a file int
1a700 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74  o a buffer.  Ret
1a710 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1a720 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65   all.** bytes we
1a730 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66  re read successf
1a740 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  ully and SQLITE_
1a750 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e  IOERR if anythin
1a760 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e  g goes.** wrong.
1a770 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1a780 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74  nixRead(.  sqlit
1a790 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20  e3_file *id, .  
1a7a0 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69  void *pBuf, .  i
1a7b0 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65  nt amt,.  sqlite
1a7c0 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29  3_int64 offset.)
1a7d0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1a7e0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
1a7f0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b  *)id;.  int got;
1a800 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1a810 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
1a820 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=0 );.  assert
1a830 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ( amt>0 );..  /*
1a840 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64 61   If this is a da
1a850 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74  tabase file (not
1a860 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74   a journal, mast
1a870 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65  er-journal or te
1a880 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74  mp.  ** file), t
1a890 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
1a8a0 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68  locking range sh
1a8b0 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65  ould never be re
1a8c0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a  ad or written. *
1a8d0 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72 74  /.#if 0.  assert
1a8e0 28 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c  ( pFile->pPreall
1a8f0 6f 63 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a  ocatedUnused==0.
1a900 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1a910 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35  >=PENDING_BYTE+5
1a920 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66  12.       || off
1a930 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47  set+amt<=PENDING
1a940 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64  _BYTE .  );.#end
1a950 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  if..#if SQLITE_M
1a960 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1a970 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
1a980 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65   much of this re
1a990 61 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f  ad request as po
1a9a0 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66  ssible by transf
1a9b0 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20  ering.  ** data 
1a9c0 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20  from the memory 
1a9d0 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65  mapping using me
1a9e0 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66  mcpy().  */.  if
1a9f0 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e  ( offset<pFile->
1aa00 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1aa10 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c  if( offset+amt <
1aa20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1aa30 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  e ){.      memcp
1aa40 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1aa50 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1aa60 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d  on))[offset], am
1aa70 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
1aa80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1aa90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1aaa0 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e   nCopy = pFile->
1aab0 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65  mmapSize - offse
1aac0 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  t;.      memcpy(
1aad0 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
1aae0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1aaf0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70  ))[offset], nCop
1ab00 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d  y);.      pBuf =
1ab10 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e   &((u8 *)pBuf)[n
1ab20 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74  Copy];.      amt
1ab30 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20   -= nCopy;.     
1ab40 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79   offset += nCopy
1ab50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
1ab60 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b  if..  got = seek
1ab70 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f  AndRead(pFile, o
1ab80 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
1ab90 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d  );.  if( got==am
1aba0 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
1abb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
1abc0 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a  se if( got<0 ){.
1abd0 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1abe0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52   set by seekAndR
1abf0 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ead */.    retur
1ac00 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  n SQLITE_IOERR_R
1ac10 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  EAD;.  }else{.  
1ac20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1ac30 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a  (pFile, 0);   /*
1ac40 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72   not a system er
1ac50 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e  ror */.    /* Un
1ac60 72 65 61 64 20 70 61 72 74 73 20 6f 66 20 74 68  read parts of th
1ac70 65 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  e buffer must be
1ac80 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
1ac90 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
1aca0 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
1acb0 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
1acc0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1acd0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
1ace0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
1acf0 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68  tempt to seek th
1ad00 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  e file-descripto
1ad10 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  r passed as the 
1ad20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
1ad30 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66  o.** absolute of
1ad40 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20  fset iOff, then 
1ad50 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
1ad60 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20 64   nBuf bytes of d
1ad70 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66  ata from.** pBuf
1ad80 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72   to it. If an er
1ad90 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
1ada0 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70  rn -1 and set *p
1adb0 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73  iErrno. Otherwis
1adc0 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68  e, .** return th
1add0 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20  e actual number 
1ade0 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e  of bytes written
1adf0 20 28 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c   (which may be l
1ae00 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66  ess than.** nBuf
1ae10 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1ae20 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
1ae30 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20  .  int fd,      
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
1ae60 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74  iptor to write t
1ae70 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c  o */.  i64 iOff,
1ae80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae90 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f         /* File o
1aea0 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77  ffset to begin w
1aeb0 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63  riting at */.  c
1aec0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1aee0 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
1aef0 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20   this buffer to 
1af00 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  the file */.  in
1af10 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20  t nBuf,         
1af20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af30 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20   Size of buffer 
1af40 70 42 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f  pBuf in bytes */
1af50 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20  .  int *piErrno 
1af60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af70 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
1af80 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72   number if error
1af90 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20   occurs */.){.  
1afa0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1afb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1afc0 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65  /* Value returne
1afd0 64 20 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c  d by system call
1afe0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   */..  assert( n
1aff0 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66  Buf==(nBuf&0x1ff
1b000 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
1b010 20 66 64 3e 32 20 29 3b 0a 20 20 61 73 73 65 72   fd>2 );.  asser
1b020 74 28 20 70 69 45 72 72 6e 6f 21 3d 30 20 29 3b  t( piErrno!=0 );
1b030 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66  .  nBuf &= 0x1ff
1b040 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  ff;.  TIMER_STAR
1b050 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  T;..#if defined(
1b060 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b  USE_PREAD).  do{
1b070 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72   rc = (int)osPwr
1b080 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42  ite(fd, pBuf, nB
1b090 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c  uf, iOff); }whil
1b0a0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1b0b0 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66  ==EINTR );.#elif
1b0c0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1b0d0 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d  AD64).  do{ rc =
1b0e0 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 36 34   (int)osPwrite64
1b0f0 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c  (fd, pBuf, nBuf,
1b100 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20 72   iOff);}while( r
1b110 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  c<0 && errno==EI
1b120 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64 6f  NTR);.#else.  do
1b130 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b 20  {.    i64 iSeek 
1b140 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66 66  = lseek(fd, iOff
1b150 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
1b160 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b170 28 20 69 53 65 65 6b 20 3d 20 2d 31 20 29 3b 0a  ( iSeek = -1 );.
1b180 20 20 20 20 69 66 28 20 69 53 65 65 6b 3c 30 20      if( iSeek<0 
1b190 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 2d 31  ){.      rc = -1
1b1a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b1b0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
1b1c0 57 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  Write(fd, pBuf, 
1b1d0 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28  nBuf);.  }while(
1b1e0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1b1f0 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
1b200 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1b210 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
1b220 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1b230 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63   %llu\n", fd, rc
1b240 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c  , iOff, TIMER_EL
1b250 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20  APSED));..  if( 
1b260 72 63 3c 30 20 29 20 2a 70 69 45 72 72 6e 6f 20  rc<0 ) *piErrno 
1b270 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  = errno;.  retur
1b280 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1b290 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
1b2a0 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
1b2b0 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
1b2c0 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
1b2d0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1b2e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
1b2f0 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
1b300 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
1b310 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1b320 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
1b330 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
1b340 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
1b350 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
1b360 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
1b370 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
1b380 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
1b390 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
1b3a0 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
1b3b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1b3c0 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65  , int cnt){.  re
1b3d0 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74  turn seekAndWrit
1b3e0 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eFd(id->h, offse
1b3f0 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69  t, pBuf, cnt, &i
1b400 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d  d->lastErrno);.}
1b410 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
1b420 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
1b430 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
1b440 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b450 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
1b460 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
1b470 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
1b480 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
1b490 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
1b4a0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1b4b0 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1b4c0 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
1b4d0 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
1b4e0 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
1b4f0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1b500 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1b510 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
1b520 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1b530 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
1b540 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1b550 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
1b560 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
1b570 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
1b580 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
1b590 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
1b5a0 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
1b5b0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
1b5c0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
1b5d0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
1b5e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1b5f0 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55  ->pPreallocatedU
1b600 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
1b610 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
1b620 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
1b630 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
1b640 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
1b650 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1b660 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1b670 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20  .  /* If we are 
1b680 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77  doing a normal w
1b690 72 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61  rite to a databa
1b6a0 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f  se file (as oppo
1b6b0 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e  sed to.  ** doin
1b6c0 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  g a hot-journal 
1b6d0 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72  rollback or a wr
1b6e0 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65  ite to some file
1b6f0 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20   other than a.  
1b700 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
1b710 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65  se file) then re
1b720 63 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68  cord the fact th
1b730 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  at the database.
1b740 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64    ** has changed
1b750 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
1b760 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
1b770 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72   modified, recor
1b780 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74  d that.  ** fact
1b790 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
1b7a0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1b7b0 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69  Write ){.    pFi
1b7c0 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31  le->dbUpdate = 1
1b7d0 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
1b7e0 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  se has been modi
1b7f0 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  fied */.    if( 
1b800 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66  offset<=24 && of
1b810 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a  fset+amt>=27 ){.
1b820 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
1b830 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72      char oldCntr
1b840 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  [4];.      Simul
1b850 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1b860 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
1b870 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c  seekAndRead(pFil
1b880 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20  e, 24, oldCntr, 
1b890 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4);.      Simula
1b8a0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b8b0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
1b8c0 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c  !=4 || memcmp(ol
1b8d0 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29  dCntr, &((char*)
1b8e0 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d  pBuf)[24-offset]
1b8f0 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)!=0 ){.     
1b900 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
1b910 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a  ntrChng = 1;  /*
1b920 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   The transaction
1b930 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61   counter has cha
1b940 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  nged */.      }.
1b950 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1b960 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
1b970 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
1b980 49 54 45 29 20 26 26 20 53 51 4c 49 54 45 5f 4d  ITE) && SQLITE_M
1b990 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1b9a0 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
1b9b0 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
1b9c0 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
1b9d0 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
1b9e0 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
1b9f0 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
1ba00 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
1ba10 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
1ba20 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
1ba30 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1ba40 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
1ba50 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
1ba60 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
1ba70 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1ba80 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1ba90 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
1baa0 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
1bab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1bac0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1bad0 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d  t nCopy = pFile-
1bae0 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
1baf0 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  et;.      memcpy
1bb00 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d  (&((u8 *)(pFile-
1bb10 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1bb20 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f  fset], pBuf, nCo
1bb30 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
1bb40 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
1bb50 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
1bb60 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
1bb70 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
1bb80 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
1bb90 64 69 66 0a 20 0a 20 20 77 68 69 6c 65 28 20 28  dif. .  while( (
1bba0 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57  wrote = seekAndW
1bbb0 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73  rite(pFile, offs
1bbc0 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3c  et, pBuf, amt))<
1bbd0 61 6d 74 20 26 26 20 77 72 6f 74 65 3e 30 20 29  amt && wrote>0 )
1bbe0 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
1bbf0 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b  te;.    offset +
1bc00 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75  = wrote;.    pBu
1bc10 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75  f = &((char*)pBu
1bc20 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20  f)[wrote];.  }. 
1bc30 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1bc40 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20 61  (( wrote=(-1), a
1bc50 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75 6c  mt=1 ));.  Simul
1bc60 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1bc70 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74 3d  (( wrote=0, amt=
1bc80 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d 74  1 ));..  if( amt
1bc90 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 69 66  >wrote ){.    if
1bca0 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46 69  ( wrote<0 && pFi
1bcb0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45  le->lastErrno!=E
1bcc0 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20 2f  NOSPC ){.      /
1bcd0 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20  * lastErrno set 
1bce0 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20  by seekAndWrite 
1bcf0 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1bd00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
1bd10 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  TE;.    }else{. 
1bd20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1bd30 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 2f  rno(pFile, 0); /
1bd40 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20 65  * not a system e
1bd50 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 65  rror */.      re
1bd60 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
1bd70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
1bd80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1bd90 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1bda0 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
1bdb0 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
1bdc0 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
1bdd0 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
1bde0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
1bdf0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
1be00 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
1be10 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
1be20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
1be30 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
1be40 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1be50 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
1be60 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
1be70 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
1be80 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
1be90 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
1bea0 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
1beb0 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
1bec0 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
1bed0 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
1bee0 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
1bef0 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79  th the (slightly
1bf00 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e   slower).** fsyn
1bf10 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77  c(). If you know
1bf20 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74 65   that your syste
1bf30 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66  m does support f
1bf40 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65  datasync() corre
1bf50 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69  ctly,.** then si
1bf60 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74  mply compile wit
1bf70 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64  h -Dfdatasync=fd
1bf80 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48 41 56  atasync or -DHAV
1bf90 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a 23  E_FDATASYNC.*/.#
1bfa0 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
1bfb0 61 73 79 6e 63 29 20 26 26 20 21 48 41 56 45 5f  async) && !HAVE_
1bfc0 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66 69  FDATASYNC.# defi
1bfd0 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73 79  ne fdatasync fsy
1bfe0 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  nc.#endif../*.**
1bff0 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   Define HAVE_FUL
1c000 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20 31  LFSYNC to 0 or 1
1c010 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68   depending on wh
1c020 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20  ether or not.** 
1c030 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  the F_FULLFSYNC 
1c040 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65 64  macro is defined
1c050 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69  .  F_FULLFSYNC i
1c060 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f  s currently.** o
1c070 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
1c080 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74 20   Mac OS X.  But 
1c090 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e 67  that could chang
1c0a0 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46  e..*/.#ifdef F_F
1c0b0 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69 6e  ULLFSYNC.# defin
1c0c0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1c0d0 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   1.#else.# defin
1c0e0 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  e HAVE_FULLFSYNC
1c0f0 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   0.#endif.../*.*
1c100 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
1c110 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
1c120 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
1c130 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
1c140 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
1c150 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
1c160 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
1c170 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
1c180 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
1c190 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1c1a0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
1c1b0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
1c1c0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
1c1d0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
1c1e0 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
1c1f0 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
1c200 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1c210 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
1c220 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
1c230 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1c240 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1c250 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1c260 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1c270 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1c280 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1c290 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1c2a0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1c2b0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1c2c0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1c2d0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1c2e0 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1c2f0 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1c300 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1c310 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1c320 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1c330 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1c340 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1c350 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1c360 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1c370 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1c380 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1c390 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1c3a0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1c3b0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1c3c0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1c3d0 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1c3e0 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1c3f0 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1c400 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1c410 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1c420 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1c430 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1c440 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1c450 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1c460 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1c470 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1c480 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1c490 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1c4a0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1c4b0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1c4c0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1c4d0 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1c4e0 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1c4f0 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1c500 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1c510 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1c520 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1c530 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1c540 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1c550 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1c560 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1c570 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1c580 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1c590 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1c5a0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1c5b0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1c5c0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1c5d0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1c5e0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1c5f0 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1c600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c610 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1c620 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1c630 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1c640 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1c650 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1c660 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1c670 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1c680 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1c690 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1c6a0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1c6b0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1c6c0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1c6d0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1c6e0 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1c6f0 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1c700 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1c710 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1c720 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1c730 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1c740 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1c750 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1c760 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1c770 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1c780 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1c790 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1c7a0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1c7b0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1c7c0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1c7d0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1c7e0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1c7f0 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1c800 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1c810 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1c820 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1c830 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1c840 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1c850 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1c860 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1c870 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1c880 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1c890 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1c8a0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1c8b0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1c8c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1c8d0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1c8e0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1c8f0 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1c900 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1c910 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1c920 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1c930 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1c940 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1c950 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1c960 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20   no-op.  But go 
1c970 61 68 65 61 64 20 61 6e 64 20 63 61 6c 6c 20 66  ahead and call f
1c980 73 74 61 74 28 29 20 74 6f 20 76 61 6c 69 64 61  stat() to valida
1c990 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  te the file.  **
1c9a0 20 64 65 73 63 72 69 70 74 6f 72 20 61 73 20 77   descriptor as w
1c9b0 65 20 6e 65 65 64 20 61 20 6d 65 74 68 6f 64 20  e need a method 
1c9c0 74 6f 20 70 72 6f 76 6f 6b 65 20 61 20 66 61 69  to provoke a fai
1c9d0 6c 75 72 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  lure during.  **
1c9e0 20 63 6f 76 65 72 61 74 65 20 74 65 73 74 69 6e   coverate testin
1c9f0 67 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  g..  */.#ifdef S
1ca00 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1ca10 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1ca20 74 20 62 75 66 3b 0a 20 20 20 20 72 63 20 3d 20  t buf;.    rc = 
1ca30 6f 73 46 73 74 61 74 28 66 64 2c 20 26 62 75 66  osFstat(fd, &buf
1ca40 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 48 41 56  );.  }.#elif HAV
1ca50 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
1ca60 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ( fullSync ){.  
1ca70 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66    rc = osFcntl(f
1ca80 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  d, F_FULLFSYNC, 
1ca90 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
1caa0 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f   rc = 1;.  }.  /
1cab0 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46 53 59  * If the FULLFSY
1cac0 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20  NC failed, fall 
1cad0 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70 74 69  back to attempti
1cae0 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20  ng an fsync().. 
1caf0 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e 27 74   ** It shouldn't
1cb00 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   be possible for
1cb10 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61   fullfsync to fa
1cb20 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  il on the local 
1cb30 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73 74 65  .  ** file syste
1cb40 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66  m (on OSX), so f
1cb50 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74 65 73  ailure indicates
1cb60 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a   that FULLFSYNC.
1cb70 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70 70 6f    ** isn't suppo
1cb80 72 74 65 64 20 66 6f 72 20 74 68 69 73 20 66 69  rted for this fi
1cb90 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61  le system. So, a
1cba0 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e 63 20  ttempt an fsync 
1cbb0 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e  .  ** and (for n
1cbc0 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65 20 6f  ow) ignore the o
1cbd0 76 65 72 68 65 61 64 20 6f 66 20 61 20 73 75 70  verhead of a sup
1cbe0 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63  erfluous fcntl c
1cbf0 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64  all.  .  ** It'd
1cc00 20 62 65 20 62 65 74 74 65 72 20 74 6f 20 64 65   be better to de
1cc10 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63 20 73  tect fullfsync s
1cc20 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20  upport once and 
1cc30 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68 65 20  avoid .  ** the 
1cc40 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65 72 79  fcntl call every
1cc50 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20 63 61   time sync is ca
1cc60 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lled..  */.  if(
1cc70 20 72 63 20 29 20 72 63 20 3d 20 66 73 79 6e 63   rc ) rc = fsync
1cc80 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66  (fd);..#elif def
1cc90 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1cca0 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63 28 29    /* fdatasync()
1ccb0 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e 27 74   on HFS+ doesn't
1ccc0 20 79 65 74 20 66 6c 75 73 68 20 74 68 65 20 66   yet flush the f
1ccd0 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74 20 63  ile size if it c
1cce0 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74 6c 79  hanged correctly
1ccf0 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74  .  ** so current
1cd00 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20 74 6f  ly we default to
1cd10 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61 74 20   the macro that 
1cd20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74 61 73  redefines fdatas
1cd30 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a  ync to fsync.  *
1cd40 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66  /.  rc = fsync(f
1cd50 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72 63 20  d);.#else .  rc 
1cd60 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64 29 3b  = fdatasync(fd);
1cd70 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1cd80 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26 26 20    if( rc==-1 && 
1cd90 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29  errno==ENOTSUP )
1cda0 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79 6e 63  {.    rc = fsync
1cdb0 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (fd);.  }.#endif
1cdc0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
1cdd0 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 64 65  /.#endif /* ifde
1cde0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1cdf0 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46   elif HAVE_FULLF
1ce00 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f  SYNC */..  if( O
1ce10 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72 63 21  S_VXWORKS && rc!
1ce20 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
1ce30 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1ce40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70   rc;.}../*.** Op
1ce50 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
1ce60 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65  ptor to the dire
1ce70 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67  ctory containing
1ce80 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e   file zFilename.
1ce90 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
1cea0 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74 20 74  l, *pFd is set t
1ceb0 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c  o the opened fil
1cec0 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
1ced0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
1cee0 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1cef0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65   error occurs, e
1cf00 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d  ither SQLITE_NOM
1cf10 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  EM.** or SQLITE_
1cf20 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75  CANTOPEN is retu
1cf30 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73  rned and *pFd is
1cf40 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66   set to an undef
1cf50 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a  ined.** value..*
1cf60 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63 74 6f  *.** The directo
1cf70 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
1cf80 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72 20 6f  or is used for o
1cf90 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20  nly one thing - 
1cfa0 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20 61 20  to.** fsync() a 
1cfb0 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b  directory to mak
1cfc0 65 20 73 75 72 65 20 66 69 6c 65 20 63 72 65 61  e sure file crea
1cfd0 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f  tion and deletio
1cfe0 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20  n events.** are 
1cff0 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
1d000 20 20 53 75 63 68 20 66 73 79 6e 63 73 20 61 72    Such fsyncs ar
1d010 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20  e not needed on 
1d020 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  newer.** journal
1d030 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d 73 2c  ing filesystems,
1d040 20 62 75 74 20 61 72 65 20 72 65 71 75 69 72 65   but are require
1d050 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73  d on older files
1d060 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ystems..**.** Th
1d070 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
1d080 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75 73 69  e overridden usi
1d090 6e 67 20 74 68 65 20 78 53 65 74 53 79 73 43 61  ng the xSetSysCa
1d0a0 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  ll interface..**
1d0b0 20 54 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   The ability to 
1d0c0 6f 76 65 72 72 69 64 65 20 74 68 69 73 20 72 6f  override this ro
1d0d0 75 74 69 6e 65 20 77 61 73 20 61 64 64 65 64 20  utine was added 
1d0e0 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20 74 68  in support of th
1d0f0 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61  e.** chromium sa
1d100 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20  ndbox.  Opening 
1d110 61 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 61  a directory is a
1d120 20 73 65 63 75 72 69 74 79 20 72 69 73 6b 20 28   security risk (
1d130 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20  we are.** told) 
1d140 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65  so making it ove
1d150 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73  rrideable allows
1d160 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20 73 61   the chromium sa
1d170 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c  ndbox to.** repl
1d180 61 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ace this routine
1d190 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65 73 73   with a harmless
1d1a0 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65   no-op.  To make
1d1b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1d1c0 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63   a no-op, replac
1d1d0 65 20 69 74 20 77 69 74 68 20 61 20 73 74 75 62  e it with a stub
1d1e0 20 74 68 61 74 20 72 65 74 75 72 6e 73 20 53 51   that returns SQ
1d1f0 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76  LITE_OK but leav
1d200 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74 20 74  es.** *pFd set t
1d210 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  o a negative num
1d220 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ber..**.** If SQ
1d230 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d240 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ned, the caller 
1d250 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
1d260 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68  or closing.** th
1d270 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1d280 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63 6c 6f  r *pFd using clo
1d290 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  se()..*/.static 
1d2a0 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72  int openDirector
1d2b0 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  y(const char *zF
1d2c0 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46  ilename, int *pF
1d2d0 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20  d){.  int ii;.  
1d2e0 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63  int fd = -1;.  c
1d2f0 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58  har zDirname[MAX
1d300 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20  _PATHNAME+1];.. 
1d310 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1d320 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  f(MAX_PATHNAME, 
1d330 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20  zDirname, "%s", 
1d340 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f  zFilename);.  fo
1d350 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e  r(ii=(int)strlen
1d360 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30  (zDirname); ii>0
1d370 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d   && zDirname[ii]
1d380 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20  !='/'; ii--);.  
1d390 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20 20 20  if( ii>0 ){.    
1d3a0 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27  zDirname[ii] = '
1d3b0 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  \0';.  }else{.  
1d3c0 20 20 69 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30    if( zDirname[0
1d3d0 5d 21 3d 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d  ]!='/' ) zDirnam
1d3e0 65 5b 30 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20  e[0] = '.';.    
1d3f0 7a 44 69 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b  zDirname[1] = 0;
1d400 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75  .  }.  fd = robu
1d410 73 74 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65  st_open(zDirname
1d420 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e  , O_RDONLY|O_BIN
1d430 41 52 59 2c 20 30 29 3b 0a 20 20 69 66 28 20 66  ARY, 0);.  if( f
1d440 64 3e 3d 30 20 29 7b 0a 20 20 20 20 4f 53 54 52  d>=0 ){.    OSTR
1d450 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d  ACE(("OPENDIR %-
1d460 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44  3d %s\n", fd, zD
1d470 69 72 6e 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20  irname));.  }.  
1d480 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 69 66 28  *pFd = fd;.  if(
1d490 20 66 64 3e 3d 30 20 29 20 72 65 74 75 72 6e 20   fd>=0 ) return 
1d4a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74  SQLITE_OK;.  ret
1d4b0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1d4c0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1d4d0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 44 69 72 65  _BKPT, "openDire
1d4e0 63 74 6f 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65  ctory", zDirname
1d4f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  );.}../*.** Make
1d500 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73   sure all writes
1d510 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72   to a particular
1d520 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74   file are commit
1d530 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ted to disk..**.
1d540 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d  ** If dataOnly==
1d550 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20  0 then both the 
1d560 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20  file itself and 
1d570 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66 69  its metadata (fi
1d580 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65  le.** size, acce
1d590 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72  ss time, etc) ar
1d5a0 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61  e synced.  If da
1d5b0 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f  taOnly!=0 then o
1d5c0 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  nly the.** file 
1d5d0 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a  data is synced..
1d5e0 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78  **.** Under Unix
1d5f0 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65  , also make sure
1d600 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63 74   that the direct
1d610 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
1d620 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65  e file.** has be
1d630 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66 73  en created by fs
1d640 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65  ync-ing the dire
1d650 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
1d660 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ins the file..**
1d670 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f   If we do not do
1d680 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63   this and we enc
1d690 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66  ounter a power f
1d6a0 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65  ailure, the dire
1d6b0 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66  ctory.** entry f
1d6c0 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  or the journal m
1d6d0 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61  ight not exist a
1d6e0 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20  fter we reboot. 
1d6f0 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c   The next.** SQL
1d700 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74 68  ite to access th
1d710 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20  e file will not 
1d720 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f  know that the jo
1d730 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65  urnal exists (be
1d740 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72  cause.** the dir
1d750 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72  ectory entry for
1d760 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
1d770 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29 20   never created) 
1d780 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1d790 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  ion.** will not 
1d7a0 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73  roll back - poss
1d7b0 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20  ibly leading to 
1d7c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
1d7d0 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
1d7e0 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69  nt unixSync(sqli
1d7f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1d800 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20  t flags){.  int 
1d810 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  rc;.  unixFile *
1d820 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1d830 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73  e*)id;..  int is
1d840 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67  DataOnly = (flag
1d850 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41  s&SQLITE_SYNC_DA
1d860 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69  TAONLY);.  int i
1d870 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61  sFullsync = (fla
1d880 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45  gs&0x0F)==SQLITE
1d890 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f  _SYNC_FULL;..  /
1d8a0 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65  * Check that one
1d8b0 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f   of SQLITE_SYNC_
1d8c0 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77  NORMAL or FULL w
1d8d0 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61  as passed */.  a
1d8e0 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78 30  ssert((flags&0x0
1d8f0 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  F)==SQLITE_SYNC_
1d900 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20  NORMAL.      || 
1d910 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
1d920 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20  LITE_SYNC_FULL. 
1d930 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63   );..  /* Unix c
1d940 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20  annot, but some 
1d950 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75  systems may retu
1d960 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66  rn SQLITE_FULL f
1d970 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20  rom here. This. 
1d980 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74   ** line is to t
1d990 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73  est that doing s
1d9a0 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65  o does not cause
1d9b0 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20   any problems.. 
1d9c0 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69   */.  SimulateDi
1d9d0 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74  skfullError( ret
1d9e0 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
1d9f0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
1da00 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
1da10 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c  (("SYNC    %-3d\
1da20 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a  n", pFile->h));.
1da30 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e    rc = full_fsyn
1da40 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75  c(pFile->h, isFu
1da50 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e  llsync, isDataOn
1da60 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ly);.  SimulateI
1da70 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a  OError( rc=1 );.
1da80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1da90 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1daa0 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
1dab0 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1dac0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
1dad0 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f  RR_FSYNC, "full_
1dae0 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a  fsync", pFile->z
1daf0 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Path);.  }..  /*
1db00 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20   Also fsync the 
1db10 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
1db20 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66  ning the file if
1db30 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61   the DIRSYNC fla
1db40 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20  g.  ** is set.  
1db50 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69  This is a one-ti
1db60 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20  me occurrence.  
1db70 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78  Many systems (ex
1db80 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a  amples: AIX).  *
1db90 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  * are unable to 
1dba0 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72  fsync a director
1dbb0 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72  y, so ignore err
1dbc0 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63  ors on the fsync
1dbd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1dbe0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
1dbf0 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
1dc00 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66   ){.    int dirf
1dc10 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  d;.    OSTRACE((
1dc20 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61 76  "DIRSYNC %s (hav
1dc30 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66  e_fullfsync=%d f
1dc40 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20  ullsync=%d)\n", 
1dc50 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20  pFile->zPath,.  
1dc60 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f 46            HAVE_F
1dc70 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c  ULLFSYNC, isFull
1dc80 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d  sync));.    rc =
1dc90 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79   osOpenDirectory
1dca0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26  (pFile->zPath, &
1dcb0 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20  dirfd);.    if( 
1dcc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1dcd0 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e  .      full_fsyn
1dce0 63 28 64 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a  c(dirfd, 0, 0);.
1dcf0 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
1dd00 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c  se(pFile, dirfd,
1dd10 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
1dd20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1dd30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
1dd40 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20 20 20 20  CANTOPEN );.    
1dd50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1dd60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c  ;.    }.    pFil
1dd70 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20  e->ctrlFlags &= 
1dd80 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e  ~UNIXFILE_DIRSYN
1dd90 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
1dda0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
1ddb0 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
1ddc0 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
1ddd0 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63  d size.*/.static
1dde0 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74   int unixTruncat
1ddf0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
1de00 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  id, i64 nByte){.
1de10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1de20 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1de30 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  id;.  int rc;.  
1de40 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1de50 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
1de60 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
1de70 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
1de80 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1de90 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67   user has config
1dea0 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a  ured a chunk-siz
1deb0 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c  e for this file,
1dec0 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
1ded0 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20  ** file so that 
1dee0 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  it consists of a
1def0 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72  n integer number
1df00 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e   of chunks (i.e.
1df10 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
1df20 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72   file size after
1df30 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d   the operation m
1df40 61 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61  ay be larger tha
1df50 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  n the requested.
1df60 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f    ** size)..  */
1df70 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a  .  if( pFile->sz
1df80 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e  Chunk>0 ){.    n
1df90 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b  Byte = ((nByte +
1dfa0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1dfb0 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68  - 1)/pFile->szCh
1dfc0 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a  unk) * pFile->sz
1dfd0 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63  Chunk;.  }..  rc
1dfe0 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63   = robust_ftrunc
1dff0 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42  ate(pFile->h, nB
1e000 79 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  yte);.  if( rc )
1e010 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
1e020 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
1e030 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75  o);.    return u
1e040 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1e050 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1e060 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1e070 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1e080 20 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53   }else{.#ifdef S
1e090 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1e0a0 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69  /* If we are doi
1e0b0 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74  ng a normal writ
1e0c0 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  e to a database 
1e0d0 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64  file (as opposed
1e0e0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67   to.    ** doing
1e0f0 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1e100 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1e110 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1e120 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20  other than a.   
1e130 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62   ** normal datab
1e140 61 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65  ase file) and we
1e150 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
1e160 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
1e170 68 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65  h,.    ** that e
1e180 66 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74  ffectively updat
1e190 65 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  es the change co
1e1a0 75 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67  unter.  This mig
1e1b0 68 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a  ht happen.    **
1e1c0 20 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20   when restoring 
1e1d0 61 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  a database using
1e1e0 20 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20   the backup API 
1e1f0 66 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67  from a zero-leng
1e200 74 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65  th.    ** source
1e210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1e220 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1e230 57 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d  Write && nByte==
1e240 30 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  0 ){.      pFile
1e250 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1e260 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
1e270 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
1e280 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1e290 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1e2a0 20 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61   was just trunca
1e2b0 74 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d  ted to a size sm
1e2c0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63  aller than the c
1e2d0 75 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20  urrently.    ** 
1e2e0 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72  mapped region, r
1e2f0 65 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74  educe the effect
1e300 69 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  ive mapping size
1e310 20 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65   as well. SQLite
1e320 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65   will.    ** use
1e330 20 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74   read() and writ
1e340 65 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61  e() to access da
1e350 74 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70  ta beyond this p
1e360 6f 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e  oint from now on
1e370 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  .  .    */.    i
1e380 66 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e  f( nByte<pFile->
1e390 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1e3a0 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
1e3b0 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d  e = nByte;.    }
1e3c0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
1e3d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1e3e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65   }.}../*.** Dete
1e3f0 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e  rmine the curren
1e400 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65  t size of a file
1e410 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61   in bytes.*/.sta
1e420 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
1e430 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
1e440 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
1e450 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
1e460 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1e470 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1e480 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28  .  rc = osFstat(
1e490 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d  ((unixFile*)id)-
1e4a0 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d  >h, &buf);.  Sim
1e4b0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63  ulateIOError( rc
1e4c0 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  =1 );.  if( rc!=
1e4d0 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  0 ){.    storeLa
1e4e0 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1e4f0 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
1e500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e510 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
1e520 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
1e530 2e 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20  .st_size;..  /* 
1e540 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a  When opening a z
1e550 65 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73  ero-size databas
1e560 65 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65  e, the findInode
1e570 49 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65  Info() procedure
1e580 0a 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73  .  ** writes a s
1e590 69 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20  ingle byte into 
1e5a0 74 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64  that file in ord
1e5b0 65 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  er to work aroun
1e5c0 64 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20  d a bug.  ** in 
1e5d0 74 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66  the OS-X msdos f
1e5e0 69 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f  ilesystem.  In o
1e5f0 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72  rder to avoid pr
1e600 6f 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65  oblems with uppe
1e610 72 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77  r.  ** layers, w
1e620 65 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74  e need to report
1e630 20 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20   this file size 
1e640 61 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f  as zero even tho
1e650 75 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72  ugh it is.  ** r
1e660 65 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65  eally 1.   Ticke
1e670 74 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20  t #3260..  */.  
1e680 69 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20  if( *pSize==1 ) 
1e690 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20  *pSize = 0;...  
1e6a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e6b0 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
1e6c0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1e6d0 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28  TYLE && defined(
1e6e0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a  __APPLE__)./*.**
1e6f0 20 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f   Handler for pro
1e700 78 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d  xy-locking file-
1e710 63 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20  control verbs.  
1e720 44 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e  Defined below in
1e730 20 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67   the.** proxying
1e740 20 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f   locking divisio
1e750 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
1e760 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f   proxyFileContro
1e770 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  l(sqlite3_file*,
1e780 69 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  int,void*);.#end
1e790 69 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  if../* .** This 
1e7a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1e7b0 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  ed to handle the
1e7c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
1e7d0 5a 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65  ZE_HINT .** file
1e7e0 2d 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69  -control operati
1e7f0 6f 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65  on.  Enlarge the
1e800 20 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79   database to nBy
1e810 74 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28  tes in size.** (
1e820 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68  rounded up to th
1e830 65 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a  e next chunk-siz
1e840 65 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61  e).  If the data
1e850 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a  base is already.
1e860 2a 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72  ** nBytes or lar
1e870 67 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ger, this routin
1e880 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1e890 0a 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74  .static int fcnt
1e8a0 6c 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69  lSizeHint(unixFi
1e8b0 6c 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e  le *pFile, i64 n
1e8c0 42 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69  Byte){.  if( pFi
1e8d0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b  le->szChunk>0 ){
1e8e0 0a 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20  .    i64 nSize; 
1e8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e900 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66     /* Required f
1e910 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ile size */.    
1e920 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e940 20 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65   Used to hold re
1e950 74 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66  turn values of f
1e960 73 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20  stat() */.   .  
1e970 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46    if( osFstat(pF
1e980 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b  ile->h, &buf) ){
1e990 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1e9a0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
1e9b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69  ;.    }..    nSi
1e9c0 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69  ze = ((nByte+pFi
1e9d0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f  le->szChunk-1) /
1e9e0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29   pFile->szChunk)
1e9f0 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
1ea00 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  k;.    if( nSize
1ea10 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a  >(i64)buf.st_siz
1ea20 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e ){..#if define
1ea30 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
1ea40 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
1ea50 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
1ea60 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
1ea70 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c  e below is handl
1ea80 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
1ea90 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63  alue of osFalloc
1eaa0 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ate() .      ** 
1eab0 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78  correctly. posix
1eac0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20  _fallocate() is 
1ead0 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75  defined to "retu
1eae0 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  rns zero on succ
1eaf0 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ess, .      ** o
1eb00 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65  r an error numbe
1eb10 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20  r on  failure". 
1eb20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20  See the manpage 
1eb30 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
1eb40 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20        int err;. 
1eb50 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
1eb60 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61   err = osFalloca
1eb70 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66  te(pFile->h, buf
1eb80 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
1eb90 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
1eba0 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d      }while( err=
1ebb0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
1ebc0 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e  if( err ) return
1ebd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1ebe0 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ITE;.#else.     
1ebf0 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f   /* If the OS do
1ec00 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69  es not have posi
1ec10 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66  x_fallocate(), f
1ec20 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61 20  ake it. Write a 
1ec30 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
1ec40 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73   byte to the las
1ec50 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62  t byte in each b
1ec60 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20  lock that falls 
1ec70 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a  entirely.      *
1ec80 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  * within the ext
1ec90 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
1eca0 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c  en, if required,
1ecb0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
1ecc0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
1ecd0 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20  t (nSize-1), to 
1ece0 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
1ecf0 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74  the file correct
1ed00 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ly..      ** Thi
1ed10 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74  s is a similar t
1ed20 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74  echnique to that
1ed30 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f   used by glibc o
1ed40 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20  n systems.      
1ed50 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ** that do not h
1ed60 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
1ed70 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20  cate() call..   
1ed80 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
1ed90 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c  nBlk = buf.st_bl
1eda0 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d  ksize;  /* File-
1edb0 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a  system block siz
1edc0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
1edd0 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20  Write = 0;      
1ede0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1edf0 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
1ee00 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  n by seekAndWrit
1ee10 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
1ee20 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
1ee30 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f         /* Next o
1ee40 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74  ffset to write t
1ee50 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72 69  o */..      iWri
1ee60 74 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69 7a  te = (buf.st_siz
1ee70 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20 6e  e/nBlk)*nBlk + n
1ee80 42 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20 61  Blk - 1;.      a
1ee90 73 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62  ssert( iWrite>=b
1eea0 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20  uf.st_size );.  
1eeb0 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69 57      assert( ((iW
1eec0 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30  rite+1)%nBlk)==0
1eed0 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a   );.      for(/*
1eee0 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c  no-op*/; iWrite<
1eef0 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69 57  nSize+nBlk-1; iW
1ef00 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20  rite+=nBlk ){.  
1ef10 20 20 20 20 20 20 69 66 28 20 69 57 72 69 74 65        if( iWrite
1ef20 3e 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74 65  >=nSize ) iWrite
1ef30 20 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20 20   = nSize - 1;.  
1ef40 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73        nWrite = s
1ef50 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1ef60 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1ef70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1ef80 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1ef90 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1efa0 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65  RITE;.      }.#e
1efb0 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
1efc0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
1efd0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28  MAP_SIZE>0.  if(
1efe0 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1eff0 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70  Max>0 && nByte>p
1f000 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1f010 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
1f020 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1f030 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20  hunk<=0 ){.     
1f040 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
1f050 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
1f060 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20  nByte) ){.      
1f070 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1f080 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
1f090 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75          return u
1f0a0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
1f0b0 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1f0c0 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  E, "ftruncate", 
1f0d0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1f0e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f0f0 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69    rc = unixMapfi
1f100 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29  le(pFile, nByte)
1f110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1f120 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
1f130 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  .}../*.** If *pA
1f150 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  rg is initially 
1f160 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
1f170 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
1f180 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
1f190 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
1f1a0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1f1b0 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
1f1c0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1f1d0 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
1f1e0 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
1f1f0 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
1f200 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
1f210 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
1f220 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
1f230 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74  void unixModeBit
1f240 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
1f250 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
1f260 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
1f270 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
1f280 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
1f290 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1f2a0 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
1f2b0 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
1f2c0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
1f2d0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
1f2e0 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
1f2f0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1f300 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
1f310 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
1f320 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
1f330 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
1f340 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
1f350 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a  f, char *zBuf);.
1f360 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
1f370 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
1f380 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
1f390 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
1f3a0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
1f3b0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
1f3c0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
1f3d0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
1f3e0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1f3f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1f400 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 23   switch( op ){.#
1f410 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69 6e  if defined(__lin
1f420 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ux__) && defined
1f430 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 42  (SQLITE_ENABLE_B
1f440 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ATCH_ATOMIC_WRIT
1f450 45 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  E).    case SQLI
1f460 54 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e 5f 41  TE_FCNTL_BEGIN_A
1f470 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20  TOMIC_WRITE: {. 
1f480 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 6f 73       int rc = os
1f490 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Ioctl(pFile->h, 
1f4a0 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54 5f 41  F2FS_IOC_START_A
1f4b0 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20 20  TOMIC_WRITE);.  
1f4c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20      return rc ? 
1f4d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 45 47  SQLITE_IOERR_BEG
1f4e0 49 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49  IN_ATOMIC : SQLI
1f4f0 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1f500 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f510 54 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43  TL_COMMIT_ATOMIC
1f520 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20  _WRITE: {.      
1f530 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c  int rc = osIoctl
1f540 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f  (pFile->h, F2FS_
1f550 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d 49  IOC_COMMIT_ATOMI
1f560 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  C_WRITE);.      
1f570 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
1f580 54 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49 54 5f  TE_IOERR_COMMIT_
1f590 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54 45 5f  ATOMIC : SQLITE_
1f5a0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
1f5b0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f5c0 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49 43 5f  ROLLBACK_ATOMIC_
1f5d0 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 69  WRITE: {.      i
1f5e0 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74 6c 28  nt rc = osIoctl(
1f5f0 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53 5f 49  pFile->h, F2FS_I
1f600 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c  OC_ABORT_VOLATIL
1f610 45 5f 57 52 49 54 45 29 3b 0a 20 20 20 20 20 20  E_WRITE);.      
1f620 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51 4c 49  return rc ? SQLI
1f630 54 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42 41 43  TE_IOERR_ROLLBAC
1f640 4b 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54  K_ATOMIC : SQLIT
1f650 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  E_OK;.    }.#end
1f660 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f 5f 20  if /* __linux__ 
1f670 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1f680 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
1f690 49 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61 73 65  ITE */..    case
1f6a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
1f6b0 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20  CKSTATE: {.     
1f6c0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1f6d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b  File->eFileLock;
1f6e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1f6f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1f700 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1f710 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a  CNTL_LAST_ERRNO:
1f720 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1f730 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61  pArg = pFile->la
1f740 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  stErrno;.      r
1f750 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f760 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f770 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
1f780 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20  NK_SIZE: {.     
1f790 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20   pFile->szChunk 
1f7a0 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a  = *(int *)pArg;.
1f7b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1f7c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1f7d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
1f7e0 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b  NTL_SIZE_HINT: {
1f7f0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  .      int rc;. 
1f800 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45       SimulateIOE
1f810 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1f820 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53       rc = fcntlS
1f830 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a  izeHint(pFile, *
1f840 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20  (i64 *)pArg);.  
1f850 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1f860 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20  rorBenign(0);.  
1f870 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f880 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
1f890 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
1f8a0 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20  ST_WAL: {.      
1f8b0 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c  unixModeBit(pFil
1f8c0 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53  e, UNIXFILE_PERS
1f8d0 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70  IST_WAL, (int*)p
1f8e0 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
1f8f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f900 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1f910 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
1f920 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b  AFE_OVERWRITE: {
1f930 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42  .      unixModeB
1f940 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49  it(pFile, UNIXFI
1f950 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70  LE_PSOW, (int*)p
1f960 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Arg);.      retu
1f970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f980 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1f990 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d  ITE_FCNTL_VFSNAM
1f9a0 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61  E: {.      *(cha
1f9b0 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74  r**)pArg = sqlit
1f9c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
1f9d0 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e   pFile->pVfs->zN
1f9e0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1f9f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1fa00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1fa10 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49  ITE_FCNTL_TEMPFI
1fa20 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20  LENAME: {.      
1fa30 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73  char *zTFile = s
1fa40 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
1fa50 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78   pFile->pVfs->mx
1fa60 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20  Pathname );.    
1fa70 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a    if( zTFile ){.
1fa80 20 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54          unixGetT
1fa90 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70  empname(pFile->p
1faa0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c  Vfs->mxPathname,
1fab0 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20   zTFile);.      
1fac0 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20    *(char**)pArg 
1fad0 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20  = zTFile;.      
1fae0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  }.      return S
1faf0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1fb00 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1fb10 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a  FCNTL_HAS_MOVED:
1fb20 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1fb30 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f  pArg = fileHasMo
1fb40 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ved(pFile);.    
1fb50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fb60 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  OK;.    }.#ifdef
1fb70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
1fb80 45 54 4c 4b 5f 54 49 4d 45 4f 55 54 0a 20 20 20  ETLK_TIMEOUT.   
1fb90 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1fba0 54 4c 5f 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 3a  TL_LOCK_TIMEOUT:
1fbb0 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1fbc0 69 42 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 2a  iBusyTimeout = *
1fbd0 28 69 6e 74 2a 29 70 41 72 67 3b 0a 20 20 20 20  (int*)pArg;.    
1fbe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1fbf0 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OK;.    }.#endif
1fc00 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1fc10 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20  MMAP_SIZE>0.    
1fc20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1fc30 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  L_MMAP_SIZE: {. 
1fc40 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d 69       i64 newLimi
1fc50 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67 3b  t = *(i64*)pArg;
1fc60 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
1fc70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
1fc80 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71   if( newLimit>sq
1fc90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fca0 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20  g.mxMmap ){.    
1fcb0 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73      newLimit = s
1fcc0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1fcd0 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20  ig.mxMmap;.     
1fce0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
1fcf0 20 76 61 6c 75 65 20 6f 66 20 6e 65 77 4c 69 6d   value of newLim
1fd00 69 74 20 6d 61 79 20 62 65 20 65 76 65 6e 74 75  it may be eventu
1fd10 61 6c 6c 79 20 63 61 73 74 20 74 6f 20 28 73 69  ally cast to (si
1fd20 7a 65 5f 74 29 20 61 6e 64 20 70 61 73 73 65 64  ze_t) and passed
1fd30 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d 6d 61  .      ** to mma
1fd40 70 28 29 2e 20 52 65 73 74 72 69 63 74 20 69 74  p(). Restrict it
1fd50 73 20 76 61 6c 75 65 20 74 6f 20 32 47 42 20 69  s value to 2GB i
1fd60 66 20 28 73 69 7a 65 5f 74 29 20 69 73 20 6e 6f  f (size_t) is no
1fd70 74 20 61 74 20 6c 65 61 73 74 20 61 0a 20 20 20  t at least a.   
1fd80 20 20 20 2a 2a 20 36 34 2d 62 69 74 20 74 79 70     ** 64-bit typ
1fd90 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  e. */.      if( 
1fda0 6e 65 77 4c 69 6d 69 74 3e 30 20 26 26 20 73 69  newLimit>0 && si
1fdb0 7a 65 6f 66 28 73 69 7a 65 5f 74 29 3c 38 20 29  zeof(size_t)<8 )
1fdc0 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
1fdd0 69 74 20 3d 20 28 6e 65 77 4c 69 6d 69 74 20 26  it = (newLimit &
1fde0 20 30 78 37 46 46 46 46 46 46 46 29 3b 0a 20 20   0x7FFFFFFF);.  
1fdf0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2a 28 69      }..      *(i
1fe00 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  64*)pArg = pFile
1fe10 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
1fe20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69       if( newLimi
1fe30 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69 74  t>=0 && newLimit
1fe40 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  !=pFile->mmapSiz
1fe50 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e  eMax && pFile->n
1fe60 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20  FetchOut==0 ){. 
1fe70 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d         pFile->mm
1fe80 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c  apSizeMax = newL
1fe90 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69 66  imit;.        if
1fea0 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
1feb0 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
1fec0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
1fed0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
1fee0 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
1fef0 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20  e(pFile, -1);.  
1ff00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1ff10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ff20 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
1ff30 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1ff40 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  G.    /* The pag
1ff50 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d 65  er calls this me
1ff60 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20 74  thod to signal t
1ff70 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65 0a  hat it has done.
1ff80 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63      ** a rollbac
1ff90 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20 64  k and that the d
1ffa0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72 65  atabase is there
1ffb0 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20 61  fore unchanged a
1ffc0 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65 6e  nd.    ** it hen
1ffd0 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72 20  ce it is OK for 
1ffe0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1fff0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74  change counter t
20000 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68  o be.    ** unch
20010 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  anged..    */.  
20020 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
20030 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44  NTL_DB_UNCHANGED
20040 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69 78  : {.      ((unix
20050 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70 64  File*)id)->dbUpd
20060 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ate = 0;.      r
20070 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
20080 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
20090 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
200a0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
200b0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
200c0 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  __).    case SQL
200d0 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f  ITE_FCNTL_SET_LO
200e0 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20  CKPROXYFILE:.   
200f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
20100 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_GET_LOCKPROXY
20110 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72 65  FILE: {.      re
20120 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f  turn proxyFileCo
20130 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67  ntrol(id,op,pArg
20140 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  );.    }.#endif 
20150 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
20160 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
20170 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
20180 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
20190 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
201a0 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  OUND;.}../*.** I
201b0 66 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  f pFd->sectorSiz
201c0 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68  e is non-zero wh
201d0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
201e0 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
201f0 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74  s a.** no-op. Ot
20200 68 65 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c  herwise, the val
20210 75 65 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74  ues of pFd->sect
20220 6f 72 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70  orSize and .** p
20230 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  Fd->deviceCharac
20240 74 65 72 69 73 74 69 63 73 20 61 72 65 20 73 65  teristics are se
20250 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  t according to t
20260 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a  he file-system .
20270 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
20280 63 73 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  cs. .**.** There
20290 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
202a0 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
202b0 6f 6e 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20  on. One for QNX 
202c0 61 6e 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a  and one for all.
202d0 2a 2a 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73  ** other systems
202e0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51  ..*/.#ifndef __Q
202f0 4e 58 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76  NXNTO__.static v
20300 6f 69 64 20 73 65 74 44 65 76 69 63 65 43 68 61  oid setDeviceCha
20310 72 61 63 74 65 72 69 73 74 69 63 73 28 75 6e 69  racteristics(uni
20320 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61  xFile *pFd){.  a
20330 73 73 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69  ssert( pFd->devi
20340 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20350 73 3d 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63  s==0 || pFd->sec
20360 74 6f 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20  torSize!=0 );.  
20370 69 66 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53  if( pFd->sectorS
20380 69 7a 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65  ize==0 ){.#if de
20390 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
203a0 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
203b0 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f  TE_ENABLE_BATCH_
203c0 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20  ATOMIC_WRITE).  
203d0 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75    int res;.    u
203e0 33 32 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  32 f = 0;..    /
203f0 2a 20 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70  * Check for supp
20400 6f 72 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f  ort for F2FS ato
20410 6d 69 63 20 62 61 74 63 68 20 77 72 69 74 65 73  mic batch writes
20420 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f  . */.    res = o
20430 73 49 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46  sIoctl(pFd->h, F
20440 32 46 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54  2FS_IOC_GET_FEAT
20450 55 52 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69  URES, &f);.    i
20460 66 28 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20  f( res==0 && (f 
20470 26 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41  & F2FS_FEATURE_A
20480 54 4f 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a  TOMIC_WRITE) ){.
20490 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63        pFd->devic
204a0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
204b0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   = SQLITE_IOCAP_
204c0 42 41 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20  BATCH_ATOMIC;.  
204d0 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f    }.#endif /* __
204e0 6c 69 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54  linux__ && SQLIT
204f0 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41  E_ENABLE_BATCH_A
20500 54 4f 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a  TOMIC_WRITE */..
20510 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50      /* Set the P
20520 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
20530 54 45 20 66 6c 61 67 20 69 66 20 72 65 71 75 65  TE flag if reque
20540 73 74 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  sted. */.    if(
20550 20 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20   pFd->ctrlFlags 
20560 26 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20  & UNIXFILE_PSOW 
20570 29 7b 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65  ){.      pFd->de
20580 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
20590 69 63 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f  ics |= SQLITE_IO
205a0 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  CAP_POWERSAFE_OV
205b0 45 52 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a  ERWRITE;.    }..
205c0 20 20 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53      pFd->sectorS
205d0 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
205e0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
205f0 3b 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69  ;.  }.}.#else.#i
20600 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64  nclude <sys/dcmd
20610 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  _blk.h>.#include
20620 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e   <sys/statvfs.h>
20630 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
20640 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
20650 73 74 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a  stics(unixFile *
20660 70 46 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46  pFile){.  if( pF
20670 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20680 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75  == 0 ){.    stru
20690 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e 66  ct statvfs fsInf
206a0 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f  o;.       .    /
206b0 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20 66  * Set defaults f
206c0 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64  or non-supported
206d0 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a   filesystems */.
206e0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
206f0 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  rSize = SQLITE_D
20700 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49  EFAULT_SECTOR_SI
20710 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64  ZE;.    pFile->d
20720 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
20730 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  tics = 0;.    if
20740 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c 65  ( fstatvfs(pFile
20750 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d  ->h, &fsInfo) ==
20760 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65   -1 ) {.      re
20770 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
20780 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
20790 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
207a0 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20  "tmp") ) {.     
207b0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
207c0 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
207d0 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
207e0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
207f0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
20800 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
20810 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20  TOMIC4K |       
20820 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73  /* All ram files
20830 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
20840 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
20850 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20860 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
20870 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
20880 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
20890 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
208a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
208c0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
208d0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
208e0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
208f0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
20900 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
20910 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
20920 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
20930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
20950 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
20960 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
20970 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
20980 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
20990 61 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29  asetype, "etfs")
209a0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
209b0 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
209c0 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
209d0 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
209e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
209f0 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74   =.        /* et
20a00 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20  fs cluster size 
20a10 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
20a20 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46  c */.        (pF
20a30 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
20a40 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
20a50 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
20a60 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
20a70 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
20a80 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
20a90 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
20aa0 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
20ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ad0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
20ae0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
20af0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
20b00 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
20b10 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
20b20 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
20b30 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b60 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
20b70 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
20b80 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
20b90 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
20ba0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
20bb0 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20   "qnx6") ){.    
20bc0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
20bd0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
20be0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
20bf0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
20c00 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
20c10 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
20c20 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20  ATOMIC |        
20c30 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74   /* All filesyst
20c40 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
20c50 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
20c60 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
20c70 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
20c80 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
20c90 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
20ca0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
20cd0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
20ce0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
20cf0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
20d00 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
20d10 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
20d20 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
20d30 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d50 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
20d60 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
20d70 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
20d80 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
20d90 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
20da0 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29  etype, "qnx4") )
20db0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
20dc0 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
20dd0 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
20de0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20df0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20e00 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
20e10 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
20e20 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
20e30 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
20e40 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
20e50 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
20e60 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
20e70 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
20e80 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
20e90 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20ea0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
20eb0 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
20ec0 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
20ed0 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
20ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f00 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
20f10 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
20f20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
20f30 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
20f40 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
20f50 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  dos") ){.      p
20f60 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
20f70 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
20f80 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
20f90 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20fa0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
20fb0 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
20fc0 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
20fd0 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
20fe0 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
20ff0 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
21000 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
21010 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
21020 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
21030 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
21040 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
21050 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
21060 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
21070 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
21080 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
21090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
210b0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
210c0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
210d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
210e0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
210f0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
21100 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
21110 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20  AP_ATOMIC512 |  
21120 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72      /* blocks ar
21130 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
21140 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
21150 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
21160 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
21170 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
21180 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
21190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
211b0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
211c0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
211d0 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    0;.    }.  }. 
211e0 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20   /* Last chance 
211f0 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49  verification.  I
21200 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  f the sector siz
21210 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70  e isn't a multip
21220 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74  le of 512.  ** t
21230 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c  hen it isn't val
21240 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  id.*/.  if( pFil
21250 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20  e->sectorSize % 
21260 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20  512 != 0 ){.    
21270 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
21280 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
21290 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  ;.    pFile->sec
212a0 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
212b0 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
212c0 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  SIZE;.  }.}.#end
212d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
212e0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
212f0 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
21300 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
21310 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
21320 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
21330 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
21340 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
21350 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
21360 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
21370 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
21380 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
21390 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
213a0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
213b0 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
213c0 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
213d0 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
213e0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
213f0 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
21400 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
21410 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
21420 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
21430 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
21440 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
21450 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
21460 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
21470 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
21480 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
21490 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
214a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
214b0 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61  ;.  setDeviceCha
214c0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64  racteristics(pFd
214d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d  );.  return pFd-
214e0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a  >sectorSize;.}..
214f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
21500 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
21510 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
21520 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
21530 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
21540 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
21550 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
21560 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
21570 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
21580 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
21590 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73   controversial s
215a0 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
215b0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
215c0 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
215d0 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
215e0 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
215f0 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
21600 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
21610 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
21620 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
21630 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
21640 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
21650 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
21660 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
21670 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
21680 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
21690 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
216a0 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
216b0 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
216c0 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
216d0 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
216e0 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
216f0 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
21700 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
21710 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
21720 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
21730 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
21740 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
21750 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
21760 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
21770 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
21780 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
21790 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
217a0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
217b0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
217c0 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
217d0 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
217e0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
217f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
21800 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
21810 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  pFd = (unixFile*
21820 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65  )id;.  setDevice
21830 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
21840 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pFd);.  return p
21850 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  Fd->deviceCharac
21860 74 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69  teristics;.}..#i
21870 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
21880 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
21890 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
218a0 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  IZE>0../*.** Ret
218b0 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70  urn the system p
218c0 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
218d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
218e0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
218f0 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f  ed directly by o
21900 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69  ther code in thi
21910 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74  s file. .** Inst
21920 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ead, it should b
21930 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63  e called via mac
21940 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ro osGetpagesize
21950 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
21960 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a  t unixGetpagesiz
21970 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f  e(void){.#if OS_
21980 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
21990 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66   1024;.#elif def
219a0 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45  ined(_BSD_SOURCE
219b0 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  ).  return getpa
219c0 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
219d0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
219e0 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
219f0 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  ZE);.#endif.}..#
21a00 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
21a10 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
21a20 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
21a30 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
21a40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
21a50 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
21a60 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
21a70 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
21a80 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
21a90 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
21aa0 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
21ab0 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
21ac0 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
21ad0 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
21ae0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
21af0 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
21b00 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
21b10 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
21b20 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
21b30 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
21b40 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
21b50 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
21b60 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
21b70 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
21b80 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
21b90 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
21ba0 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
21bb0 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
21bc0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
21bd0 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
21be0 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
21bf0 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
21c00 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
21c10 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
21c20 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
21c30 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
21c40 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
21c50 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
21c60 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
21c70 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
21c80 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
21c90 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
21ca0 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
21cb0 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
21cc0 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
21cd0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
21ce0 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
21cf0 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
21d00 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
21d10 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
21d20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
21d30 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
21d40 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
21d50 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
21d60 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
21d70 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
21d80 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
21d90 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
21da0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
21db0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
21dc0 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
21dd0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
21de0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
21df0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
21e00 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
21e10 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
21e20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
21e30 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
21e40 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
21e50 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
21e60 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
21e70 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
21e80 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
21e90 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
21ea0 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
21eb0 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
21ec0 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
21ed0 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
21ee0 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
21ef0 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
21f00 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
21f10 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
21f20 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
21f30 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
21f40 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
21f50 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
21f60 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
21f70 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
21f80 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
21f90 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
21fa0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
21fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21fc0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
21fd0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
21fe0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
21ff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22000 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
22010 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
22020 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
22030 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22040 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
22050 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
22060 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
22070 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
22080 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
22090 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20  u8 isUnlocked;  
220a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
220b0 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63  ue if no DMS loc
220c0 6b 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72  k held */.  char
220d0 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
220e0 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
220f0 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
22100 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
22110 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
22120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
22140 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
22150 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
22160 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
22170 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
22180 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
22190 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
221a0 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
221b0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
221c0 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
221d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
221e0 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
221f0 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
22200 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
22210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
22220 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
22230 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
22240 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
22250 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
22260 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
22270 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
22280 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
22290 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
222a0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
222b0 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
222c0 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
222d0 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
222e0 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
222f0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
22300 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
22310 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
22320 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
22330 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
22340 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
22350 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
22360 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
22370 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
22380 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
22390 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
223a0 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
223b0 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
223c0 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
223d0 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
223e0 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
223f0 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
22400 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
22410 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
22420 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
22430 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
22440 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
22450 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
22460 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
22470 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
22480 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
22490 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
224a0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
224b0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
224c0 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
224d0 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
224e0 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
22510 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
22520 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
22530 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
22540 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
22550 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
22560 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
22570 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22590 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
225a0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
225b0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
225c0 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
225d0 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
225e0 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
225f0 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
22600 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
22610 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
22620 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
22630 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
22640 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
22650 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
22660 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
22670 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
22680 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
22690 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
226a0 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
226b0 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
226c0 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
226d0 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
226e0 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
226f0 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
22700 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
22710 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
22720 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
22730 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
22740 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
22750 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
22760 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
22770 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
22780 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
22790 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
227a0 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
227b0 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
227c0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
227d0 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
227e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
227f0 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
22800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22810 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
22820 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
22830 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
22840 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
22850 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
22860 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
22870 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
22880 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
22890 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
228a0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
228b0 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
228c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
228d0 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
228e0 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
228f0 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
22900 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
22910 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
22920 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
22930 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
22940 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
22950 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
22960 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
22970 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
22980 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74  0 || sqlite3_mut
22990 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
229a0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
229b0 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
229c0 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
229d0 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
229e0 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
229f0 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
22a00 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
22a10 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
22a20 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
22a30 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49   n>=1 && n<=SQLI
22a40 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
22a50 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
22a60 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
22a70 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
22a80 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
22a90 73 20 2a 2f 0a 20 20 20 20 66 2e 6c 5f 74 79 70  s */.    f.l_typ
22aa0 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20  e = lockType;.  
22ab0 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
22ac0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c  EEK_SET;.    f.l
22ad0 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20  _start = ofst;. 
22ae0 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a     f.l_len = n;.
22af0 20 20 20 20 72 63 20 3d 20 6f 73 53 65 74 50 6f      rc = osSetPo
22b00 73 69 78 41 64 76 69 73 6f 72 79 4c 6f 63 6b 28  sixAdvisoryLock(
22b10 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26 66 2c  pShmNode->h, &f,
22b20 20 70 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20   pFile);.    rc 
22b30 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53  = (rc!=(-1)) ? S
22b40 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
22b50 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f  E_BUSY;.  }..  /
22b60 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
22b70 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
22b80 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
22b90 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
22ba0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
22bb0 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
22bc0 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
22bd0 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74  );.  mask = ofst
22be0 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28  >31 ? 0xffff : (
22bf0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
22c00 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
22c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22c20 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
22c30 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
22c40 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
22c50 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
22c60 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
22c70 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
22c80 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
22c90 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
22ca0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
22cb0 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
22cc0 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
22cd0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
22ce0 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
22cf0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
22d00 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
22d10 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
22d20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
22d30 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
22d40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
22d50 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
22d60 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
22d70 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
22d80 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
22d90 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
22da0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
22db0 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
22dc0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
22dd0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
22de0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
22df0 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
22e00 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
22e10 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
22e20 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
22e30 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
22e40 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
22e50 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
22e60 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
22e70 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
22e80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22e90 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
22ea0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
22eb0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
22ec0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
22ed0 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
22ee0 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
22ef0 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
22f00 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
22f10 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
22f20 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
22f30 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
22f40 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
22f50 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
22f60 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
22f70 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d  Return the minim
22f80 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b  um number of 32K
22f90 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68  B shm regions th
22fa0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70  at should be map
22fb0 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65  ped at.** a time
22fc0 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
22fd0 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73  each mapping mus
22fe0 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  t be an integer 
22ff0 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a  multiple of the.
23000 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74 65  ** current syste
23010 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a  m page-size..**.
23020 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  ** Usually, this
23030 20 69 73 20 31 2e 20 54 68 65 20 65 78 63 65 70   is 1. The excep
23040 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65  tion seems to be
23050 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
23060 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20  e configured.** 
23070 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67 65  to use 64KB page
23080 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65  s - in this case
23090 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75   each mapping mu
230a0 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73  st cover at leas
230b0 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67  t two.** shm reg
230c0 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
230d0 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  int unixShmRegio
230e0 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20  nPerMap(void){. 
230f0 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a   int shmsz = 32*
23100 31 30 32 34 3b 20 20 20 20 20 20 20 20 20 20 20  1024;           
23110 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73   /* SHM region s
23120 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ize */.  int pgs
23130 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  z = osGetpagesiz
23140 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d  e();   /* System
23150 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
23160 61 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31  assert( ((pgsz-1
23170 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20  )&pgsz)==0 );   
23180 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73  /* Page size mus
23190 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
231a0 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c  2 */.  if( pgsz<
231b0 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31  shmsz ) return 1
231c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f  ;.  return pgsz/
231d0 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  shmsz;.}../*.** 
231e0 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
231f0 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
23200 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
23210 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
23220 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
23230 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
23240 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
23250 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
23260 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
23270 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
23280 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
23290 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
232a0 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
232b0 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
232c0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
232d0 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
232e0 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
232f0 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
23300 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
23310 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d 3e 6e  p && ALWAYS(p->n
23320 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20 69  Ref==0) ){.    i
23330 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20  nt nShmPerMap = 
23340 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
23350 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69  Map();.    int i
23360 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
23370 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
23380 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  node );.    sqli
23390 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
233a0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
233b0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
233c0 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d  ion; i+=nShmPerM
233d0 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ap){.      if( p
233e0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
233f0 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70    osMunmap(p->ap
23400 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
23410 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
23420 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
23430 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
23440 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
23450 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
23460 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
23470 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
23480 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
23490 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
234a0 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
234b0 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
234c0 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
234d0 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
234e0 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
234f0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
23500 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44  }.}../*.** The D
23510 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e 6f 74 20  MS lock has not 
23520 79 65 74 20 62 65 65 6e 20 74 61 6b 65 6e 20 6f  yet been taken o
23530 6e 20 73 68 6d 20 66 69 6c 65 20 70 53 68 6d 4e  n shm file pShmN
23540 6f 64 65 2e 20 41 74 74 65 6d 70 74 20 74 6f 0a  ode. Attempt to.
23550 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f 77 2e 20  ** take it now. 
23560 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
23570 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   if successful, 
23580 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  or an SQLite err
23590 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72  or.** code other
235a0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  wise..**.** If t
235b0 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74 20 62 65  he DMS cannot be
235c0 20 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 20   locked because 
235d0 74 68 69 73 20 69 73 20 61 20 72 65 61 64 6f 6e  this is a readon
235e0 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63 6f 6e  ly_shm=1 .** con
235f0 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 20 6f  nection and no o
23600 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 6c 72  ther process alr
23610 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c 6f 63  eady holds a loc
23620 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  k, return.** SQL
23630 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e  ITE_READONLY_CAN
23640 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20 70 53  TINIT and set pS
23650 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b  hmNode->isUnlock
23660 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ed=1..*/.static 
23670 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72  int unixLockShar
23680 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
23690 65 20 2a 70 44 62 46 64 2c 20 75 6e 69 78 53 68  e *pDbFd, unixSh
236a0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 29  mNode *pShmNode)
236b0 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
236c0 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
236d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
236e0 2f 2a 20 55 73 65 20 46 5f 47 45 54 4c 4b 20 74  /* Use F_GETLK t
236f0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
23700 6c 6f 63 6b 73 20 6f 74 68 65 72 20 70 72 6f 63  locks other proc
23710 65 73 73 65 73 20 61 72 65 20 68 6f 6c 64 69 6e  esses are holdin
23720 67 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 44 4d  g.  ** on the DM
23730 53 20 62 79 74 65 2e 20 49 66 20 69 74 20 69 6e  S byte. If it in
23740 64 69 63 61 74 65 73 20 74 68 61 74 20 61 6e 6f  dicates that ano
23750 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
23760 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 61 20 53  holding.  ** a S
23770 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  HARED lock, then
23780 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 6d 61   this process ma
23790 79 20 61 6c 73 6f 20 74 61 6b 65 20 61 20 53 48  y also take a SH
237a0 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61  ARED lock.  ** a
237b0 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74 68 20  nd proceed with 
237c0 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d 73 68  opening the *-sh
237d0 6d 20 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a 20 20  m file. .  **.  
237e0 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 6f 74 68  ** Or, if no oth
237f0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  er process is ho
23800 6c 64 69 6e 67 20 61 6e 79 20 6c 6f 63 6b 2c 20  lding any lock, 
23810 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73  then this proces
23820 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 66 69  s.  ** is the fi
23830 72 73 74 20 74 6f 20 6f 70 65 6e 20 69 74 2e 20  rst to open it. 
23840 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 61 6b  In this case tak
23850 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
23860 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
23870 44 4d 53 20 62 79 74 65 20 61 6e 64 20 74 72 75  DMS byte and tru
23880 6e 63 61 74 65 20 74 68 65 20 2a 2d 73 68 6d 20  ncate the *-shm 
23890 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
238a0 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68 65 6e  es in size. Then
238b0 0a 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64 65 20  .  ** downgrade 
238c0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
238d0 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79 74 65   on the DMS byte
238e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61  ..  **.  ** If a
238f0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
23900 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45 58 43  s holding an EXC
23910 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
23920 68 65 20 44 4d 53 20 62 79 74 65 2c 0a 20 20 2a  he DMS byte,.  *
23930 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
23940 42 55 53 59 20 74 6f 20 74 68 65 20 63 61 6c 6c  BUSY to the call
23950 65 72 20 28 69 74 20 77 69 6c 6c 20 74 72 79 20  er (it will try 
23960 61 67 61 69 6e 29 2e 20 41 6e 20 65 61 72 6c 69  again). An earli
23970 65 72 0a 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20  er.  ** version 
23980 6f 66 20 74 68 69 73 20 63 6f 64 65 20 61 74 74  of this code att
23990 65 6d 70 74 65 64 20 74 68 65 20 53 48 41 52 45  empted the SHARE
239a0 44 20 6c 6f 63 6b 20 61 74 20 74 68 69 73 20 70  D lock at this p
239b0 6f 69 6e 74 2e 20 42 75 74 0a 20 20 2a 2a 20 74  oint. But.  ** t
239c0 68 69 73 20 69 6e 74 72 6f 64 75 63 65 64 20 61  his introduced a
239d0 20 73 75 62 74 6c 65 20 72 61 63 65 20 63 6f 6e   subtle race con
239e0 64 69 74 69 6f 6e 3a 20 69 66 20 74 68 65 20 70  dition: if the p
239f0 72 6f 63 65 73 73 20 68 6f 6c 64 69 6e 67 0a 20  rocess holding. 
23a00 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 66 61   ** EXCLUSIVE fa
23a10 69 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  iled just before
23a20 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65 20   truncating the 
23a30 2a 2d 73 68 6d 20 66 69 6c 65 2c 20 74 68 65 6e  *-shm file, then
23a40 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 6f 63 65   this.  ** proce
23a50 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 61 6e  ss might open an
23a60 64 20 75 73 65 20 74 68 65 20 2a 2d 73 68 6d 20  d use the *-shm 
23a70 66 69 6c 65 20 77 69 74 68 6f 75 74 20 74 72 75  file without tru
23a80 6e 63 61 74 69 6e 67 20 69 74 2e 0a 20 20 2a 2a  ncating it..  **
23a90 20 41 6e 64 20 69 66 20 74 68 65 20 2a 2d 73 68   And if the *-sh
23aa0 6d 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  m file has been 
23ab0 63 6f 72 72 75 70 74 65 64 20 62 79 20 61 20 70  corrupted by a p
23ac0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 72 0a  ower failure or.
23ad0 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73    ** system cras
23ae0 68 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  h, the database 
23af0 69 74 73 65 6c 66 20 6d 61 79 20 61 6c 73 6f 20  itself may also 
23b00 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e 20  become corrupt. 
23b10 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65   */.  lock.l_whe
23b20 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
23b30 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
23b40 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b 0a 20   UNIX_SHM_DMS;. 
23b50 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b   lock.l_len = 1;
23b60 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d  .  lock.l_type =
23b70 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 69 66 28 20   F_WRLCK;.  if( 
23b80 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65  osFcntl(pShmNode
23b90 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
23ba0 6f 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20 20 20  ock)!=0 ) {.    
23bb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
23bc0 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 20  R_LOCK;.  }else 
23bd0 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d  if( lock.l_type=
23be0 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
23bf0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
23c00 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
23c10 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e    pShmNode->isUn
23c20 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20  locked = 1;.    
23c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
23c40 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54 3b  ADONLY_CANTINIT;
23c50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
23c60 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
23c70 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
23c80 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48  F_WRLCK, UNIX_SH
23c90 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20  M_DMS, 1);.     
23ca0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23cb0 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66 74 72  OK && robust_ftr
23cc0 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d  uncate(pShmNode-
23cd0 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  >h, 0) ){.      
23ce0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
23cf0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
23d00 5f 53 48 4d 4f 50 45 4e 2c 22 66 74 72 75 6e 63  _SHMOPEN,"ftrunc
23d10 61 74 65 22 2c 70 53 68 6d 4e 6f 64 65 2d 3e 7a  ate",pShmNode->z
23d20 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
23d30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
23d40 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
23d50 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
23d60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
23d70 59 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  Y;.  }..  if( rc
23d80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23d90 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 2e     assert( lock.
23da0 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
23db0 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 3d 3d  || lock.l_type==
23dc0 46 5f 52 44 4c 43 4b 20 29 3b 0a 20 20 20 20 72  F_RDLCK );.    r
23dd0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
23de0 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52  mLock(pDbFd, F_R
23df0 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
23e00 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  MS, 1);.  }.  re
23e10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
23e20 2a 20 4f 70 65 6e 20 61 20 73 68 61 72 65 64 2d  * Open a shared-
23e30 6d 65 6d 6f 72 79 20 61 72 65 61 20 61 73 73 6f  memory area asso
23e40 63 69 61 74 65 64 20 77 69 74 68 20 6f 70 65 6e  ciated with open
23e50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
23e60 44 62 46 64 2e 20 20 0a 2a 2a 20 54 68 69 73 20  DbFd.  .** This 
23e70 70 61 72 74 69 63 75 6c 61 72 20 69 6d 70 6c 65  particular imple
23e80 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 6d  mentation uses m
23e90 6d 61 70 70 65 64 20 66 69 6c 65 73 2e 0a 2a 2a  mapped files..**
23ea0 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 75 73 65  .** The file use
23eb0 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 73  d to implement s
23ec0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 73 20  hared-memory is 
23ed0 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
23ee0 63 74 6f 72 79 0a 2a 2a 20 61 73 20 74 68 65 20  ctory.** as the 
23ef0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
23f00 6c 65 20 61 6e 64 20 68 61 73 20 74 68 65 20 73  le and has the s
23f10 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65 20  ame name as the 
23f20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  open database.**
23f30 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 22   file with the "
23f40 2d 73 68 6d 22 20 73 75 66 66 69 78 20 61 64 64  -shm" suffix add
23f50 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ed.  For example
23f60 2c 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  , if the databas
23f70 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 22 2f 68  e file.** is "/h
23f80 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
23f90 2e 64 62 22 20 74 68 65 6e 20 74 68 65 20 66 69  .db" then the fi
23fa0 6c 65 20 74 68 61 74 20 69 73 20 63 72 65 61 74  le that is creat
23fb0 65 64 20 61 6e 64 20 6d 6d 61 70 70 65 64 0a 2a  ed and mmapped.*
23fc0 2a 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65 6d  * for shared mem
23fd0 6f 72 79 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c  ory will be call
23fe0 65 64 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f  ed "/home/user1/
23ff0 63 6f 6e 66 69 67 2e 64 62 2d 73 68 6d 22 2e 20  config.db-shm". 
24000 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20   .**.** Another 
24010 61 70 70 72 6f 61 63 68 20 74 6f 20 69 73 20 74  approach to is t
24020 6f 20 75 73 65 20 66 69 6c 65 73 20 69 6e 20 2f  o use files in /
24030 64 65 76 2f 73 68 6d 20 6f 72 20 2f 64 65 76 2f  dev/shm or /dev/
24040 74 6d 70 20 6f 72 20 61 6e 0a 2a 2a 20 73 6f 6d  tmp or an.** som
24050 65 20 6f 74 68 65 72 20 74 6d 70 66 73 20 6d 6f  e other tmpfs mo
24060 75 6e 74 2e 20 42 75 74 20 69 66 20 61 20 66 69  unt. But if a fi
24070 6c 65 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  le in a differen
24080 74 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 66  t directory.** f
24090 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
240a0 20 66 69 6c 65 20 69 73 20 75 73 65 64 2c 20 74   file is used, t
240b0 68 65 6e 20 64 69 66 66 65 72 69 6e 67 20 61 63  hen differing ac
240c0 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73  cess permissions
240d0 0a 2a 2a 20 6f 72 20 61 20 63 68 72 6f 6f 74 28  .** or a chroot(
240e0 29 20 6d 69 67 68 74 20 63 61 75 73 65 20 74 77  ) might cause tw
240f0 6f 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 63  o different proc
24100 65 73 73 65 73 20 6f 6e 20 74 68 65 20 73 61 6d  esses on the sam
24110 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 6f  e.** database to
24120 20 65 6e 64 20 75 70 20 75 73 69 6e 67 20 64 69   end up using di
24130 66 66 65 72 65 6e 74 20 66 69 6c 65 73 20 66 6f  fferent files fo
24140 72 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  r shared memory 
24150 2d 20 0a 2a 2a 20 6d 65 61 6e 69 6e 67 20 74 68  - .** meaning th
24160 61 74 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  at their memory 
24170 77 6f 75 6c 64 20 6e 6f 74 20 72 65 61 6c 6c 79  would not really
24180 20 62 65 20 73 68 61 72 65 64 20 2d 20 72 65 73   be shared - res
24190 75 6c 74 69 6e 67 0a 2a 2a 20 69 6e 20 64 61 74  ulting.** in dat
241a0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
241b0 2e 20 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  .  Nevertheless,
241c0 20 74 68 69 73 20 74 6d 70 66 73 20 66 69 6c 65   this tmpfs file
241d0 20 75 73 61 67 65 0a 2a 2a 20 63 61 6e 20 62 65   usage.** can be
241e0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
241f0 69 6c 65 2d 74 69 6d 65 20 75 73 69 6e 67 20 2d  ile-time using -
24200 44 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  DSQLITE_SHM_DIRE
24210 43 54 4f 52 59 3d 22 2f 64 65 76 2f 73 68 6d 22  CTORY="/dev/shm"
24220 0a 2a 2a 20 6f 72 20 74 68 65 20 65 71 75 69 76  .** or the equiv
24230 61 6c 65 6e 74 2e 20 20 54 68 65 20 75 73 65 20  alent.  The use 
24240 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 48  of the SQLITE_SH
24250 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
24260 69 6c 65 2d 74 69 6d 65 0a 2a 2a 20 6f 70 74 69  ile-time.** opti
24270 6f 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  on results in an
24280 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 62 75   incompatible bu
24290 69 6c 64 20 6f 66 20 53 51 4c 69 74 65 3b 20 20  ild of SQLite;  
242a0 62 75 69 6c 64 73 20 6f 66 20 53 51 4c 69 74 65  builds of SQLite
242b0 0a 2a 2a 20 74 68 61 74 20 77 69 74 68 20 64 69  .** that with di
242c0 66 66 65 72 69 6e 67 20 53 51 4c 49 54 45 5f 53  ffering SQLITE_S
242d0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 73 65 74  HM_DIRECTORY set
242e0 74 69 6e 67 73 20 61 74 74 65 6d 70 74 20 74 6f  tings attempt to
242f0 20 75 73 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65   use the.** same
24300 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
24310 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2c  t the same time,
24320 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
24330 74 69 6f 6e 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  tion will likely
24340 0a 2a 2a 20 72 65 73 75 6c 74 2e 20 54 68 65 20  .** result. The 
24350 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
24360 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
24370 65 20 6f 70 74 69 6f 6e 20 69 73 20 63 6f 6e 73  e option is cons
24380 69 64 65 72 65 64 0a 2a 2a 20 22 75 6e 73 75 70  idered.** "unsup
24390 70 6f 72 74 65 64 22 20 61 6e 64 20 6d 61 79 20  ported" and may 
243a0 67 6f 20 61 77 61 79 20 69 6e 20 61 20 66 75 74  go away in a fut
243b0 75 72 65 20 53 51 4c 69 74 65 20 72 65 6c 65 61  ure SQLite relea
243c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6f  se..**.** When o
243d0 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68 61  pening a new sha
243e0 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2c  red-memory file,
243f0 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e 73   if no other ins
24400 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a 2a  tances of that.*
24410 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72 65  * file are curre
24420 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74 68  ntly open, in th
24430 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69 6e  is process or in
24440 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
24450 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66 69  , then.** the fi
24460 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e 63  le must be trunc
24470 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  ated to zero len
24480 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73 20  gth or have its 
24490 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e 0a  header cleared..
244a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 69  **.** If the ori
244b0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
244c0 69 6c 65 20 28 70 44 62 46 64 29 20 69 73 20 75  ile (pDbFd) is u
244d0 73 69 6e 67 20 74 68 65 20 22 75 6e 69 78 2d 65  sing the "unix-e
244e0 78 63 6c 22 20 56 46 53 0a 2a 2a 20 74 68 61 74  xcl" VFS.** that
244f0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 20 65   means that an e
24500 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
24510 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
24520 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 0a 2a  abase file and.*
24530 2a 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  * that no other 
24540 70 72 6f 63 65 73 73 65 73 20 61 72 65 20 61 62  processes are ab
24550 6c 65 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  le to read or wr
24560 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ite the database
24570 2e 20 20 49 6e 0a 2a 2a 20 74 68 61 74 20 63 61  .  In.** that ca
24580 73 65 2c 20 77 65 20 64 6f 20 6e 6f 74 20 72 65  se, we do not re
24590 61 6c 6c 79 20 6e 65 65 64 20 73 68 61 72 65 64  ally need shared
245a0 20 6d 65 6d 6f 72 79 2e 20 20 4e 6f 20 73 68 61   memory.  No sha
245b0 72 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 66 69  red memory.** fi
245c0 6c 65 20 69 73 20 63 72 65 61 74 65 64 2e 20 20  le is created.  
245d0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
245e0 79 20 77 69 6c 6c 20 62 65 20 73 69 6d 75 6c 61  y will be simula
245f0 74 65 64 20 77 69 74 68 20 68 65 61 70 20 6d 65  ted with heap me
24600 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
24610 69 6e 74 20 75 6e 69 78 4f 70 65 6e 53 68 61 72  int unixOpenShar
24620 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46 69 6c  edMemory(unixFil
24630 65 20 2a 70 44 62 46 64 29 7b 0a 20 20 73 74 72  e *pDbFd){.  str
24640 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  uct unixShm *p =
24650 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
24660 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  The connection t
24670 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
24680 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e   struct unixShmN
24690 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
246a0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
246b0 6e 67 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  ng mmapped file 
246c0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
246d0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
246e0 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
246f0 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ode */.  unixIno
24700 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
24710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
24720 69 6e 6f 64 65 20 6f 66 20 66 64 20 2a 2f 0a 20  inode of fd */. 
24730 20 63 68 61 72 20 2a 7a 53 68 6d 3b 20 20 20 20   char *zShm;    
24740 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
24750 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
24760 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
24770 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24790 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
247a0 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
247b0 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
247c0 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
247d0 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
247e0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
247f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
24800 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  4( sizeof(*p) );
24810 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
24820 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
24830 4d 5f 42 4b 50 54 3b 0a 20 20 6d 65 6d 73 65 74  M_BKPT;.  memset
24840 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  (p, 0, sizeof(*p
24850 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44  ));.  assert( pD
24860 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a  bFd->pShm==0 );.
24870 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73  .  /* Check to s
24880 65 65 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e  ee if a unixShmN
24890 6f 64 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61  ode object alrea
248a0 64 79 20 65 78 69 73 74 73 2e 20 52 65 75 73 65  dy exists. Reuse
248b0 20 61 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a   an existing.  *
248c0 2a 20 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74  * one if present
248d0 2e 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f  . Create a new o
248e0 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
248f0 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65  .  */.  unixEnte
24900 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
24910 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f  de = pDbFd->pIno
24920 64 65 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d  de;.  pShmNode =
24930 20 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64   pInode->pShmNod
24940 65 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  e;.  if( pShmNod
24950 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75  e==0 ){.    stru
24960 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
24970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24980 2a 20 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66  * fstat() info f
24990 6f 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  or database file
249a0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
249b0 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
249c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
249d0 2a 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62  *zBasePath = pDb
249e0 46 64 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69  Fd->zPath;.#endi
249f0 66 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66  f..    /* Call f
24a00 73 74 61 74 28 29 20 74 6f 20 66 69 67 75 72 65  stat() to figure
24a10 20 6f 75 74 20 74 68 65 20 70 65 72 6d 69 73 73   out the permiss
24a20 69 6f 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61  ions on the data
24a30 62 61 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20  base file. If.  
24a40 20 20 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d    ** a new *-shm
24a50 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
24a60 2c 20 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c  , an attempt wil
24a70 6c 20 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65  l be made to cre
24a80 61 74 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69  ate it.    ** wi
24a90 74 68 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d  th the same perm
24aa0 69 73 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a  issions..    */.
24ab0 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
24ac0 70 44 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74  pDbFd->h, &sStat
24ad0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
24ae0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
24af0 41 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73  AT;.      goto s
24b00 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
24b10 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
24b20 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
24b30 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65      nShmFilename
24b40 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c 49 54 45   = sizeof(SQLITE
24b50 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 20  _SHM_DIRECTORY) 
24b60 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20  + 31;.#else.    
24b70 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 36  nShmFilename = 6
24b80 20 2b 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   + (int)strlen(z
24b90 42 61 73 65 50 61 74 68 29 3b 0a 23 65 6e 64 69  BasePath);.#endi
24ba0 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 20 3d  f.    pShmNode =
24bb0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
24bc0 34 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  4( sizeof(*pShmN
24bd0 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65 6e  ode) + nShmFilen
24be0 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ame );.    if( p
24bf0 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  ShmNode==0 ){.  
24c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24c10 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
24c20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
24c30 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  err;.    }.    m
24c40 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20  emset(pShmNode, 
24c50 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e  0, sizeof(*pShmN
24c60 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d  ode)+nShmFilenam
24c70 65 29 3b 0a 20 20 20 20 7a 53 68 6d 20 3d 20 70  e);.    zShm = p
24c80 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61  ShmNode->zFilena
24c90 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 53 68  me = (char*)&pSh
24ca0 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69 66 64 65 66  mNode[1];.#ifdef
24cb0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
24cc0 43 54 4f 52 59 0a 20 20 20 20 73 71 6c 69 74 65  CTORY.    sqlite
24cd0 33 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46  3_snprintf(nShmF
24ce0 69 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 2c 20 0a  ilename, zShm, .
24cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d00 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f       SQLITE_SHM_
24d10 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69  DIRECTORY "/sqli
24d20 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20  te-shm-%x-%x",. 
24d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d40 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e 73      (u32)sStat.s
24d50 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61  t_ino, (u32)sSta
24d60 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65  t.st_dev);.#else
24d70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
24d80 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61  rintf(nShmFilena
24d90 6d 65 2c 20 7a 53 68 6d 2c 20 22 25 73 2d 73 68  me, zShm, "%s-sh
24da0 6d 22 2c 20 7a 42 61 73 65 50 61 74 68 29 3b 0a  m", zBasePath);.
24db0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
24dc0 75 66 66 69 78 33 28 70 44 62 46 64 2d 3e 7a 50  uffix3(pDbFd->zP
24dd0 61 74 68 2c 20 7a 53 68 6d 29 3b 0a 23 65 6e 64  ath, zShm);.#end
24de0 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  if.    pShmNode-
24df0 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62  >h = -1;.    pDb
24e00 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
24e10 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b  Node = pShmNode;
24e20 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  .    pShmNode->p
24e30 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70  Inode = pDbFd->p
24e40 49 6e 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 73  Inode;.    if( s
24e50 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
24e60 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 29 7b  ig.bCoreMutex ){
24e70 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
24e80 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
24e90 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
24ea0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
24eb0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
24ec0 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
24ed0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
24ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
24ef0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
24f00 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
24f10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
24f20 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  f( pInode->bProc
24f30 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
24f40 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74      if( 0==sqlit
24f50 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 70  e3_uri_boolean(p
24f60 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22 72 65  DbFd->zPath, "re
24f70 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30 29 20  adonly_shm", 0) 
24f80 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e  ){.        pShmN
24f90 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f  ode->h = robust_
24fa0 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 57  open(zShm, O_RDW
24fb0 52 7c 4f 5f 43 52 45 41 54 2c 20 28 73 53 74 61  R|O_CREAT, (sSta
24fc0 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29  t.st_mode&0777))
24fd0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24fe0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c  if( pShmNode->h<
24ff0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  0 ){.        pSh
25000 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73  mNode->h = robus
25010 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  t_open(zShm, O_R
25020 44 4f 4e 4c 59 2c 20 28 73 53 74 61 74 2e 73 74  DONLY, (sStat.st
25030 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20 20  _mode&0777));.  
25040 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
25050 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
25060 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
25070 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
25080 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
25090 65 6e 22 2c 20 7a 53 68 6d 29 3b 0a 20 20 20 20  en", zShm);.    
250a0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
250b0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 20 20 20  pen_err;.       
250c0 20 7d 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e   }.        pShmN
250d0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
250e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
250f0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70      /* If this p
25100 72 6f 63 65 73 73 20 69 73 20 72 75 6e 6e 69 6e  rocess is runnin
25110 67 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b 65 20  g as root, make 
25120 73 75 72 65 20 74 68 61 74 20 74 68 65 20 53 48  sure that the SH
25130 4d 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  M file.      ** 
25140 69 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  is owned by the 
25150 73 61 6d 65 20 75 73 65 72 20 74 68 61 74 20 6f  same user that o
25160 77 6e 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  wns the original
25170 20 64 61 74 61 62 61 73 65 2e 20 20 4f 74 68 65   database.  Othe
25180 72 77 69 73 65 2c 0a 20 20 20 20 20 20 2a 2a 20  rwise,.      ** 
25190 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 6f 77 6e  the original own
251a0 65 72 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61  er will not be a
251b0 62 6c 65 20 74 6f 20 63 6f 6e 6e 65 63 74 2e 0a  ble to connect..
251c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
251d0 6f 62 75 73 74 46 63 68 6f 77 6e 28 70 53 68 6d  obustFchown(pShm
251e0 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73  Node->h, sStat.s
251f0 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f  t_uid, sStat.st_
25200 67 69 64 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  gid);..      rc 
25210 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72 65 64  = unixLockShared
25220 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20 70 53  Memory(pDbFd, pS
25230 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 20 20 69  hmNode);.      i
25240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25250 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52   && rc!=SQLITE_R
25260 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49 54  EADONLY_CANTINIT
25270 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e   ) goto shm_open
25280 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _err;.    }.  }.
25290 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65 20 6e  .  /* Make the n
252a0 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 20  ew connection a 
252b0 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75 6e 69  child of the uni
252c0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d  xShmNode */.  p-
252d0 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d  >pShmNode = pShm
252e0 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53 51 4c  Node;.#ifdef SQL
252f0 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69  ITE_DEBUG.  p->i
25300 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65  d = pShmNode->ne
25310 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69  xtShmId++;.#endi
25320 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  f.  pShmNode->nR
25330 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70  ef++;.  pDbFd->p
25340 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c  Shm = p;.  unixL
25350 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20  eaveMutex();..  
25360 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  /* The reference
25370 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f   count on pShmNo
25380 64 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  de has already b
25390 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65 64 20  een incremented 
253a0 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65 20 63  under.  ** the c
253b0 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e 69 78  over of the unix
253c0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d 75 74  EnterMutex() mut
253d0 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69 6e 74  ex and the point
253e0 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20 2a 2a  er from the.  **
253f0 20 6e 65 77 20 28 73 74 72 75 63 74 20 75 6e 69   new (struct uni
25400 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74 6f 20  xShm) object to 
25410 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68 61 73  the pShmNode has
25420 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c 20 74   been set. All t
25430 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65 66 74  hat is.  ** left
25440 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c 69 6e   to do is to lin
25450 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  k the new object
25460 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64   into the linked
25470 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67 0a 20   list starting. 
25480 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64 65 2d   ** at pShmNode-
25490 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20 6d 75  >pFirst. This mu
254a0 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69 6c 65  st be done while
254b0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70 53 68   holding the pSh
254c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a 20 20  mNode->mutex .  
254d0 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f 0a 20  ** mutex..  */. 
254e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
254f0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
25500 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e 65 78  utex);.  p->pNex
25510 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  t = pShmNode->pF
25520 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  irst;.  pShmNode
25530 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a 20 20  ->pFirst = p;.  
25540 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
25550 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
25560 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
25570 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  c;..  /* Jump he
25580 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
25590 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
255a0 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
255b0 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
255c0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
255d0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
255e0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
255f0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
25600 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
25610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25620 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
25630 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
25640 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
25650 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
25660 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
25670 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
25680 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
25690 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
256a0 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
256b0 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
256c0 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
256d0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
256e0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
256f0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
25700 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
25710 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
25720 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25730 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25740 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
25750 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
25760 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
25770 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
25780 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
25790 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
257a0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
257b0 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
257c0 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
257d0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
257e0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
257f0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
25800 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
25810 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
25820 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
25830 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
25840 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
25850 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
25860 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
25870 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
25880 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
25890 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
258a0 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
258b0 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
258c0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
258d0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
258e0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
258f0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
25900 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
25910 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
25920 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
25930 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
25940 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
25950 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
25960 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
25970 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
25980 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
25990 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
259a0 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
259b0 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
259c0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
259d0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
259e0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
259f0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
25a00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
25a10 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
25a20 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
25a30 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25a50 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
25a60 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
25a70 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
25a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
25a90 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
25aa0 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
25ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ac0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
25ad0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
25ae0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
25af0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
25b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
25b10 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
25b20 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
25b30 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
25b40 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
25b50 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
25b60 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
25b70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
25b80 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
25b90 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
25ba0 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
25bb0 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
25bc0 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
25bd0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
25be0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
25bf0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
25c00 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
25c10 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
25c20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
25c30 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
25c40 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
25c50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
25c60 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
25c70 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
25c80 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
25c90 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
25ca0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
25cb0 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
25cc0 75 74 65 78 29 3b 0a 20 20 69 66 28 20 70 53 68  utex);.  if( pSh
25cd0 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65  mNode->isUnlocke
25ce0 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  d ){.    rc = un
25cf0 69 78 4c 6f 63 6b 53 68 61 72 65 64 4d 65 6d 6f  ixLockSharedMemo
25d00 72 79 28 70 44 62 46 64 2c 20 70 53 68 6d 4e 6f  ry(pDbFd, pShmNo
25d10 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  de);.    if( rc!
25d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
25d30 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
25d40 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55     pShmNode->isU
25d50 6e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d  nlocked = 0;.  }
25d60 0a 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67  .  assert( szReg
25d70 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73  ion==pShmNode->s
25d80 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e  zRegion || pShmN
25d90 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20  ode->nRegion==0 
25da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
25db0 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
25dc0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
25dd0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
25de0 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46  de->h>=0 || pDbF
25df0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
25e00 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20  essLock==1 );.  
25e10 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25e20 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e  ->h<0 || pDbFd->
25e30 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
25e40 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Lock==0 );..  /*
25e50 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Minimum number 
25e60 6f 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69  of regions requi
25e70 72 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64  red to be mapped
25e80 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f  . */.  nReqRegio
25e90 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53  n = ((iRegion+nS
25ea0 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d  hmPerMap) / nShm
25eb0 50 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65  PerMap) * nShmPe
25ec0 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68  rMap;..  if( pSh
25ed0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e  mNode->nRegion<n
25ee0 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  ReqRegion ){.   
25ef0 20 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20   char **apNew;  
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67      /* New apReg
25f20 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ion[] array */. 
25f30 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
25f40 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69  ReqRegion*szRegi
25f50 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d  on;   /* Minimum
25f60 20 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73   required file s
25f70 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  ize */.    struc
25f80 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25fa0 20 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29   Used by fstat()
25fb0 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64   */..    pShmNod
25fc0 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a  e->szRegion = sz
25fd0 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28  Region;..    if(
25fe0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
25ff0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
26000 72 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e  requested region
26010 20 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69   is not mapped i
26020 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73  nto this process
26030 65 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65  es address space
26040 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b  ..      ** Check
26050 20 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61   to see if it ha
26060 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
26070 20 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61   (i.e. if the wa
26080 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a  l-index file is.
26090 20 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65        ** large e
260a0 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e  nough to contain
260b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72   the requested r
260c0 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f  egion)..      */
260d0 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
260e0 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  at(pShmNode->h, 
260f0 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
26100 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
26110 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20  OERR_SHMSIZE;.  
26120 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
26130 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  ge_out;.      }.
26140 20 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74    .      if( sSt
26150 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65  at.st_size<nByte
26160 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
26170 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
26180 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20  ory region does 
26190 6e 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45  not exist. If bE
261a0 78 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a  xtend is set to.
261b0 20 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65          ** false
261c0 2c 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70  , exit early. *p
261d0 70 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f  p will be set to
261e0 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45   NULL and SQLITE
261f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20  _OK returned..  
26200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
26210 20 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b   if( !bExtend ){
26220 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
26230 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
26240 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
26250 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79  /* Alternatively
26260 2c 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20  , if bExtend is 
26270 74 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65  true, extend the
26280 20 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62   file. Do this b
26290 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69  y.        ** wri
262a0 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
262b0 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  te to the end of
262c0 20 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20   each (OS) page 
262d0 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  being.        **
262e0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78   allocated or ex
262f0 74 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61  tended. Technica
26300 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c  lly, we need onl
26310 79 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20  y write to the. 
26320 20 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70         ** last p
26330 61 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  age in order to 
26340 65 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e  extend the file.
26350 20 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20   But writing to 
26360 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20  all new.        
26370 2a 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20  ** pages forces 
26380 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61  the OS to alloca
26390 74 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74  te them immediat
263a0 65 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63  ely, which reduc
263b0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  es.        ** th
263c0 65 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47  e chances of SIG
263d0 42 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73  BUS while access
263e0 69 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72  ing the mapped r
263f0 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a  egion later on..
26400 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26410 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20     else{.       
26420 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
26430 69 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b  int pgsz = 4096;
26440 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
26450 50 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  Pg;..          /
26460 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c  * Write to the l
26470 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68  ast byte of each
26480 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
26490 20 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67   or extended pag
264a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61  e */.          a
264b0 73 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20  ssert( (nByte % 
264c0 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20  pgsz)==0 );.    
264d0 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73        for(iPg=(s
264e0 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73  Stat.st_size/pgs
264f0 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70  z); iPg<(nByte/p
26500 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  gsz); iPg++){.  
26510 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 78 20            int x 
26520 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
26530 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74   if( seekAndWrit
26540 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  eFd(pShmNode->h,
26550 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a   iPg*pgsz + pgsz
26560 2d 31 2c 20 22 22 2c 20 31 2c 20 26 78 29 21 3d  -1, "", 1, &x)!=
26570 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
26580 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
26590 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d  File = pShmNode-
265a0 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  >zFilename;.    
265b0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
265c0 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
265d0 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
265e0 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65  , "write", zFile
265f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26600 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
26610 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  t;.            }
26620 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
26630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
26640 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70     }..    /* Map
26650 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d   the requested m
26660 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74  emory region int
26670 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73  o this processes
26680 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20   address space. 
26690 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28  */.    apNew = (
266a0 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f  char **)sqlite3_
266b0 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
266c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
266d0 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a  ion, nReqRegion*
266e0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20  sizeof(char *). 
266f0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61     );.    if( !a
26700 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63  pNew ){.      rc
26710 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
26720 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
26730 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
26740 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  ut;.    }.    pS
26750 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
26760 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68   = apNew;.    wh
26770 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  ile( pShmNode->n
26780 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f  Region<nReqRegio
26790 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  n ){.      int n
267a0 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e  Map = szRegion*n
267b0 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20  ShmPerMap;.     
267c0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f   int i;.      vo
267d0 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20  id *pMem;.      
267e0 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
267f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d  =0 ){.        pM
26800 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e  em = osMmap(0, n
26810 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Map,.           
26820 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
26830 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41  donly ? PROT_REA
26840 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52  D : PROT_READ|PR
26850 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20  OT_WRITE, .     
26860 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45         MAP_SHARE
26870 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  D, pShmNode->h, 
26880 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53  szRegion*(i64)pS
26890 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a  hmNode->nRegion.
268a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
268b0 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50     if( pMem==MAP
268c0 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
268d0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
268e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
268f0 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61  ERR_SHMMAP, "mma
26900 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  p", pShmNode->zF
26910 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
26920 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
26930 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
26940 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26950 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69       pMem = sqli
26960 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52  te3_malloc64(szR
26970 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
26980 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
26990 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
269a0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
269b0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
269c0 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
269d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d       }.        m
269e0 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73  emset(pMem, 0, s
269f0 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20  zRegion);.      
26a00 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  }..      for(i=0
26a10 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20  ; i<nShmPerMap; 
26a20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53  i++){.        pS
26a30 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
26a40 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69  [pShmNode->nRegi
26a50 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a  on+i] = &((char*
26a60 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a  )pMem)[szRegion*
26a70 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
26a80 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67    pShmNode->nReg
26a90 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61  ion += nShmPerMa
26aa0 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68  p;.    }.  }..sh
26ab0 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28  mpage_out:.  if(
26ac0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
26ad0 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20  on>iRegion ){.  
26ae0 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65    *pp = pShmNode
26af0 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69  ->apRegion[iRegi
26b00 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  on];.  }else{.  
26b10 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
26b20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69   if( pShmNode->i
26b30 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d  sReadonly && rc=
26b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
26b50 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  = SQLITE_READONL
26b60 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  Y;.  sqlite3_mut
26b70 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
26b80 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  e->mutex);.  ret
26b90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
26ba0 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b   Change the lock
26bb0 20 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61   state for a sha
26bc0 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red-memory segme
26bd0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  nt..**.** Note t
26be0 68 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  hat the relation
26bf0 73 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41  ship between SHA
26c00 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56  REd and EXCLUSIV
26c10 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74  E locks is a lit
26c20 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74  tle.** different
26c30 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f   here than in po
26c40 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63  six.  In xShmLoc
26c50 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20  k(), one can go 
26c60 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a  from unlocked.**
26c70 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62   to shared and b
26c80 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f  ack or from unlo
26c90 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  cked to exclusiv
26ca0 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74  e and back.  But
26cb0 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20   one may.** not 
26cc0 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74  go from shared t
26cd0 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66  o exclusive or f
26ce0 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f  rom exclusive to
26cf0 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74   shared..*/.stat
26d00 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f  ic int unixShmLo
26d10 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ck(.  sqlite3_fi
26d20 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
26d30 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
26d40 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
26d50 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  ared memory */. 
26d60 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20   int ofst,      
26d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
26d80 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71  irst lock to acq
26d90 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
26da0 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20  */.  int n,     
26db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26dc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
26dd0 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72  ks to acquire or
26de0 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e   release */.  in
26df0 74 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20  t flags         
26e00 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74           /* What
26e10 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20   to do with the 
26e20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69  lock */.){.  uni
26e30 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28  xFile *pDbFd = (
26e40 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20  unixFile*)fd;   
26e50 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
26e60 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20   holding shared 
26e70 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78  memory */.  unix
26e80 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e  Shm *p = pDbFd->
26e90 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pShm;           
26ea0 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20    /* The shared 
26eb0 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63  memory being loc
26ec0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ked */.  unixShm
26ed0 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20   *pX;           
26ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26ef0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
26f00 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20  er all siblings 
26f10 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  */.  unixShmNode
26f20 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e   *pShmNode = p->
26f30 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68  pShmNode;  /* Th
26f40 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c  e underlying fil
26f50 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  e iNode */.  int
26f60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f80 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
26f90 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b  e */.  u16 mask;
26fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26fc0 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
26fd0 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65   take or release
26fe0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
26ff0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
27000 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
27010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
27020 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
27030 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
27040 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e  .  assert( ofst>
27050 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51  =0 && ofst+n<=SQ
27060 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29  LITE_SHM_NLOCK )
27070 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31  ;.  assert( n>=1
27080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c   );.  assert( fl
27090 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
270a0 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  _LOCK | SQLITE_S
270b0 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  HM_SHARED).     
270c0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
270d0 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
270e0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
270f0 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  IVE).       || f
27100 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
27110 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
27120 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
27130 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
27140 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
27150 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
27160 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61  XCLUSIVE) );.  a
27170 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28  ssert( n==1 || (
27180 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
27190 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30  HM_EXCLUSIVE)!=0
271a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
271b0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
271c0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
271d0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
271e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
271f0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
27200 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
27210 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
27220 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66    mask = (1<<(of
27230 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73  st+n)) - (1<<ofs
27240 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e  t);.  assert( n>
27250 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f  1 || mask==(1<<o
27260 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  fst) );.  sqlite
27270 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
27280 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
27290 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
272a0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
272b0 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61  ){.    u16 allMa
272c0 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20  sk = 0; /* Mask 
272d0 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
272e0 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20   siblings */..  
272f0 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20    /* See if any 
27300 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68  siblings hold th
27310 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a  is same lock */.
27320 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
27330 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
27340 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
27350 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20        if( pX==p 
27360 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27370 20 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65    assert( (pX->e
27380 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78  xclMask & (p->ex
27390 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64  clMask|p->shared
273a0 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20  Mask))==0 );.   
273b0 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58     allMask |= pX
273c0 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
273d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f    }..    /* Unlo
273e0 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
273f0 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  vel locks */.   
27400 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c   if( (mask & all
27410 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Mask)==0 ){.    
27420 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
27430 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
27440 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_UNLCK, ofst+UN
27450 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
27460 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27470 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
27480 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
27490 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c  Undo the local l
274a0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
274b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
274c0 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61  .      p->exclMa
274d0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
274e0 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b     p->sharedMask
274f0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
27500 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c   .  }else if( fl
27510 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d  ags & SQLITE_SHM
27520 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75  _SHARED ){.    u
27530 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30  16 allShared = 0
27540 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c  ;  /* Union of l
27550 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e  ocks held by con
27560 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74  nections other t
27570 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20  han "p" */..    
27580 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63  /* Find out whic
27590 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61  h shared locks a
275a0 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20  re already held 
275b0 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  by sibling conne
275c0 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49  ctions..    ** I
275d0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c  f any sibling al
275e0 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65  ready holds an e
275f0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67  xclusive lock, g
27600 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75  o ahead and retu
27610 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  rn.    ** SQLITE
27620 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20  _BUSY..    */.  
27630 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
27640 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
27650 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
27660 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
27670 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
27680 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
27690 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
276a0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
276b0 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68     }.      allSh
276c0 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72  ared |= pX->shar
276d0 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
276e0 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64     /* Get shared
276f0 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
27700 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e  stem level, if n
27710 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
27720 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27730 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  K ){.      if( (
27740 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b  allShared & mask
27750 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
27760 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
27770 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
27780 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  RDLCK, ofst+UNIX
27790 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
277a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
277b0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
277c0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
277d0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68  }..    /* Get th
277e0 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c  e local shared l
277f0 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
27800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27810 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
27820 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
27830 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
27840 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f   /* Make sure no
27850 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
27860 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20  ions hold locks 
27870 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20  that will block 
27880 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b  this.    ** lock
27890 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65  .  If any do, re
278a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
278b0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20   right away..   
278c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
278d0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
278e0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
278f0 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
27900 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
27910 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73  sk)!=0 || (pX->s
27920 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
27930 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
27940 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
27950 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
27960 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27970 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65   .    /* Get the
27980 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
27990 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
279a0 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73  evel.  Then if s
279b0 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a  uccessful.    **
279c0 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c   also mark the l
279d0 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ocal connection 
279e0 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e  as being locked.
279f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27a10 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
27a20 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
27a30 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66  bFd, F_WRLCK, of
27a40 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
27a50 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , n);.      if( 
27a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27a70 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
27a80 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20   (p->sharedMask 
27a90 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20  & mask)==0 );.  
27aa0 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
27ab0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
27ac0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
27ad0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
27ae0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
27af0 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  ex);.  OSTRACE((
27b00 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d  "SHM-LOCK shmid-
27b10 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25  %d, pid-%d got %
27b20 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
27b30 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f          p->id, o
27b40 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73  sGetpid(0), p->s
27b50 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78  haredMask, p->ex
27b60 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75  clMask));.  retu
27b70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
27b80 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f  Implement a memo
27b90 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65  ry barrier or me
27ba0 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68  mory fence on sh
27bb0 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a  ared memory.  .*
27bc0 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61  *.** All loads a
27bd0 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20  nd stores begun 
27be0 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69  before the barri
27bf0 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65  er must complete
27c00 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c   before.** any l
27c10 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67  oad or store beg
27c20 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72  un after the bar
27c30 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rier..*/.static 
27c40 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72  void unixShmBarr
27c50 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ier(.  sqlite3_f
27c60 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20  ile *fd         
27c70 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
27c80 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
27c90 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
27ca0 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44  y */.){.  UNUSED
27cb0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
27cc0 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72 79 42    sqlite3MemoryB
27cd0 61 72 72 69 65 72 28 29 3b 20 20 20 20 20 20 20  arrier();       
27ce0 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d 64 65    /* compiler-de
27cf0 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62 61 72  fined memory bar
27d00 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78 45 6e  rier */.  unixEn
27d10 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20 20 20  terMutex();     
27d20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73            /* Als
27d30 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72 65 64  o mutex, for red
27d40 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75 6e 69  undancy */.  uni
27d50 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d  xLeaveMutex();.}
27d60 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
27d70 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73 68  connection to sh
27d80 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44 65  ared-memory.  De
27d90 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lete the underly
27da0 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65 20  ing .** storage 
27db0 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69 73  if deleteFlag is
27dc0 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
27dd0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68 61 72  there is no shar
27de0 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed memory associ
27df0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  ated with the co
27e00 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20 74 68  nnection then th
27e10 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
27e20 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f   a harmless no-o
27e30 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
27e40 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28 0a 20   unixShmUnmap(. 
27e50 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
27e60 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
27e70 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
27e80 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27e90 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
27ea0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
27eb0 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20        /* Delete 
27ec0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 69 66  shared-memory if
27ed0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
27ee0 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20 20 20  ixShm *p;       
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f00 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
27f10 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a 2f 0a  to be closed */.
27f20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
27f30 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
27f40 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
27f50 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
27f60 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  y file */.  unix
27f70 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20 20 20  Shm **pp;       
27f80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27f90 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
27fa0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
27fb0 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ons */.  unixFil
27fc0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
27fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
27fe0 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
27ff0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 70  ase file */..  p
28000 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
28010 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44 62 46  *)fd;.  p = pDbF
28020 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28 20 70  d->pShm;.  if( p
28030 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
28040 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d 4e 6f  ITE_OK;.  pShmNo
28050 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
28060 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  ;..  assert( pSh
28070 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  mNode==pDbFd->pI
28080 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29  node->pShmNode )
28090 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
280a0 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
280b0 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 0a  bFd->pInode );..
280c0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e    /* Remove conn
280d0 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68  ection p from th
280e0 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74  e set of connect
280f0 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 0a  ions associated.
28100 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d 4e 6f    ** with pShmNo
28110 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
28120 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
28130 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
28140 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f 64 65  for(pp=&pShmNode
28150 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
28160 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
28170 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
28180 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
28190 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
281a0 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
281b0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
281c0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
281d0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
281e0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
281f0 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49  >mutex);..  /* I
28200 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  f pShmNode->nRef
28210 20 68 61 73 20 72 65 61 63 68 65 64 20 30 2c 20   has reached 0, 
28220 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65 20 75  then close the u
28230 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a 20 73  nderlying.  ** s
28240 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
28250 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e 69 78  e, too */.  unix
28260 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
28270 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
28280 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 53  ->nRef>0 );.  pS
28290 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  hmNode->nRef--;.
282a0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
282b0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
282c0 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 26 26  f( deleteFlag &&
282d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
282e0 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e  ){.      osUnlin
282f0 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  k(pShmNode->zFil
28300 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  ename);.    }.  
28310 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70    unixShmPurge(p
28320 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69  DbFd);.  }.  uni
28330 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
28340 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
28350 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a 23 20  OK;.}...#else.# 
28360 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4d 61  define unixShmMa
28370 70 20 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  p     0.# define
28380 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20 20 20   unixShmLock    
28390 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
283a0 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20 64 65  hmBarrier 0.# de
283b0 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e 6d 61  fine unixShmUnma
283c0 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f 2a 20  p   0.#endif /* 
283d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
283e0 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69 66 20  MIT_WAL */..#if 
283f0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
28400 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20  SIZE>0./*.** If 
28410 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
28420 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c 20 75  memory mapped, u
28430 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e 0a 2a  nmap file pFd..*
28440 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
28450 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
28460 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73  File *pFd){.  as
28470 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
28480 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28  hOut==0 );.  if(
28490 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
284a0 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d 61 70   ){.    osMunmap
284b0 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  (pFd->pMapRegion
284c0 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  , pFd->mmapSizeA
284d0 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46 64 2d  ctual);.    pFd-
284e0 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 30 3b  >pMapRegion = 0;
284f0 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69  .    pFd->mmapSi
28500 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  ze = 0;.    pFd-
28510 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20  >mmapSizeActual 
28520 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
28530 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
28540 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
28550 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
28560 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20 66 69  maintained by fi
28570 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
28580 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20 62 79  r pFd to nNew by
28590 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74 69 6e  tes. Any existin
285a0 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64 69 73  g mapping is dis
285b0 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  carded..**.** If
285c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 69   successful, thi
285d0 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20  s function sets 
285e0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
285f0 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  riables:.**.**  
28600 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 70 4d       unixFile.pM
28610 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20 20 20  apRegion.**     
28620 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
28630 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69  ize.**       uni
28640 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 41 63  xFile.mmapSizeAc
28650 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e  tual.**.** If un
28660 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20 65  successful, an e
28670 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
28680 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c 69 74  logged via sqlit
28690 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a 2a 20  e3_log() and.** 
286a0 74 68 65 20 74 68 72 65 65 20 76 61 72 69 61 62  the three variab
286b0 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20 7a 65  les above are ze
286c0 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  roed. In this ca
286d0 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75 6c 64  se SQLite should
286e0 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61 63 63  .** continue acc
286f0 65 73 73 69 6e 67 20 74 68 65 20 64 61 74 61 62  essing the datab
28700 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 78 52  ase using the xR
28710 65 61 64 28 29 20 61 6e 64 20 78 57 72 69 74 65  ead() and xWrite
28720 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a  ().** methods..*
28730 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
28740 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20 20 75  ixRemapfile(.  u
28750 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 20 20  nixFile *pFd,   
28760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28770 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
28780 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
28790 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20 20 20  4 nNew          
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
287b0 20 52 65 71 75 69 72 65 64 20 6d 61 70 70 69 6e   Required mappin
287c0 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63  g size */.){.  c
287d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
287e0 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e 74 20  = "mmap";.  int 
287f0 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20 20 20  h = pFd->h;     
28800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28810 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
28820 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62 20 66  tor open on db f
28830 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70 4f 72  ile */.  u8 *pOr
28840 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64 2d 3e  ig = (u8 *)pFd->
28850 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20 2f 2a  pMapRegion;   /*
28860 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 72 72   Pointer to curr
28870 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69 6e 67  ent file mapping
28880 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69 67 20   */.  i64 nOrig 
28890 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  = pFd->mmapSizeA
288a0 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20 53 69  ctual;     /* Si
288b0 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65 67 69  ze of pOrig regi
288c0 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  on in bytes */. 
288d0 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b 20 20   u8 *pNew = 0;  
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288f0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74 69 6f        /* Locatio
28900 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69 6e 67  n of new mapping
28910 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20   */.  int flags 
28920 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20 20 20  = PROT_READ;    
28930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
28940 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6d  ags to pass to m
28950 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73 73 65  map() */..  asse
28960 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
28970 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ut==0 );.  asser
28980 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61  t( nNew>pFd->mma
28990 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72  pSize );.  asser
289a0 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d  t( nNew<=pFd->mm
289b0 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20 20 61  apSizeMax );.  a
289c0 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b  ssert( nNew>0 );
289d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
289e0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3e 3d  mmapSizeActual>=
289f0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b  pFd->mmapSize );
28a00 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50 5f 46  .  assert( MAP_F
28a10 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 23 69 66  AILED!=0 );..#if
28a20 64 65 66 20 53 51 4c 49 54 45 5f 4d 4d 41 50 5f  def SQLITE_MMAP_
28a30 52 45 41 44 57 52 49 54 45 0a 20 20 69 66 28 20  READWRITE.  if( 
28a40 28 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20  (pFd->ctrlFlags 
28a50 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c  & UNIXFILE_RDONL
28a60 59 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d  Y)==0 ) flags |=
28a70 20 50 52 4f 54 5f 57 52 49 54 45 3b 0a 23 65 6e   PROT_WRITE;.#en
28a80 64 69 66 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  dif..  if( pOrig
28a90 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   ){.#if HAVE_MRE
28aa0 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75  MAP.    i64 nReu
28ab0 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  se = pFd->mmapSi
28ac0 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f  ze;.#else.    co
28ad0 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67  nst int szSyspag
28ae0 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  e = osGetpagesiz
28af0 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65  e();.    i64 nRe
28b00 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70  use = (pFd->mmap
28b10 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61  Size & ~(szSyspa
28b20 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ge-1));.#endif. 
28b30 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
28b40 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
28b50 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
28b60 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
28b70 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
28b80 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
28b90 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
28ba0 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
28bb0 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
28bc0 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
28bd0 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
28be0 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
28bf0 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
28c00 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
28c10 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
28c20 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
28c30 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
28c40 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
28c50 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
28c60 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
28c70 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
28c80 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
28c90 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
28ca0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
28cb0 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
28cc0 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
28cd0 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
28ce0 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
28cf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28d00 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
28d10 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
28d20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
28d30 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
28d40 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
28d50 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
28d60 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
28d70 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
28d80 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
28d90 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
28da0 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
28db0 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
28dc0 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
28dd0 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
28de0 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
28df0 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
28e00 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
28e10 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
28e20 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
28e30 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
28e40 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
28e50 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
28e60 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
28e70 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
28e80 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
28e90 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
28ea0 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
28eb0 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
28ec0 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
28ed0 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
28ee0 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
28ef0 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
28f00 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
28f10 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
28f20 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
28f30 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
28f40 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
28f50 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
28f60 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
28f70 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
28f80 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
28f90 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
28fa0 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
28fb0 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
28fc0 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
28fd0 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
28fe0 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
28ff0 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
29000 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
29010 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
29020 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
29030 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
29040 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
29050 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
29060 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
29070 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
29080 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
29090 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
290a0 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
290b0 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
290c0 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
290d0 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
290e0 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
290f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
29100 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
29110 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
29120 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
29130 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
29140 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
29150 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
29160 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
29170 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
29180 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
29190 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
291a0 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
291b0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
291c0 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
291d0 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
291e0 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
291f0 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
29200 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
29210 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
29220 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
29230 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
29240 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
29250 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
29260 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
29270 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
29280 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
29290 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
292a0 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
292b0 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
292c0 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
292d0 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
292e0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
292f0 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
29300 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
29310 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
29320 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
29330 20 6e 4d 61 70 29 7b 0a 20 20 61 73 73 65 72 74   nMap){.  assert
29340 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
29350 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
29360 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ;.  assert( nMap
29370 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61 70  >0 || (pFd->mmap
29380 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d 3e  Size==0 && pFd->
29390 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20 29  pMapRegion==0) )
293a0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
293b0 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
293c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
293d0 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
293e0 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
293f0 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
29400 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
29410 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
29420 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74  .    if( osFstat
29430 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
29440 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
29450 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
29460 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20  FSTAT;.    }.   
29470 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e   nMap = statbuf.
29480 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  st_size;.  }.  i
29490 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61  f( nMap>pFd->mma
294a0 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20  pSizeMax ){.    
294b0 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  nMap = pFd->mmap
294c0 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20  SizeMax;.  }..  
294d0 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 30 20 7c  assert( nMap>0 |
294e0 7c 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  | (pFd->mmapSize
294f0 3d 3d 30 20 26 26 20 70 46 64 2d 3e 70 4d 61 70  ==0 && pFd->pMap
29500 52 65 67 69 6f 6e 3d 3d 30 29 20 29 3b 0a 20 20  Region==0) );.  
29510 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
29520 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 75  mapSize ){.    u
29530 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64  nixRemapfile(pFd
29540 2c 20 6e 4d 61 70 29 3b 0a 20 20 7d 0a 0a 20 20  , nMap);.  }..  
29550 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
29560 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
29570 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
29580 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ZE>0 */../*.** I
29590 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75  f possible, retu
295a0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
295b0 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  a mapping of fil
295c0 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74  e fd starting at
295d0 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e   offset.** iOff.
295e0 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73   The mapping mus
295f0 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61  t be valid for a
29600 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74  t least nAmt byt
29610 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  es..**.** If suc
29620 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20  h a pointer can 
29630 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f  be obtained, sto
29640 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64  re it in *pp and
29650 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29660 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65  K..** Or, if one
29670 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65   cannot but no e
29680 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
29690 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65   *pp to 0 and re
296a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
296b0 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61  ** Finally, if a
296c0 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63  n error does occ
296d0 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51  ur, return an SQ
296e0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
296f0 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61   The final.** va
29700 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e  lue of *pp is un
29710 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
29720 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
29730 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
29740 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
29750 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d  er, the caller m
29760 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a  ust eventually .
29770 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72  ** release the r
29780 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c  eference by call
29790 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28  ing unixUnfetch(
297a0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
297b0 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74   unixFetch(sqlit
297c0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
297d0 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c   iOff, int nAmt,
297e0 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66   void **pp){.#if
297f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
29800 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69  _SIZE>0.  unixFi
29810 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46  le *pFd = (unixF
29820 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54  ile *)fd;   /* T
29830 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
29840 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
29850 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b  endif.  *pp = 0;
29860 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
29870 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
29880 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  f( pFd->mmapSize
29890 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28  Max>0 ){.    if(
298a0 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
298b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
298c0 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
298d0 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20  e(pFd, -1);.    
298e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
298f0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
29900 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
29910 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20  Fd->mmapSize >= 
29920 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20  iOff+nAmt ){.   
29930 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a     *pp = &((u8 *
29940 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
29950 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70  )[iOff];.      p
29960 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b  Fd->nFetchOut++;
29970 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
29980 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
29990 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
299a0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
299b0 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c  ment is non-NULL
299c0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
299d0 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20  tion releases a 
299e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62  .** reference ob
299f0 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72  tained by an ear
29a00 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69  lier call to uni
29a10 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65  xFetch(). The se
29a20 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  cond.** argument
29a30 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
29a40 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  function must be
29a50 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
29a60 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a   corresponding.*
29a70 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20  * argument that 
29a80 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68  was passed to th
29a90 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e  e unixFetch() in
29aa0 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  vocation. .**.**
29ab0 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72   Or, if the thir
29ac0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55  d argument is NU
29ad0 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  LL, then this fu
29ae0 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
29af0 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e  called .** to in
29b00 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79  form the VFS lay
29b10 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69  er that, accordi
29b20 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79  ng to POSIX, any
29b30 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
29b40 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65  g .** may now be
29b50 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f   invalid and sho
29b60 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e  uld be unmapped.
29b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
29b80 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74  nixUnfetch(sqlit
29b90 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
29ba0 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b   iOff, void *p){
29bb0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
29bc0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e  MMAP_SIZE>0.  un
29bd0 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75  ixFile *pFd = (u
29be0 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20  nixFile *)fd;   
29bf0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
29c00 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
29c10 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  */.  UNUSED_PARA
29c20 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20  METER(iOff);..  
29c30 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61  /* If p==0 (unma
29c40 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c  p the entire fil
29c50 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  e) then there mu
29c60 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e  st be no outstan
29c70 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63  ding .  ** xFetc
29c80 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72  h references. Or
29c90 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69  , if p!=0 (meani
29ca0 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74  ng it is an xFet
29cb0 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20  ch reference),. 
29cc0 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d   ** then there m
29cd0 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
29ce0 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e  one outstanding.
29cf0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
29d00 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65  p==0)==(pFd->nFe
29d10 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20  tchOut==0) );.. 
29d20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20   /* If p!=0, it 
29d30 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69  must match the i
29d40 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20  Off value. */.  
29d50 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20  assert( p==0 || 
29d60 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e  p==&((u8 *)pFd->
29d70 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
29d80 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b  ] );..  if( p ){
29d90 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68  .    pFd->nFetch
29da0 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Out--;.  }else{.
29db0 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
29dc0 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61  e(pFd);.  }..  a
29dd0 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
29de0 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73  chOut>=0 );.#els
29df0 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  e.  UNUSED_PARAM
29e00 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
29e10 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
29e20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
29e30 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69  TER(iOff);.#endi
29e40 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
29e50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48  E_OK;.}../*.** H
29e60 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70  ere ends the imp
29e70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  lementation of a
29e80 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ll sqlite3_file 
29e90 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  methods..**.****
29ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29eb0 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66  ** End sqlite3_f
29ec0 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a  ile Methods ****
29ed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
29ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
29f40 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e  ** This division
29f50 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
29f60 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
29f70 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29f80 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c  cts that.** impl
29f90 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69  ement various fi
29fa0 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74  le locking strat
29fb0 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20  egies.  It also 
29fc0 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
29fd0 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64  ions.** of "find
29fe0 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20  er" functions.  
29ff0 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  A finder-functio
2a000 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63  n is used to loc
2a010 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69  ate the appropri
2a020 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  ate.** sqlite3_i
2a030 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a040 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61   for a particula
2a050 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  r database file.
2a060 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a    The pAppData.*
2a070 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73  * field of the s
2a080 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f  qlite3_vfs VFS o
2a090 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69  bjects are initi
2a0a0 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69  alized to be poi
2a0b0 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20  nters to.** the 
2a0c0 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66  correct finder-f
2a0d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74  unction for that
2a0e0 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74   VFS..**.** Most
2a0f0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
2a100 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  s return a point
2a110 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71  er to a fixed sq
2a120 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a130 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65  .** object.  The
2a140 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e   only interestin
2a150 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  g finder-functio
2a160 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  n is autolockIoF
2a170 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20  inder, which.** 
2a180 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c  looks at the fil
2a190 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64  esystem type and
2a1a0 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20   tries to guess 
2a1b0 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
2a1c0 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f  .** strategy fro
2a1d0 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  m that..**.** Fo
2a1e0 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  r finder-functio
2a1f0 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73  n F, two objects
2a200 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a   are created:.**
2a210 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72  .**    (1) The r
2a220 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  eal finder-funct
2a230 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74  ion named "FImpt
2a240 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ()"..**.**    (2
2a250 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69  ) A constant poi
2a260 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e  nter to this fun
2a270 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74  ction named just
2a280 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41   "F"..**.**.** A
2a290 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2a2a0 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65  F pointer is use
2a2b0 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74  d as the pAppDat
2a2c0 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a  a value for VFS.
2a2d0 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20  ** objects.  We 
2a2e0 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20  have to do this 
2a2f0 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
2a300 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e  ng pAppData poin
2a310 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74  t.** directly at
2a320 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63   the finder-func
2a330 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72  tion since C90 r
2a340 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76  ules prevent a v
2a350 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20  oid*.** from be 
2a360 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63  cast into a func
2a370 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a  tion pointer..**
2a380 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74  .**.** Each inst
2a390 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63  ance of this mac
2a3a0 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f  ro generates two
2a3b0 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20   objects:.**.** 
2a3c0 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20    *  A constant 
2a3d0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a3e0 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d  ds object call M
2a3f0 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c  ETHOD that has l
2a400 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d  ocking.**      m
2a410 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f  ethods CLOSE, LO
2a420 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45  CK, UNLOCK, CKRE
2a430 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  SLOCK..**.**   *
2a440 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20    An I/O method 
2a450 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  finder function 
2a460 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68  called FINDER th
2a470 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  at returns a poi
2a480 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20  nter.**      to 
2a490 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63  the METHOD objec
2a4a0 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  t in the previou
2a4b0 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65  s bullet..*/.#de
2a4c0 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46  fine IOMETHODS(F
2a4d0 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52  INDER,METHOD,VER
2a4e0 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c  SION,CLOSE,LOCK,
2a4f0 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48  UNLOCK,CKLOCK,SH
2a500 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61 74  MMAP)     \.stat
2a510 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
2a520 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48  _io_methods METH
2a530 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20 20  OD = {          
2a540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a550 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56 45           \.   VE
2a560 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20 20  RSION,          
2a570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65            /* iVe
2a580 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20  rsion */        
2a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5a0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f          \.   CLO
2a5b0 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SE,             
2a5c0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2a5d0 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  se */           
2a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5f0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2a600 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20  Read,           
2a610 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61 64          /* xRead
2a620 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a640 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 57        \.   unixW
2a650 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  rite,           
2a660 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
2a670 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a690 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54 72       \.   unixTr
2a6a0 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
2a6b0 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61        /* xTrunca
2a6c0 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
2a6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6e0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e      \.   unixSyn
2a6f0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2a700 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f       /* xSync */
2a710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a730 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65     \.   unixFile
2a740 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
2a750 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65      /* xFileSize
2a760 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
2a770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a780 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20    \.   LOCK,    
2a790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7a0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20     /* xLock */  
2a7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7d0 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20   \.   UNLOCK,   
2a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7f0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20    /* xUnlock */ 
2a800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20  \.   CKLOCK,    
2a830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a840 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a850 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  edLock */       
2a860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
2a870 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  .   unixFileCont
2a880 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rol,            
2a890 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
2a8a0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
2a8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
2a8c0 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a     unixSectorSiz
2a8d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
2a8e0 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f  * xSectorSize */
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a900 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
2a910 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72    unixDeviceChar
2a920 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f 2a  acteristics,  /*
2a930 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c 69   xDeviceCapabili
2a940 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20 20  ties */         
2a950 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
2a960 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20 20   SHMMAP,        
2a970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a980 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20  xShmMap */      
2a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9a0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
2a9b0 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20  unixShmLock,    
2a9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2a9d0 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  ShmLock */      
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9f0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
2aa00 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20 20  nixShmBarrier,  
2aa10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
2aa20 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20 20  hmBarrier */    
2aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa40 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
2aa50 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20  ixShmUnmap,     
2aa60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2aa70 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20 20  mUnmap */       
2aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa90 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
2aaa0 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20 20  xFetch,         
2aab0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65 74           /* xFet
2aac0 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ch */           
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aae0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
2aaf0 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20 20  Unfetch,        
2ab00 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65          /* xUnfe
2ab10 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20        \.};      
2ab40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab80 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f       \.static co
2ab90 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
2aba0 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23 23  ethods *FINDER##
2abb0 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  Impl(const char 
2abc0 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70 29  *z, unixFile *p)
2abd0 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50  {   \.  UNUSED_P
2abe0 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55  ARAMETER(z); UNU
2abf0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
2ac00 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d     \.  return &M
2ac30 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20 20  ETHOD;          
2ac40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20 20    \.}           
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acc0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
2acd0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2ace0 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44  ds *(*const FIND
2acf0 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  ER)(const char*,
2ad00 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20 20  unixFile *p)    
2ad10 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23 23  \.    = FINDER##
2ad20 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72  Impl;../*.** Her
2ad30 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68 65  e are all of the
2ad40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2ad50 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ods objects for 
2ad60 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  each of the.** l
2ad70 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65  ocking strategie
2ad80 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74 68  s.  Functions th
2ad90 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65  at return pointe
2ada0 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74 68  rs to these meth
2adb0 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20  ods.** are also 
2adc0 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45  created..*/.IOME
2add0 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49 6f  THODS(.  posixIo
2ade0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
2adf0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
2ae00 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
2ae10 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20  posixIoMethods, 
2ae20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2ae30 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2ae40 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2ae50 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   3,             
2ae60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
2ae70 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20  ared memory and 
2ae80 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65 64  mmap are enabled
2ae90 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c   */.  unixClose,
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aeb0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2aec0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
2aed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aee0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2aef0 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c  */.  unixUnlock,
2af00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2af10 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2af20 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
2af30 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2af40 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2af50 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2af60 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20    unixShmMap    
2af70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2af80 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2af90 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  .).IOMETHODS(.  
2afa0 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  nolockIoFinder, 
2afb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2afc0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
2afd0 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d  e */.  nolockIoM
2afe0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2aff0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
2b000 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
2b010 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20  me */.  3,      
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
2b040 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
2b050 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c  /.  nolockClose,
2b060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b070 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
2b080 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20  /.  nolockLock, 
2b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b0a0 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f   xLock method */
2b0b0 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  .  nolockUnlock,
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0d0 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
2b0e0 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  /.  nolockCheckR
2b0f0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a  eservedLock,  /*
2b100 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
2b110 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b120 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
2b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
2b140 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  mMap method */.)
2b150 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64 6f  .IOMETHODS(.  do
2b160 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20  tlockIoFinder,  
2b170 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b180 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b190 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65  */.  dotlockIoMe
2b1a0 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 2f  thods,         /
2b1b0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2b1c0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2b1d0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2b200 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2b210 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20    dotlockClose, 
2b220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b230 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b240 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20    dotlockLock,  
2b250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b260 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b270 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20   dotlockUnlock, 
2b280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b290 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2b2a0 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65    dotlockCheckRe
2b2b0 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78  servedLock, /* x
2b2c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b2d0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2f0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b300 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a  ap method */.)..
2b310 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2b320 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b330 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
2b340 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
2b350 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
2b360 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
2b370 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
2b380 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
2b390 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2b3a0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
2b3b0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b3d0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
2b3e0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
2b3f0 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
2b400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
2b410 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
2b420 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
2b430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
2b440 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2b450 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
2b460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2b470 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2b480 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
2b490 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43  vedLock,   /* xC
2b4a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
2b4b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
2b4e0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
2b4f0 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
2b500 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
2b510 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
2b520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b530 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
2b540 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
2b550 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
2b560 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
2b570 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
2b580 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
2b590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5a0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
2b5b0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
2b5c0 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65 2c   */.  semXClose,
2b5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b5e0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
2b5f0 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c 20   */.  semXLock, 
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b610 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
2b620 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c  */.  semXUnlock,
2b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b640 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
2b650 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b 52   */.  semXCheckR
2b660 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2b670 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
2b680 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
2b690 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2b6a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b6b0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
2b6c0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
2b6d0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
2b6e0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
2b6f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
2b700 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66  .IOMETHODS(.  af
2b710 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  pIoFinder,      
2b720 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
2b730 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
2b740 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64  */.  afpIoMethod
2b750 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
2b760 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
2b770 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
2b780 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
2b790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b7a0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
2b7b0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
2b7c0 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
2b7d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b7e0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
2b7f0 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
2b800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
2b810 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
2b820 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
2b830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
2b840 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
2b850 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
2b860 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
2b870 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2b880 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2b890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b8a0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
2b8b0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
2b8c0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2b8d0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
2b8e0 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
2b8f0 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
2b900 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
2b910 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
2b920 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
2b930 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
2b940 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
2b950 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
2b960 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
2b970 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
2b980 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
2b990 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
2b9a0 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
2b9b0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
2b9c0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
2b9d0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
2b9e0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
2b9f0 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
2ba00 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
2ba10 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
2ba20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
2ba30 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
2ba40 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
2ba50 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
2ba60 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
2ba70 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
2ba80 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
2ba90 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
2baa0 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
2bab0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
2bac0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
2bad0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2bae0 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
2baf0 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
2bb00 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
2bb10 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
2bb20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
2bb30 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
2bb40 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
2bb50 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
2bb60 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
2bb70 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
2bb80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
2bb90 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
2bba0 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
2bbb0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
2bbc0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
2bbd0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
2bbe0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
2bbf0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
2bc00 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
2bc10 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
2bc20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bc30 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
2bc40 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
2bc50 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79  abled */.  proxy
2bc60 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
2bc70 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
2bc80 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2bc90 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
2bca0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2bcb0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55  thod */.  proxyU
2bcc0 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
2bcd0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
2bce0 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
2bcf0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2bd00 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  k,   /* xCheckRe
2bd10 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
2bd20 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
2bd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd40 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
2bd50 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
2bd60 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
2bd70 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
2bd80 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
2bd90 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
2bda0 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
2bdb0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
2bdc0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
2bdd0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
2bde0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
2bdf0 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
2be00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be10 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
2be20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
2be30 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2be40 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
2be50 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
2be60 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
2be70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be80 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
2be90 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
2bea0 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f  led */.  unixClo
2beb0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
2bec0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
2bed0 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f  thod */.  unixLo
2bee0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
2bef0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
2bf00 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c  thod */.  nfsUnl
2bf10 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
2bf20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
2bf30 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
2bf40 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2bf50 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b  k,     /* xCheck
2bf60 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
2bf70 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
2bf80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf90 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
2bfa0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
2bfb0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  f..#if defined(_
2bfc0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2bfd0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2bfe0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
2bff0 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
2c000 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
2c010 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
2c020 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
2c030 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
2c040 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c050 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
2c060 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
2c070 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
2c080 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
2c090 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
2c0a0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
2c0b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
2c0c0 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a  MacOSX only..*/.
2c0d0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
2c0e0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2c0f0 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65  *autolockIoFinde
2c100 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63  rImpl(.  const c
2c110 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20  har *filePath,  
2c120 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65    /* name of the
2c130 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2c140 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  /.  unixFile *pN
2c150 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew           /* 
2c160 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
2c170 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2c180 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73  e file */.){.  s
2c190 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2c1a0 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20  ct Mapping {.   
2c1b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2c1c0 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20  lesystem;       
2c1d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79         /* Filesy
2c1e0 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a  stem type name *
2c1f0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69  /.    const sqli
2c200 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
2c210 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41  pMethods;   /* A
2c220 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
2c230 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d  ng method */.  }
2c240 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20   aMap[] = {.    
2c250 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73  { "hfs",    &pos
2c260 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  ixIoMethods },. 
2c270 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26     { "ufs",    &
2c280 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
2c290 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c  ,.    { "afpfs",
2c2a0 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
2c2b0 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22  },.    { "smbfs"
2c2c0 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2c2d0 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61   },.    { "webda
2c2e0 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  v", &nolockIoMet
2c2f0 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c  hods },.    { 0,
2c300 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
2c310 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  i;.  struct stat
2c320 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72  fs fsInfo;.  str
2c330 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e  uct flock lockIn
2c340 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65  fo;..  if( !file
2c350 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Path ){.    /* I
2c360 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c  f filePath==NULL
2c370 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61   that means we a
2c380 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
2c390 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  a transient file
2c3a0 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65  .    ** that doe
2c3b0 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
2c3c0 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20   locked. */.    
2c3d0 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f  return &nolockIo
2c3e0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69  Methods;.  }.  i
2c3f0 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61  f( statfs(filePa
2c400 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20  th, &fsInfo) != 
2c410 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73  -1 ){.    if( fs
2c420 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d  Info.f_flags & M
2c430 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  NT_RDONLY ){.   
2c440 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2c450 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  kIoMethods;.    
2c460 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61  }.    for(i=0; a
2c470 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
2c480 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  em; i++){.      
2c490 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66  if( strcmp(fsInf
2c4a0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
2c4b0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2c4c0 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tem)==0 ){.     
2c4d0 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69     return aMap[i
2c4e0 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  ].pMethods;.    
2c4f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
2c500 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65   /* Default case
2c510 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67  . Handles, among
2c520 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22  st others, "nfs"
2c530 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65  ..  ** Test byte
2c540 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e  -range lock usin
2c550 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68  g fcntl(). If th
2c560 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c  e call succeeds,
2c570 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68   .  ** assume th
2c580 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  at the file-syst
2c590 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49  em supports POSI
2c5a0 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a  X style locks. .
2c5b0 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e    */.  lockInfo.
2c5c0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63  l_len = 1;.  loc
2c5d0 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20  kInfo.l_start = 
2c5e0 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  0;.  lockInfo.l_
2c5f0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
2c600 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  T;.  lockInfo.l_
2c610 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a  type = F_RDLCK;.
2c620 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e    if( osFcntl(pN
2c630 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  ew->h, F_GETLK, 
2c640 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29  &lockInfo)!=-1 )
2c650 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d   {.    if( strcm
2c660 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70  p(fsInfo.f_fstyp
2c670 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30  ename, "nfs")==0
2c680 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2c690 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a   &nfsIoMethods;.
2c6a0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2c6b0 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78     return &posix
2c6c0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
2c6d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
2c6e0 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d  turn &dotlockIoM
2c6f0 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2c700 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2c710 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2c720 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f   *(*const autolo
2c730 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ckIoFinder)(cons
2c740 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2c750 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  *) = autolockIoF
2c760 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64  inderImpl;..#end
2c770 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
2c780 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2c790 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2c7a0 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20  G_STYLE */..#if 
2c7b0 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a  OS_VXWORKS./*.**
2c7c0 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
2c7d0 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57 6f  unction for VxWo
2c7e0 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73 65  rks checks to se
2c7f0 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69 73  e if posix advis
2c800 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 77  ory.** locking w
2c810 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f 65  orks.  If it doe
2c820 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20  s, then that is 
2c830 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20 49  what is used.  I
2c840 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  f it does not.**
2c850 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c 6c   work, then fall
2c860 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73 65  back to named se
2c870 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 2e  maphore locking.
2c880 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
2c890 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2c8a0 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46 69  ods *vxworksIoFi
2c8b0 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
2c8c0 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
2c8d0 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
2c8e0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c8f0 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
2c900 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
2c910 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  /* the open file
2c920 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
2c930 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
2c940 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
2c950 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
2c960 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
2c970 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
2c980 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2c990 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
2c9a0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
2c9b0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
2c9c0 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
2c9d0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
2c9e0 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
2c9f0 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63  .  /* Test if fc
2ca00 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74  ntl() is support
2ca10 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58  ed and use POSIX
2ca20 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20   style locks..  
2ca30 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c  ** Otherwise fal
2ca40 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61  l back to the na
2ca50 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65  med semaphore me
2ca60 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63  thod..  */.  loc
2ca70 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b  kInfo.l_len = 1;
2ca80 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74  .  lockInfo.l_st
2ca90 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49  art = 0;.  lockI
2caa0 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  nfo.l_whence = S
2cab0 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49  EEK_SET;.  lockI
2cac0 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  nfo.l_type = F_R
2cad0 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63  DLCK;.  if( osFc
2cae0 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
2caf0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
2cb00 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74  !=-1 ) {.    ret
2cb10 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
2cb20 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
2cb30 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d    return &semIoM
2cb40 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74  ethods;.  }.}.st
2cb50 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
2cb60 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20  e3_io_methods . 
2cb70 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72 6b   *(*const vxwork
2cb80 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  sIoFinder)(const
2cb90 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
2cba0 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e  ) = vxworksIoFin
2cbb0 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
2cbc0 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
2cbd0 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74  /../*.** An abst
2cbe0 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20  ract type for a 
2cbf0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f  pointer to an IO
2cc00 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66   method finder f
2cc10 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65  unction:.*/.type
2cc20 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  def const sqlite
2cc30 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
2cc40 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e  finder_type)(con
2cc50 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2cc60 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  e*);.../********
2cc70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cc90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ccb0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2ccc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ccd0 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65  * sqlite3_vfs me
2cce0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
2ccf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2cd00 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69  **.**.** This di
2cd10 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
2cd20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
2cd30 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e  on of methods on
2cd40 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f   the.** sqlite3_
2cd50 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a  vfs object..*/..
2cd60 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
2cd70 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
2cd80 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74   the unixFile st
2cd90 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20  ructure pointed 
2cda0 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74  to by pId..*/.st
2cdb0 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55  atic int fillInU
2cdc0 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74  nixFile(.  sqlit
2cdd0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
2cde0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2cdf0 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20   vfs object */. 
2ce00 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
2ce10 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2ce20 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ce30 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f   of file being o
2ce40 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  pened */.  sqlit
2ce50 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20  e3_file *pId,   
2ce60 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
2ce70 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
2ce80 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20  cture here */.  
2ce90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2cea0 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20  ename,  /* Name 
2ceb0 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e  of the file bein
2cec0 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
2ced0 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20  t ctrlFlags     
2cee0 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72        /* Zero or
2cef0 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a   more UNIXFILE_*
2cf00 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20   values */.){.  
2cf10 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2cf20 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69  _methods *pLocki
2cf30 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46  ngStyle;.  unixF
2cf40 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69  ile *pNew = (uni
2cf50 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69  xFile *)pId;.  i
2cf60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2cf70 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e  K;..  assert( pN
2cf80 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c  ew->pInode==NULL
2cf90 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63   );..  /* No loc
2cfa0 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74  king occurs in t
2cfb0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a  emporary files *
2cfc0 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  /.  assert( zFil
2cfd0 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72  ename!=0 || (ctr
2cfe0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2cff0 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a  E_NOLOCK)!=0 );.
2d000 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
2d010 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
2d020 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b   h, zFilename));
2d030 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a  .  pNew->h = h;.
2d040 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70    pNew->pVfs = p
2d050 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61  Vfs;.  pNew->zPa
2d060 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
2d070 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
2d080 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67  s = (u8)ctrlFlag
2d090 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  s;.#if SQLITE_MA
2d0a0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
2d0b0 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  pNew->mmapSizeMa
2d0c0 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  x = sqlite3Globa
2d0d0 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a  lConfig.szMmap;.
2d0e0 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
2d0f0 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
2d100 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55  (((ctrlFlags & U
2d110 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a  NIXFILE_URI) ? z
2d120 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20  Filename : 0),. 
2d130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d140 20 20 20 20 20 20 20 20 20 20 22 70 73 6f 77 22            "psow"
2d150 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41  , SQLITE_POWERSA
2d160 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b  FE_OVERWRITE) ){
2d170 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  .    pNew->ctrlF
2d180 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2d190 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28  _PSOW;.  }.  if(
2d1a0 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e   strcmp(pVfs->zN
2d1b0 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29  ame,"unix-excl")
2d1c0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  ==0 ){.    pNew-
2d1d0 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
2d1e0 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d  IXFILE_EXCL;.  }
2d1f0 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
2d200 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76  .  pNew->pId = v
2d210 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
2d220 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69  (zFilename);.  i
2d230 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20  f( pNew->pId==0 
2d240 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73  ){.    ctrlFlags
2d250 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
2d260 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  OCK;.    rc = SQ
2d270 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
2d280 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
2d290 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55  f( ctrlFlags & U
2d2a0 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29  NIXFILE_NOLOCK )
2d2b0 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74  {.    pLockingSt
2d2c0 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  yle = &nolockIoM
2d2d0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
2d2e0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2d2f0 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f  le = (**(finder_
2d300 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70  type*)pVfs->pApp
2d310 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c  Data)(zFilename,
2d320 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49   pNew);.#if SQLI
2d330 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2d340 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43  G_STYLE.    /* C
2d350 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69  ache zFilename i
2d360 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f  n the locking co
2d370 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64  ntext (AFP and d
2d380 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29  otlock override)
2d390 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78   for.    ** prox
2d3a0 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e  yLock activation
2d3b0 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65   is possible (re
2d3c0 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61  mote proxy is ba
2d3d0 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a  sed on db name).
2d3e0 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65      ** zFilename
2d3f0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
2d400 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  ntil file is clo
2d410 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20  sed, to support 
2d420 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63  */.    pNew->loc
2d430 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76  kingContext = (v
2d440 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a  oid*)zFilename;.
2d450 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66  #endif.  }..  if
2d460 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  ( pLockingStyle 
2d470 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f  == &posixIoMetho
2d480 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ds.#if defined(_
2d490 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2d4a0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2d4b0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20  NG_STYLE.    || 
2d4c0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2d4d0 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23   &nfsIoMethods.#
2d4e0 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75  endif.  ){.    u
2d4f0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2d500 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
2d510 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2d520 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2d530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2d540 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
2d550 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
2d560 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  rred in findInod
2d570 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
2d580 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2d590 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
2d5a0 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
2d5b0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
2d5c0 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
2d5d0 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
2d5e0 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
2d5f0 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
2d600 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
2d610 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
2d620 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
2d630 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
2d640 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
2d650 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
2d660 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
2d670 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
2d680 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
2d690 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
2d6a0 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
2d6b0 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
2d6c0 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
2d6d0 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
2d6e0 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
2d6f0 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
2d700 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
2d710 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
2d720 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
2d730 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
2d740 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
2d750 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
2d760 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
2d770 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
2d780 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
2d790 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
2d7a0 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
2d7b0 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
2d7c0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
2d7d0 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
2d7e0 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
2d7f0 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
2d800 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
2d810 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
2d820 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
2d830 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
2d840 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
2d850 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
2d860 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
2d870 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
2d880 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
2d890 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
2d8a0 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
2d8b0 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
2d8c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
2d8d0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2d8e0 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2d8f0 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2d900 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
2d910 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
2d920 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
2d930 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
2d940 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2d950 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
2d960 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2d970 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
2d980 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
2d990 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2d9a0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2d9b0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
2d9c0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
2d9d0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
2d9e0 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
2d9f0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
2da00 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
2da10 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
2da20 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
2da30 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
2da40 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
2da50 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
2da60 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2da70 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
2da80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2da90 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20  * NB: zFilename 
2daa0 65 78 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69  exists and remai
2dab0 6e 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74  ns valid until t
2dac0 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65  he file is close
2dad0 64 0a 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72  d.      ** accor
2dae0 64 69 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d  ding to requirem
2daf0 65 6e 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20  ent F11141.  So 
2db00 77 65 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74  we do not need t
2db10 6f 20 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a  o make a.      *
2db20 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69  * copy of the fi
2db30 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  lename. */.     
2db40 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20   pCtx->dbPath = 
2db50 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
2db60 20 70 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20   pCtx->reserved 
2db70 3d 20 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64  = 0;.      srand
2db80 6f 6d 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75  omdev();.      u
2db90 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2dba0 0a 20 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64  .      rc = find
2dbb0 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20  InodeInfo(pNew, 
2dbc0 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a  &pNew->pInode);.
2dbd0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dbe0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dbf0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2dc00 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
2dc10 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72  text);.        r
2dc20 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
2dc30 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
2dc40 20 20 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a          h = -1;.
2dc50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e        }.      un
2dc60 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20  ixLeaveMutex(); 
2dc70 20 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20         .    }.  
2dc80 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65  }.#endif..  else
2dc90 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2dca0 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f  le == &dotlockIo
2dcb0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
2dcc0 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  * Dotfile lockin
2dcd0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
2dce0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
2dcf0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
2dd00 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f  in.    ** the do
2dd10 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74  tlockLockingCont
2dd20 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext .    */.    
2dd30 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b  char *zLockFile;
2dd40 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61  .    int nFilena
2dd50 6d 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  me;.    assert( 
2dd60 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a  zFilename!=0 );.
2dd70 20 20 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20      nFilename = 
2dd80 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c  (int)strlen(zFil
2dd90 65 6e 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20  ename) + 6;.    
2dda0 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
2ddb0 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
2ddc0 6f 63 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b  oc64(nFilename);
2ddd0 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69  .    if( zLockFi
2dde0 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  le==0 ){.      r
2ddf0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2de00 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  _BKPT;.    }else
2de10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2de20 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
2de30 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
2de40 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
2de50 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
2de60 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
2de70 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2de80 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
2de90 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2dea0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
2deb0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
2dec0 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
2ded0 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
2dee0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
2def0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2df00 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2df10 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
2df20 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
2df30 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
2df40 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
2df50 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
2df60 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
2df70 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
2df80 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
2df90 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
2dfa0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
2dfb0 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
2dfc0 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
2dfd0 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
2dfe0 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
2dff0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
2e000 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2e010 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
2e020 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
2e030 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e040 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
2e050 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
2e060 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
2e070 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
2e080 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
2e090 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
2e0a0 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
2e0b0 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
2e0c0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
2e0d0 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
2e0e0 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
2e0f0 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
2e100 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
2e110 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
2e120 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
2e130 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2e140 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  MEM_BKPT;.      
2e150 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2e160 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
2e170 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
2e180 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2e190 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2e1a0 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73  if.  .  storeLas
2e1b0 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b  tErrno(pNew, 0);
2e1c0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2e1d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e1e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2e1f0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2e200 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2e210 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d  NE__);.    h = -
2e220 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  1;.    osUnlink(
2e230 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2e240 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2e250 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
2e260 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  TE;.  }.#endif. 
2e270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2e280 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2e290 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2e2a0 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2e2b0 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
2e2c0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
2e2d0 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
2e2e0 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
2e2f0 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66  r(+1);.    verif
2e300 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20  yDbFile(pNew);. 
2e310 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2e320 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e330 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  the name of a di
2e340 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68  rectory in which
2e350 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72   to put temporar
2e360 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e  y files..** If n
2e370 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f  o suitable tempo
2e380 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74  rary file direct
2e390 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ory can be found
2e3a0 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
2e3b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2e3c0 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c  har *unixTempFil
2e3d0 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  eDir(void){.  st
2e3e0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2e3f0 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
2e400 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
2e410 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
2e420 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
2e430 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
2e440 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73    ".".  };.  uns
2e450 69 67 6e 65 64 20 69 6e 74 20 69 20 3d 20 30 3b  igned int i = 0;
2e460 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
2e470 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
2e480 20 2a 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33   *zDir = sqlite3
2e490 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
2e4a0 0a 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b  ..  if( !azDirs[
2e4b0 30 5d 20 29 20 61 7a 44 69 72 73 5b 30 5d 20 3d  0] ) azDirs[0] =
2e4c0 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
2e4d0 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28 20  TMPDIR");.  if( 
2e4e0 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44  !azDirs[1] ) azD
2e4f0 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
2e500 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 77 68 69  "TMPDIR");.  whi
2e510 6c 65 28 31 29 7b 0a 20 20 20 20 69 66 28 20 7a  le(1){.    if( z
2e520 44 69 72 21 3d 30 0a 20 20 20 20 20 26 26 20 6f  Dir!=0.     && o
2e530 73 53 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66  sStat(zDir, &buf
2e540 29 3d 3d 30 0a 20 20 20 20 20 26 26 20 53 5f 49  )==0.     && S_I
2e550 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
2e560 29 0a 20 20 20 20 20 26 26 20 6f 73 41 63 63 65  ).     && osAcce
2e570 73 73 28 7a 44 69 72 2c 20 30 33 29 3d 3d 30 0a  ss(zDir, 03)==0.
2e580 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
2e590 75 72 6e 20 7a 44 69 72 3b 0a 20 20 20 20 7d 0a  urn zDir;.    }.
2e5a0 20 20 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f      if( i>=sizeo
2e5b0 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66  f(azDirs)/sizeof
2e5c0 28 61 7a 44 69 72 73 5b 30 5d 29 20 29 20 62 72  (azDirs[0]) ) br
2e5d0 65 61 6b 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  eak;.    zDir = 
2e5e0 61 7a 44 69 72 73 5b 69 2b 2b 5d 3b 0a 20 20 7d  azDirs[i++];.  }
2e5f0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2e600 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74  /*.** Create a t
2e610 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61  emporary file na
2e620 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75  me in zBuf.  zBu
2e630 66 20 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61  f must be alloca
2e640 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61  ted.** by the ca
2e650 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e  lling process an
2e660 64 20 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e  d must be big en
2e670 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20  ough to hold at 
2e680 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d  least.** pVfs->m
2e690 78 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e  xPathname bytes.
2e6a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2e6b0 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69  nixGetTempname(i
2e6c0 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
2e6d0 42 75 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  Buf){.  const ch
2e6e0 61 72 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20  ar *zDir;.  int 
2e6f0 69 4c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f  iLimit = 0;..  /
2e700 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
2e710 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
2e720 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
2e730 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
2e740 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
2e750 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
2e760 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
2e770 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
2e780 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
2e790 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
2e7a0 0a 20 20 2a 2f 0a 20 20 7a 42 75 66 5b 30 5d 20  .  */.  zBuf[0] 
2e7b0 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  = 0;.  SimulateI
2e7c0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2e7d0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a  QLITE_IOERR );..
2e7e0 20 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d    zDir = unixTem
2e7f0 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66  pFileDir();.  if
2e800 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 65 74 75  ( zDir==0 ) retu
2e810 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
2e820 47 45 54 54 45 4d 50 50 41 54 48 3b 0a 20 20 64  GETTEMPPATH;.  d
2e830 6f 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20  o{.    u64 r;.  
2e840 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
2e850 6e 65 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20  ness(sizeof(r), 
2e860 26 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  &r);.    assert(
2e870 20 6e 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a   nBuf>2 );.    z
2e880 42 75 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b  Buf[nBuf-2] = 0;
2e890 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
2e8a0 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66  rintf(nBuf, zBuf
2e8b0 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45  , "%s/"SQLITE_TE
2e8c0 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25  MP_FILE_PREFIX"%
2e8d0 6c 6c 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20  llx%c",.        
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 44 69               zDi
2e8f0 72 2c 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66  r, r, 0);.    if
2e900 28 20 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d  ( zBuf[nBuf-2]!=
2e910 30 20 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e  0 || (iLimit++)>
2e920 31 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  10 ) return SQLI
2e930 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69  TE_ERROR;.  }whi
2e940 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75  le( osAccess(zBu
2e950 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74  f,0)==0 );.  ret
2e960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2e970 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2e980 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2e990 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
2e9a0 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f  PPLE__)./*.** Ro
2e9b0 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f  utine to transfo
2e9c0 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e  rm a unixFile in
2e9d0 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69  to a proxy-locki
2e9e0 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20  ng unixFile..** 
2e9f0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  Implementation i
2ea00 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b  n the proxy-lock
2ea10 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75   division, but u
2ea20 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28  sed by unixOpen(
2ea30 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50  ).** if SQLITE_P
2ea40 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b  REFER_PROXY_LOCK
2ea50 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a  ING is defined..
2ea60 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
2ea70 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
2ea80 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20  File(unixFile*, 
2ea90 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65  const char*);.#e
2eaa0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72  ndif../*.** Sear
2eab0 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
2eac0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2ead0 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64   that was opened
2eae0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
2eaf0 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61   .** file (not a
2eb00 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74   journal or mast
2eb10 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29  er-journal file)
2eb20 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
2eb30 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68  athname.** zPath
2eb40 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45   with SQLITE_OPE
2eb50 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63  N_XXX flags matc
2eb60 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65  hing those passe
2eb70 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a  d as the second.
2eb80 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ** argument to t
2eb90 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2eba0 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20  .** Such a file 
2ebb0 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65  descriptor may e
2ebc0 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62 61  xist if a databa
2ebd0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61  se connection wa
2ebe0 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20  s closed.** but 
2ebf0 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
2ec00 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 63  ile descriptor c
2ec10 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73  ould not be clos
2ec20 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a  ed because some.
2ec30 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65  ** other file de
2ec40 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
2ec50 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69   the same file i
2ec60 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65  s holding a file
2ec70 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20  -lock..** Refer 
2ec80 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74  to comments in t
2ec90 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66  he unixClose() f
2eca0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20  unction and the 
2ecb0 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a  lengthy comment.
2ecc0 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22 50  ** describing "P
2ecd0 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
2ece0 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73 74  cking" at the st
2ecf0 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65  art of this file
2ed00 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72   for .** further
2ed10 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20   details. Also, 
2ed20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a  ticket #4018..**
2ed30 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c  .** If a suitabl
2ed40 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2ed50 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e  r is found, then
2ed60 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
2ed70 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66   If no.** such f
2ed80 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
2ed90 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73  s located, -1 is
2eda0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2edb0 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46  atic UnixUnusedF
2edc0 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46  d *findReusableF
2edd0 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  d(const char *zP
2ede0 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  ath, int flags){
2edf0 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
2ee00 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20  *pUnused = 0;.. 
2ee10 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63   /* Do not searc
2ee20 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20  h for an unused 
2ee30 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ee40 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20  on vxworks. Not 
2ee50 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77  because.  ** vxw
2ee60 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62  orks would not b
2ee70 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20  enefit from the 
2ee80 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74  change (it might
2ee90 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65  , we're not sure
2eea0 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61  ),.  ** but beca
2eeb0 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65  use no way to te
2eec0 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  st it is current
2eed0 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74  ly available. It
2eee0 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a   is better .  **
2eef0 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65   not to risk bre
2ef00 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75  aking vxworks su
2ef10 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61  pport for the sa
2ef20 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62  ke of such an ob
2ef30 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74  scure .  ** feat
2ef40 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53  ure.  */.#if !OS
2ef50 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63  _VXWORKS.  struc
2ef60 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
2ef70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef80 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74  /* Results of st
2ef90 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  at() call */..  
2efa0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2efb0 3b 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29  ;..  /* A stat()
2efc0 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66   call may fail f
2efd0 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f  or various reaso
2efe0 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ns. If this happ
2eff0 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ens, it is.  ** 
2f000 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74  almost certain t
2f010 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61  hat an open() ca
2f020 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  ll on the same p
2f030 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61  ath will also fa
2f040 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69  il..  ** For thi
2f050 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20  s reason, if an 
2f060 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
2f070 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20  the stat() call 
2f080 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a  here, it is.  **
2f090 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20   ignored and -1 
2f0a0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  is returned. The
2f0b0 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79   caller will try
2f0c0 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66   to open a new f
2f0d0 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70  ile.  ** descrip
2f0e0 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  tor on the same 
2f0f0 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20  path, fail, and 
2f100 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  return an error 
2f110 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a  to SQLite..  **.
2f120 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73    ** Even if a s
2f130 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29  ubsequent open()
2f140 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65   call does succe
2f150 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65  ed, the conseque
2f160 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74  nces of.  ** not
2f170 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61   searching for a
2f180 20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64   reusable file d
2f190 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f  escriptor are no
2f1a0 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66  t dire.  */.  if
2f1b0 28 20 6e 55 6e 75 73 65 64 46 64 3e 30 20 26 26  ( nUnusedFd>0 &&
2f1c0 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2f1d0 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2f1e0 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2f1f0 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 70 49 6e  pInode;..    pIn
2f200 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
2f210 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
2f220 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
2f230 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
2f240 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
2f250 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2f260 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
2f270 6e 6f 21 3d 28 75 36 34 29 73 53 74 61 74 2e 73  no!=(u64)sStat.s
2f280 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  t_ino) ){.      
2f290 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65   pInode = pInode
2f2a0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
2f2b0 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b     if( pInode ){
2f2c0 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65  .      UnixUnuse
2f2d0 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20  dFd **pp;.      
2f2e0 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e  for(pp=&pInode->
2f2f0 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20  pUnused; *pp && 
2f300 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c  (*pp)->flags!=fl
2f310 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d  ags; pp=&((*pp)-
2f320 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20  >pNext));.      
2f330 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20  pUnused = *pp;. 
2f340 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64       if( pUnused
2f350 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 55 6e 75   ){.        nUnu
2f360 73 65 64 46 64 2d 2d 3b 0a 20 20 20 20 20 20 20  sedFd--;.       
2f370 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e   *pp = pUnused->
2f380 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
2f390 20 20 20 7d 0a 20 20 7d 0a 20 20 75 6e 69 78 4c     }.  }.  unixL
2f3a0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 23 65 6e  eaveMutex();.#en
2f3b0 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53  dif    /* if !OS
2f3c0 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65  _VXWORKS */.  re
2f3d0 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a  turn pUnused;.}.
2f3e0 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20  ./*.** Find the 
2f3f0 6d 6f 64 65 2c 20 75 69 64 20 61 6e 64 20 67 69  mode, uid and gi
2f400 64 20 6f 66 20 66 69 6c 65 20 7a 46 69 6c 65 2e  d of file zFile.
2f410 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
2f420 67 65 74 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  getFileMode(.  c
2f430 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2f440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2f450 2a 20 46 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  * File name */. 
2f460 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f480 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
2f490 69 6f 6e 73 20 6f 66 20 7a 46 69 6c 65 20 2a 2f  ions of zFile */
2f4a0 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
2f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4c0 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 6f     /* OUT: uid o
2f4d0 66 20 7a 46 69 6c 65 2e 20 2a 2f 0a 20 20 67 69  f zFile. */.  gi
2f4e0 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20 20  d_t *pGid       
2f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f500 20 4f 55 54 3a 20 67 69 64 20 6f 66 20 7a 46 69   OUT: gid of zFi
2f510 6c 65 2e 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  le. */.){.  stru
2f520 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
2f530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2f540 75 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20  utput of stat() 
2f550 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  on database file
2f560 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
2f570 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
2f580 30 3d 3d 6f 73 53 74 61 74 28 7a 46 69 6c 65 2c  0==osStat(zFile,
2f590 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2f5a0 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73  *pMode = sStat.s
2f5b0 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20  t_mode & 0777;. 
2f5c0 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74     *pUid = sStat
2f5d0 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 2a 70 47  .st_uid;.    *pG
2f5e0 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
2f5f0 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  d;.  }else{.    
2f600 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2f610 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 72  R_FSTAT;.  }.  r
2f620 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2f630 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2f640 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e   is called by un
2f650 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65  ixOpen() to dete
2f660 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70  rmine the unix p
2f670 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f  ermissions.** to
2f680 20 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65   create new file
2f690 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72  s with. If no er
2f6a0 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e  ror occurs, then
2f6b0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2f6c0 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20  turned.** and a 
2f6d0 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66  value suitable f
2f6e0 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68  or passing as th
2f6f0 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
2f700 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a   to open(2) is.*
2f710 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d  * written to *pM
2f720 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ode. If an IO er
2f730 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
2f740 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2f750 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
2f760 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2f770 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20  f *pMode is not 
2f780 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  modified..**.** 
2f790 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74  In most cases, t
2f7a0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
2f7b0 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68   *pMode to 0, wh
2f7c0 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a  ich will become.
2f7d0 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  ** an indication
2f7e0 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28   to robust_open(
2f7f0 29 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20  ) to create the 
2f800 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51  file using.** SQ
2f810 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
2f820 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64  E_PERMISSIONS ad
2f830 6a 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d  justed by the um
2f840 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74  ask..** But if t
2f850 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  he file being op
2f860 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72  ened is a WAL or
2f870 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
2f880 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20   file, then .** 
2f890 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75  this function qu
2f8a0 65 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73  eries the file-s
2f8b0 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65  ystem for the pe
2f8c0 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65  rmissions on the
2f8d0 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
2f8e0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
2f8f0 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65   and sets *pMode
2f900 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20   to this value. 
2f910 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73  Whenever .** pos
2f920 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a  sible, WAL and j
2f930 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
2f940 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
2f950 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
2f960 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61  ons .** as the a
2f970 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
2f980 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
2f990 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41  f the SQLITE_ENA
2f9a0 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70  BLE_8_3_NAMES op
2f9b0 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c  tion is enabled,
2f9c0 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69   then the.** ori
2f9d0 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  ginal filename i
2f9e0 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20  s unavailable.  
2f9f0 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73  But 8_3_NAMES is
2fa00 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a   only used for.*
2fa10 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d  * FAT filesystem
2fa20 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e  s and permission
2fa30 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20  s do not matter 
2fa40 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75  there, so just u
2fa50 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  se.** the defaul
2fa60 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a  t permissions..*
2fa70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  /.static int fin
2fa80 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
2fa90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2faa0 50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  Path,           
2fab0 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69     /* Path of fi
2fac0 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65  le (possibly) be
2fad0 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20  ing created */. 
2fae0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb00 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64   /* Flags passed
2fb10 20 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74   as 4th argument
2fb20 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   to xOpen() */. 
2fb30 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20   mode_t *pMode, 
2fb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb50 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73   /* OUT: Permiss
2fb60 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c  ions to open fil
2fb70 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
2fb80 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20  t *pUid,        
2fb90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2fba0 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f  UT: uid to set o
2fbb0 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  n the file */.  
2fbc0 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20  gid_t *pGid     
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbe0 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73  /* OUT: gid to s
2fbf0 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a  et on the file *
2fc00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
2fc10 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
2fc20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
2fc30 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64   Code */.  *pMod
2fc40 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d  e = 0;.  *pUid =
2fc50 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b   0;.  *pGid = 0;
2fc60 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28  .  if( flags & (
2fc70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2fc80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2fc90 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2fca0 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41   char zDb[MAX_PA
2fcb0 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f  THNAME+1];     /
2fcc0 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20  * Database file 
2fcd0 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
2fce0 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  nDb;            
2fcf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2fd00 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74  ber of valid byt
2fd10 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 0a 20 20  es in zDb */..  
2fd20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61 20    /* zPath is a 
2fd30 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f 72  path to a WAL or
2fd40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
2fd50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2fd60 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20 2a  ck derives.    *
2fd70 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74 68  * the path to th
2fd80 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
2fd90 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d 20  abase file from 
2fda0 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f 63  zPath. This bloc
2fdb0 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a 2a  k handles.    **
2fdc0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e   the following n
2fdd0 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  aming convention
2fde0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
2fdf0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2fe00 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a 2a  -journal".    **
2fe10 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
2fe20 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  -wal".    **   "
2fe30 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2fe40 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20 20  rnalNN".    **  
2fe50 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77   "<path to db>-w
2fe60 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20 20  alNN".    **.   
2fe70 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73 20   ** where NN is 
2fe80 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65 72  a decimal number
2fe90 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67 20  . The NN naming 
2fea0 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20 20  schemes are .   
2feb0 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65 20   ** used by the 
2fec0 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e 63  test_multiplex.c
2fed0 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a   module..    */.
2fee0 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74 65      nDb = sqlite
2fef0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 29  3Strlen30(zPath)
2ff00 20 2d 20 31 3b 20 0a 20 20 20 20 77 68 69 6c 65   - 1; .    while
2ff10 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  ( zPath[nDb]!='-
2ff20 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  ' ){.      /* In
2ff30 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74 69 6f   normal operatio
2ff40 6e 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  n, the journal f
2ff50 69 6c 65 20 6e 61 6d 65 20 77 69 6c 6c 20 61 6c  ile name will al
2ff60 77 61 79 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20  ways contain.   
2ff70 20 20 20 2a 2a 20 61 20 27 2d 27 20 63 68 61 72     ** a '-' char
2ff80 61 63 74 65 72 2e 20 20 48 6f 77 65 76 65 72 20  acter.  However 
2ff90 69 6e 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 20  in 8+3 filename 
2ffa0 6d 6f 64 65 2c 20 6f 72 20 69 66 20 61 20 63 6f  mode, or if a co
2ffb0 72 72 75 70 74 0a 20 20 20 20 20 20 2a 2a 20 72  rrupt.      ** r
2ffc0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2ffd0 73 70 65 63 69 66 69 65 73 20 61 20 6d 61 73 74  specifies a mast
2ffe0 65 72 20 6a 6f 75 72 6e 61 6c 20 77 69 74 68 20  er journal with 
2fff0 61 20 67 6f 6f 66 79 20 6e 61 6d 65 2c 20 74 68  a goofy name, th
30000 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
30010 27 2d 27 20 6d 69 67 68 74 20 62 65 20 6d 69 73  '-' might be mis
30020 73 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69  sing. */.      i
30030 66 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61  f( nDb==0 || zPa
30040 74 68 5b 6e 44 62 5d 3d 3d 27 2e 27 20 29 20 72  th[nDb]=='.' ) r
30050 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30060 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20 20  .      nDb--;.  
30070 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a    }.    memcpy(z
30080 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
30090 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
300a0 27 5c 30 27 3b 0a 0a 20 20 20 20 72 63 20 3d 20  '\0';..    rc = 
300b0 67 65 74 46 69 6c 65 4d 6f 64 65 28 7a 44 62 2c  getFileMode(zDb,
300c0 20 70 4d 6f 64 65 2c 20 70 55 69 64 2c 20 70 47   pMode, pUid, pG
300d0 69 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  id);.  }else if(
300e0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
300f0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
30100 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  SE ){.    *pMode
30110 20 3d 20 30 36 30 30 3b 0a 20 20 7d 65 6c 73 65   = 0600;.  }else
30120 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
30130 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 29 7b 0a  ITE_OPEN_URI ){.
30140 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
30150 73 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61 73  s a main databas
30160 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
30170 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 75  ile was opened u
30180 73 69 6e 67 20 61 20 55 52 49 0a 20 20 20 20 2a  sing a URI.    *
30190 2a 20 66 69 6c 65 6e 61 6d 65 2c 20 63 68 65 63  * filename, chec
301a0 6b 20 66 6f 72 20 74 68 65 20 22 6d 6f 64 65 6f  k for the "modeo
301b0 66 22 20 70 61 72 61 6d 65 74 65 72 2e 20 49 66  f" parameter. If
301c0 20 70 72 65 73 65 6e 74 2c 20 69 6e 74 65 72 70   present, interp
301d0 72 65 74 0a 20 20 20 20 2a 2a 20 69 74 73 20 76  ret.    ** its v
301e0 61 6c 75 65 20 61 73 20 61 20 66 69 6c 65 6e 61  alue as a filena
301f0 6d 65 20 61 6e 64 20 74 72 79 20 74 6f 20 63 6f  me and try to co
30200 70 79 20 74 68 65 20 6d 6f 64 65 2c 20 75 69 64  py the mode, uid
30210 20 61 6e 64 20 67 69 64 20 66 72 6f 6d 0a 20 20   and gid from.  
30220 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 2e 20    ** that file. 
30230 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
30240 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
30250 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 50  uri_parameter(zP
30260 61 74 68 2c 20 22 6d 6f 64 65 6f 66 22 29 3b 0a  ath, "modeof");.
30270 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20 20      if( z ){.   
30280 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c 65 4d     rc = getFileM
30290 6f 64 65 28 7a 2c 20 70 4d 6f 64 65 2c 20 70 55  ode(z, pMode, pU
302a0 69 64 2c 20 70 47 69 64 29 3b 0a 20 20 20 20 7d  id, pGid);.    }
302b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
302c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
302d0 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e 0a  the file zPath..
302e0 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73 6c  ** .** Previousl
302f0 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f 53  y, the SQLite OS
30300 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72 65   layer used thre
30310 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 70  e functions in p
30320 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a 20  lace of this.** 
30330 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  one:.**.**     s
30340 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
30350 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20 20  Write();.**     
30360 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
30370 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20 20  dOnly();.**     
30380 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
30390 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20  lusive();.**.** 
303a0 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72 72  These calls corr
303b0 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66 6f  espond to the fo
303c0 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74  llowing combinat
303d0 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a 2a  ions of flags:.*
303e0 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72 69  *.**     ReadWri
303f0 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45 41  te() ->     (REA
30400 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 29  DWRITE | CREATE)
30410 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c 79  .**     ReadOnly
30420 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41 44  ()  ->     (READ
30430 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f 70  ONLY) .**     Op
30440 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d 3e  enExclusive() ->
30450 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
30460 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56 45  EATE | EXCLUSIVE
30470 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64 20  ).**.** The old 
30480 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
30490 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c 65  accepted a boole
304a0 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22 64  an argument - "d
304b0 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20 74  elFlag". If.** t
304c0 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77 61  rue, the file wa
304d0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20  s configured to 
304e0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
304f0 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
30500 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c 65  e.** file handle
30510 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68 69   closed. To achi
30520 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66 66  eve the same eff
30530 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20 6e  ect using this n
30540 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65  ew .** interface
30550 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54 45  , add the DELETE
30560 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f 20  ONCLOSE flag to 
30570 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 20  those specified 
30580 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f 70  above for .** Op
30590 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a 2a  enExclusive()..*
305a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
305b0 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65 33  xOpen(.  sqlite3
305c0 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20  _vfs *pVfs,     
305d0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
305e0 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20   for which this 
305f0 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65 74  is the xOpen met
30600 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  hod */.  const c
30610 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20 20  har *zPath,     
30620 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61 6d        /* Pathnam
30630 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
30640 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
30650 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
30660 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
30670 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
30680 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e 20  to be filled in 
30690 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
306a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
306b0 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67 73    /* Input flags
306c0 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 20   to control the 
306d0 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  opening */.  int
306e0 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20 20   *pOutFlags     
306f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
30700 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72 6e  put flags return
30710 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f 72  ed to SQLite cor
30720 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  e */.){.  unixFi
30730 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
30740 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74  e *)pFile;.  int
30750 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20 20   fd = -1;       
30760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
30770 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 72  ile descriptor r
30780 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e 28  eturned by open(
30790 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ) */.  int openF
307a0 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20  lags = 0;       
307b0 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74        /* Flags t
307c0 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28 29  o pass to open()
307d0 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65 20   */.  int eType 
307e0 3d 20 66 6c 61 67 73 26 30 78 46 46 46 46 46 46  = flags&0xFFFFFF
307f0 30 30 3b 20 20 2f 2a 20 54 79 70 65 20 6f 66 20  00;  /* Type of 
30800 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
30810 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
30820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30830 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
30840 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
30850 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
30860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
30870 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
30880 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
30890 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
308a0 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
308b0 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
308c0 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
308d0 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
308e0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
308f0 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
30900 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
30910 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
30920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
30930 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
30940 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
30950 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
30960 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
30970 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
30980 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
30990 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
309a0 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
309b0 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
309c0 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
309d0 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
309e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
309f0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
30a00 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
30a10 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
30a20 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
30a30 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
30a40 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
30a50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
30a60 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
30a70 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
30a80 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
30a90 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
30aa0 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
30ab0 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
30ac0 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
30ad0 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
30ae0 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
30af0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
30b00 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
30b10 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
30b20 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
30b30 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
30b40 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
30b50 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
30b60 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
30b70 69 6e 74 20 69 73 4e 65 77 4a 72 6e 6c 20 3d 20  int isNewJrnl = 
30b80 28 69 73 43 72 65 61 74 65 20 26 26 20 28 0a 20  (isCreate && (. 
30b90 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51         eType==SQ
30ba0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
30bb0 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c  _JOURNAL .     |
30bc0 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
30bd0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
30be0 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65  L .     || eType
30bf0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  ==SQLITE_OPEN_WA
30c00 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  L.  ));..  /* If
30c10 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20   argument zPath 
30c20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
30c30 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  r, this function
30c40 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
30c50 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70  open.  ** a temp
30c60 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20  orary file. Use 
30c70 74 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 73  this buffer to s
30c80 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61  tore the file na
30c90 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68  me in..  */.  ch
30ca0 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f  ar zTmpname[MAX_
30cb0 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63  PATHNAME+2];.  c
30cc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
30cd0 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20   = zPath;..  /* 
30ce0 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77  Check the follow
30cf0 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61  ing statements a
30d00 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20  re true: .  **. 
30d10 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c   **   (a) Exactl
30d20 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41  y one of the REA
30d30 44 57 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f  DWRITE and READO
30d40 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62  NLY flags must b
30d50 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a  e set, and .  **
30d60 20 20 20 28 62 29 20 69 66 20 43 52 45 41 54 45     (b) if CREATE
30d70 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45   is set, then RE
30d80 41 44 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73  ADWRITE must als
30d90 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20  o be set, and.  
30da0 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58 43 4c  **   (c) if EXCL
30db0 55 53 49 56 45 20 69 73 20 73 65 74 2c 20 74 68  USIVE is set, th
30dc0 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
30dd0 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a  lso be set..  **
30de0 20 20 20 28 64 29 20 69 66 20 44 45 4c 45 54 45     (d) if DELETE
30df0 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20  ONCLOSE is set, 
30e00 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
30e10 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
30e20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69 73 52  */.  assert((isR
30e30 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73  eadonly==0 || is
30e40 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26  ReadWrite==0) &&
30e50 20 28 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c   (isReadWrite ||
30e60 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20   isReadonly));. 
30e70 20 61 73 73 65 72 74 28 69 73 43 72 65 61 74 65   assert(isCreate
30e80 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69  ==0 || isReadWri
30e90 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
30ea0 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20  Exclusive==0 || 
30eb0 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73  isCreate);.  ass
30ec0 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20  ert(isDelete==0 
30ed0 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20  || isCreate);.. 
30ee0 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c   /* The main DB,
30ef0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57   main journal, W
30f00 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74  AL file and mast
30f10 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e  er journal are n
30f20 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d  ever .  ** autom
30f30 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
30f40 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
30f50 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
30f60 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
30f70 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
30f80 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
30f90 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
30fa0 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
30fb0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
30fc0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
30fd0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
30fe0 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
30ff0 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
31000 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
31010 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
31020 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
31030 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  L );.  assert( (
31040 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61  !isDelete && zNa
31050 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51  me) || eType!=SQ
31060 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b  LITE_OPEN_WAL );
31070 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68  ..  /* Assert th
31080 61 74 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  at the upper lay
31090 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f  er has set one o
310a0 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65  f the "file-type
310b0 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73  " flags. */.  as
310c0 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
310d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
310e0 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
310f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
31100 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65  _DB .       || e
31110 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
31120 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
31130 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  | eType==SQLITE_
31140 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
31150 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
31160 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
31170 53 55 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20  SUBJOURNAL   || 
31180 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
31190 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
311a0 4c 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  L .       || eTy
311b0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
311c0 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20  TRANSIENT_DB || 
311d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
311e0 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f  EN_WAL.  );..  /
311f0 2a 20 44 65 74 65 63 74 20 61 20 70 69 64 20 63  * Detect a pid c
31200 68 61 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20  hange and reset 
31210 74 68 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65  the PRNG.  There
31220 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69   is a race condi
31230 74 69 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73  tion.  ** here s
31240 75 63 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20  uch that two or 
31250 6d 6f 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c  more threads all
31260 20 74 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20   trying to open 
31270 64 61 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a  databases at.  *
31280 2a 20 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61  * the same insta
31290 6e 74 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73  nt might all res
312a0 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75  et the PRNG.  Bu
312b0 74 20 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74  t multiple reset
312c0 73 0a 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c  s.  ** are harml
312d0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ess..  */.  if( 
312e0 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 6f  randomnessPid!=o
312f0 73 47 65 74 70 69 64 28 30 29 20 29 7b 0a 20 20  sGetpid(0) ){.  
31300 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20    randomnessPid 
31310 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b 0a 20  = osGetpid(0);. 
31320 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
31330 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 7d 0a  mness(0,0);.  }.
31340 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
31350 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
31360 3b 0a 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d  ;..  if( eType==
31370 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
31380 5f 44 42 20 29 7b 0a 20 20 20 20 55 6e 69 78 55  _DB ){.    UnixU
31390 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
313a0 3b 0a 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20  ;.    pUnused = 
313b0 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 7a  findReusableFd(z
313c0 4e 61 6d 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20  Name, flags);.  
313d0 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b    if( pUnused ){
313e0 0a 20 20 20 20 20 20 66 64 20 3d 20 70 55 6e 75  .      fd = pUnu
313f0 73 65 64 2d 3e 66 64 3b 0a 20 20 20 20 7d 65 6c  sed->fd;.    }el
31400 73 65 7b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  se{.      pUnuse
31410 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
31420 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e  oc64(sizeof(*pUn
31430 75 73 65 64 29 29 3b 0a 20 20 20 20 20 20 69 66  used));.      if
31440 28 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  ( !pUnused ){.  
31450 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
31460 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
31470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31480 20 20 70 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74    p->pPreallocat
31490 65 64 55 6e 75 73 65 64 20 3d 20 70 55 6e 75 73  edUnused = pUnus
314a0 65 64 3b 0a 0a 20 20 20 20 2f 2a 20 44 61 74 61  ed;..    /* Data
314b0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 73 20 61  base filenames a
314c0 72 65 20 64 6f 75 62 6c 65 2d 7a 65 72 6f 20 74  re double-zero t
314d0 65 72 6d 69 6e 61 74 65 64 20 69 66 20 74 68 65  erminated if the
314e0 79 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 2a 2a  y are not.    **
314f0 20 55 52 49 73 20 77 69 74 68 20 70 61 72 61 6d   URIs with param
31500 65 74 65 72 73 2e 20 20 48 65 6e 63 65 2c 20 74  eters.  Hence, t
31510 68 65 79 20 63 61 6e 20 61 6c 77 61 79 73 20 62  hey can always b
31520 65 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20  e passed into.  
31530 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 75 72 69    ** sqlite3_uri
31540 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
31550 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 66 6c  .    assert( (fl
31560 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
31570 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e 61 6d 65 5b  N_URI) || zName[
31580 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d  strlen(zName)+1]
31590 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65 6c 73 65 20  ==0 );..  }else 
315a0 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
315b0 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
315c0 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
315d0 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
315e0 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
315f0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
31600 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4e  isDelete && !isN
31610 65 77 4a 72 6e 6c 29 3b 0a 20 20 20 20 72 63 20  ewJrnl);.    rc 
31620 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  = unixGetTempnam
31630 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  e(pVfs->mxPathna
31640 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  me, zTmpname);. 
31650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
31670 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
31680 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e     zName = zTmpn
31690 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 6e  ame;..    /* Gen
316a0 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61 72 79  erated temporary
316b0 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 61   filenames are a
316c0 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a 65 72  lways double-zer
316d0 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20  o terminated.   
316e0 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79 20 73   ** for use by s
316f0 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
31700 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
31710 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73 74 72  ssert( zName[str
31720 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30  len(zName)+1]==0
31730 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65   );.  }..  /* De
31740 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c 75  termine the valu
31750 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20 70  e of the flags p
31760 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20  arameter passed 
31770 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69 6f  to POSIX functio
31780 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20 54  n.  ** open(). T
31790 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61 6c  hese must be cal
317a0 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66 20  culated even if 
317b0 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63 61  open() is not ca
317c0 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74 68  lled, as.  ** th
317d0 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65 64  ey may be stored
317e0 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   as part of the 
317f0 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64 20  file handle and 
31800 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20 2a  used by the .  *
31810 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20 6c  * 'conch file' l
31820 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  ocking functions
31830 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a 20   later on.  */. 
31840 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79 20   if( isReadonly 
31850 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20  )  openFlags |= 
31860 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20  O_RDONLY;.  if( 
31870 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f 70  isReadWrite ) op
31880 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44 57  enFlags |= O_RDW
31890 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61 74  R;.  if( isCreat
318a0 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67 73  e )    openFlags
318b0 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20 69   |= O_CREAT;.  i
318c0 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20 29  f( isExclusive )
318d0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28 4f   openFlags |= (O
318e0 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f 57  _EXCL|O_NOFOLLOW
318f0 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  );.  openFlags |
31900 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  = (O_LARGEFILE|O
31910 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66 28  _BINARY);..  if(
31920 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f 64   fd<0 ){.    mod
31930 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20  e_t openMode;   
31940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65             /* Pe
31950 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65  rmissions to cre
31960 61 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  ate file with */
31970 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64 3b 20  .    uid_t uid; 
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31990 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66 6f 72     /* Userid for
319a0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
319b0 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20 20 20   gid_t gid;     
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
319d0 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20 74 68  * Groupid for th
319e0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 63  e file */.    rc
319f0 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46 69 6c   = findCreateFil
31a00 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66 6c 61  eMode(zName, fla
31a10 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26  gs, &openMode, &
31a20 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 20 20  uid, &gid);.    
31a30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31a40 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
31a50 74 28 20 21 70 2d 3e 70 50 72 65 61 6c 6c 6f 63  t( !p->pPrealloc
31a60 61 74 65 64 55 6e 75 73 65 64 20 29 3b 0a 20 20  atedUnused );.  
31a70 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
31a80 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
31a90 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
31aa0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
31ab0 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
31ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
31ad0 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
31ae0 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
31af0 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
31b00 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  ;.    OSTRACE(("
31b10 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
31b20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
31b30 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
31b40 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 45      assert( !isE
31b50 78 63 6c 75 73 69 76 65 20 7c 7c 20 28 6f 70 65  xclusive || (ope
31b60 6e 46 6c 61 67 73 20 26 20 4f 5f 43 52 45 41 54  nFlags & O_CREAT
31b70 29 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  )!=0 );.    if( 
31b80 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66  fd<0 ){.      if
31b90 28 20 69 73 4e 65 77 4a 72 6e 6c 20 26 26 20 65  ( isNewJrnl && e
31ba0 72 72 6e 6f 3d 3d 45 41 43 43 45 53 20 26 26 20  rrno==EACCES && 
31bb0 6f 73 41 63 63 65 73 73 28 7a 4e 61 6d 65 2c 20  osAccess(zName, 
31bc0 46 5f 4f 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  F_OK) ){.       
31bd0 20 2f 2a 20 49 66 20 75 6e 61 62 6c 65 20 74 6f   /* If unable to
31be0 20 63 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   create a journa
31bf0 6c 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  l because the di
31c00 72 65 63 74 6f 72 79 20 69 73 20 6e 6f 74 0a 20  rectory is not. 
31c10 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74 61 62         ** writab
31c20 6c 65 2c 20 63 68 61 6e 67 65 20 74 68 65 20 65  le, change the e
31c30 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 69 6e 64  rror code to ind
31c40 69 63 61 74 65 20 74 68 61 74 2e 20 2a 2f 0a 20  icate that. */. 
31c50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
31c60 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 49 52 45  TE_READONLY_DIRE
31c70 43 54 4f 52 59 3b 0a 20 20 20 20 20 20 7d 65 6c  CTORY;.      }el
31c80 73 65 20 69 66 28 20 65 72 72 6e 6f 21 3d 45 49  se if( errno!=EI
31c90 53 44 49 52 20 26 26 20 69 73 52 65 61 64 57 72  SDIR && isReadWr
31ca0 69 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ite ){.        /
31cb0 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e  * Failed to open
31cc0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72 65   the file for re
31cd0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
31ce0 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e 20   Try read-only. 
31cf0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73  */.        flags
31d00 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45   &= ~(SQLITE_OPE
31d10 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
31d20 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b  TE_OPEN_CREATE);
31d30 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
31d40 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f  gs &= ~(O_RDWR|O
31d50 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20 20  _CREAT);.       
31d60 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
31d70 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a  _OPEN_READONLY;.
31d80 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67          openFlag
31d90 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  s |= O_RDONLY;. 
31da0 20 20 20 20 20 20 20 69 73 52 65 61 64 6f 6e 6c         isReadonl
31db0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66  y = 1;.        f
31dc0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
31dd0 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  zName, openFlags
31de0 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20  , openMode);.   
31df0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
31e00 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
31e10 20 69 6e 74 20 72 63 32 20 3d 20 75 6e 69 78 4c   int rc2 = unixL
31e20 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
31e30 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
31e40 70 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  pen", zName);.  
31e50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31e60 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32  TE_OK ) rc = rc2
31e70 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
31e80 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20 20 20 20  n_finished;.    
31e90 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
31ea0 73 20 70 72 6f 63 65 73 73 20 69 73 20 72 75 6e  s process is run
31eb0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 61 6e 64  ning as root and
31ec0 20 69 66 20 63 72 65 61 74 69 6e 67 20 61 20 6e   if creating a n
31ed0 65 77 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20  ew rollback.    
31ee0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41  ** journal or WA
31ef0 4c 20 66 69 6c 65 2c 20 73 65 74 20 74 68 65 20  L file, set the 
31f00 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65  ownership of the
31f10 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 57 41 4c 20   journal or WAL 
31f20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 74 68 65  to be.    ** the
31f30 20 73 61 6d 65 20 61 73 20 74 68 65 20 6f 72 69   same as the ori
31f40 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a  ginal database..
31f50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66      */.    if( f
31f60 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
31f70 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
31f80 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
31f90 29 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73  ) ){.      robus
31fa0 74 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c  tFchown(fd, uid,
31fb0 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   gid);.    }.  }
31fc0 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
31fd0 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
31fe0 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
31ff0 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
32000 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 50 72   }..  if( p->pPr
32010 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64  eallocatedUnused
32020 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 61   ){.    p->pPrea
32030 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65 64 2d 3e  llocatedUnused->
32040 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
32050 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
32060 73 65 64 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61  sed->flags = fla
32070 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 69  gs;.  }..  if( i
32080 73 44 65 6c 65 74 65 20 29 7b 0a 23 69 66 20 4f  sDelete ){.#if O
32090 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 7a 50  S_VXWORKS.    zP
320a0 61 74 68 20 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c  ath = zName;.#el
320b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
320c0 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43  E_UNLINK_AFTER_C
320d0 4c 4f 53 45 29 0a 20 20 20 20 7a 50 61 74 68 20  LOSE).    zPath 
320e0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
320f0 66 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a  f("%s", zName);.
32100 20 20 20 20 69 66 28 20 7a 50 61 74 68 3d 3d 30      if( zPath==0
32110 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
32120 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c 20 5f 5f  _close(p, fd, __
32130 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 72  LINE__);.      r
32140 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
32150 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 23  EM_BKPT;.    }.#
32160 65 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  else.    osUnlin
32170 6b 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  k(zName);.#endif
32180 0a 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f  .  }.#if SQLITE_
32190 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
321a0 54 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20  TYLE.  else{.   
321b0 20 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20   p->openFlags = 
321c0 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23  openFlags;.  }.#
321d0 65 6e 64 69 66 0a 20 20 0a 23 69 66 20 64 65 66  endif.  .#if def
321e0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
321f0 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
32200 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
32210 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
32220 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
32230 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
32240 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b  Errno(p, errno);
32250 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
32260 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
32270 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  _);.    return S
32280 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
32290 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  SS;.  }.  if (0 
322a0 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
322b0 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
322c0 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
322d0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
322e0 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
322f0 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
32300 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20  _IS_MSDOS;.  }. 
32310 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
32320 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66  p("exfat", fsInf
32330 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
32340 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
32350 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
32360 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
32370 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
32380 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
32390 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70  /* Set up approp
323a0 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20  riate ctrlFlags 
323b0 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  */.  if( isDelet
323c0 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  e )             
323d0 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
323e0 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
323f0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
32400 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  y )             
32410 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
32420 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  IXFILE_RDONLY;. 
32430 20 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21   noLock = eType!
32440 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
32450 4e 5f 44 42 3b 0a 20 20 69 66 28 20 6e 6f 4c 6f  N_DB;.  if( noLo
32460 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ck )            
32470 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20        ctrlFlags 
32480 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f  |= UNIXFILE_NOLO
32490 43 4b 3b 0a 20 20 69 66 28 20 69 73 4e 65 77 4a  CK;.  if( isNewJ
324a0 72 6e 6c 20 29 20 20 20 20 20 20 20 20 20 20 20  rnl )           
324b0 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d      ctrlFlags |=
324c0 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
324d0 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  C;.  if( flags &
324e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
324f0 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20   ) ctrlFlags |= 
32500 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a 23  UNIXFILE_URI;..#
32510 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
32520 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
32530 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52  if SQLITE_PREFER
32540 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20  _PROXY_LOCKING. 
32550 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31   isAutoProxy = 1
32560 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69  ;.#endif.  if( i
32570 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a  sAutoProxy && (z
32580 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28  Path!=NULL) && (
32590 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73  !noLock) && pVfs
325a0 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63  ->xOpen ){.    c
325b0 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20  har *envforce = 
325c0 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46  getenv("SQLITE_F
325d0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
325e0 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73  NG");.    int us
325f0 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20  eProxy = 0;..   
32600 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45   /* SQLITE_FORCE
32610 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d  _PROXY_LOCKING==
32620 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c  1 means force al
32630 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20  ways use proxy, 
32640 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20  0 means .    ** 
32650 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c  never use proxy,
32660 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20   NULL means use 
32670 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f  proxy for non-lo
32680 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20  cal files only. 
32690 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66   */.    if( envf
326a0 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20  orce!=NULL ){.  
326b0 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61      useProxy = a
326c0 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b  toi(envforce)>0;
326d0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
326e0 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28 66    useProxy = !(f
326f0 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e  sInfo.f_flags&MN
32700 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d 0a  T_LOCAL);.    }.
32710 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78 79      if( useProxy
32720 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
32730 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70 56  illInUnixFile(pV
32740 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20 7a  fs, fd, pFile, z
32750 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73 29  Path, ctrlFlags)
32760 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
32770 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
32780 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 54       rc = proxyT
32790 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
327a0 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69 6c  ((unixFile*)pFil
327b0 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20 20  e, ":auto:");.  
327c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
327d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
327e0 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69 78       /* Use unix
327f0 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20 75  Close to clean u
32800 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20  p the resources 
32810 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e 55  added in fillInU
32820 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20 20  nixFile .       
32830 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72 20     ** and clear 
32840 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75 72  all the structur
32850 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e 20  e's references. 
32860 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20 0a   Specifically, .
32870 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46 69            ** pFi
32880 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69 6c  le->pMethods wil
32890 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71 6c  l be NULL so sql
328a0 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c 6c  ite3OsClose will
328b0 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20 20   be a no-op .   
328c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
328d0 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70 46      unixClose(pF
328e0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ile);.          
328f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
32900 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32910 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e     goto open_fin
32920 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ished;.    }.  }
32930 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 61 73 73  .#endif.  .  ass
32940 65 72 74 28 20 7a 50 61 74 68 3d 3d 30 20 7c 7c  ert( zPath==0 ||
32950 20 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 0a   zPath[0]=='/' .
32960 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
32970 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
32980 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54  ER_JOURNAL || eT
32990 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
329a0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20  _MAIN_JOURNAL . 
329b0 20 29 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49   );.  rc = fillI
329c0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
329d0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
329e0 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f  , ctrlFlags);..o
329f0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
32a00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32a10 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
32a20 5f 66 72 65 65 28 70 2d 3e 70 50 72 65 61 6c 6c  _free(p->pPreall
32a30 6f 63 61 74 65 64 55 6e 75 73 65 64 29 3b 0a 20  ocatedUnused);. 
32a40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
32a50 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  }.../*.** Delete
32a60 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50 61   the file at zPa
32a70 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
32a80 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
32a90 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a 20  rue, fsync().** 
32aa0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 66  the directory af
32ab0 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65  ter deleting the
32ac0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
32ad0 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65 28   int unixDelete(
32ae0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
32af0 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a 20  NotUsed,     /* 
32b00 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  VFS containing t
32b10 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c 65  his as the xDele
32b20 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  te method */.  c
32b30 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
32b40 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ,        /* Name
32b50 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20 64   of file to be d
32b60 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  eleted */.  int 
32b70 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20 20  dirSync         
32b80 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65        /* If true
32b90 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63 74  , fsync() direct
32ba0 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74 69  ory after deleti
32bb0 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  ng file */.){.  
32bc0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
32bd0 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  OK;.  UNUSED_PAR
32be0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
32bf0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
32c00 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54 45  or(return SQLITE
32c10 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b 0a  _IOERR_DELETE);.
32c20 20 20 69 66 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a    if( osUnlink(z
32c30 50 61 74 68 29 3d 3d 28 2d 31 29 20 29 7b 0a 20  Path)==(-1) ){. 
32c40 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 4e     if( errno==EN
32c50 4f 45 4e 54 0a 23 69 66 20 4f 53 5f 56 58 57 4f  OENT.#if OS_VXWO
32c60 52 4b 53 0a 20 20 20 20 20 20 20 20 7c 7c 20 6f  RKS.        || o
32c70 73 41 63 63 65 73 73 28 7a 50 61 74 68 2c 30 29  sAccess(zPath,0)
32c80 21 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  !=0.#endif.    )
32c90 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
32ca0 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
32cb0 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20 7d 65 6c 73  _NOENT;.    }els
32cc0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  e{.      rc = un
32cd0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
32ce0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c 20  E_IOERR_DELETE, 
32cf0 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  "unlink", zPath)
32d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
32d10 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 69 66 6e 64  rn rc;.  }.#ifnd
32d20 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
32d30 45 5f 44 49 52 53 59 4e 43 0a 20 20 69 66 28 20  E_DIRSYNC.  if( 
32d40 28 64 69 72 53 79 6e 63 20 26 20 31 29 21 3d 30  (dirSync & 1)!=0
32d50 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a   ){.    int fd;.
32d60 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
32d70 69 72 65 63 74 6f 72 79 28 7a 50 61 74 68 2c 20  irectory(zPath, 
32d80 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  &fd);.    if( rc
32d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32da0 20 20 20 20 20 69 66 28 20 66 75 6c 6c 5f 66 73       if( full_fs
32db0 79 6e 63 28 66 64 2c 30 2c 30 29 20 29 7b 0a 20  ync(fd,0,0) ){. 
32dc0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
32dd0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
32de0 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
32df0 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
32e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32e10 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
32e20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
32e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32e40 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
32e50 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20  TE_CANTOPEN );. 
32e60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
32e70 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
32e80 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
32e90 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
32ea0 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
32eb0 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
32ec0 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
32ed0 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
32ee0 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
32ef0 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
32f00 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
32f10 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
32f20 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
32f30 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
32f40 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
32f50 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
32f60 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
32f70 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
32f80 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
32f90 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
32fa0 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
32fb0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
32fc0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
32fd0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
32fe0 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
32ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
33000 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
33010 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
33020 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
33030 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
33040 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
33050 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
33060 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
33070 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
33080 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
33090 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
330a0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
330b0 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
330c0 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
330d0 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
330e0 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
330f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
33100 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
33110 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
33120 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
33130 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
33140 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
33150 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
33160 53 3b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  S; );.  assert( 
33170 70 52 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20  pResOut!=0 );.. 
33180 20 2f 2a 20 54 68 65 20 73 70 65 63 20 73 61 79   /* The spec say
33190 73 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  s there are thre
331a0 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65  e possible value
331b0 73 20 66 6f 72 20 66 6c 61 67 73 2e 20 20 42 75  s for flags.  Bu
331c0 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20  t only.  ** two 
331d0 6f 66 20 74 68 65 6d 20 61 72 65 20 61 63 74 75  of them are actu
331e0 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 61  ally used */.  a
331f0 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 53 51  ssert( flags==SQ
33200 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
33210 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c  TS || flags==SQL
33220 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
33230 52 49 54 45 20 29 3b 0a 0a 20 20 69 66 28 20 66  RITE );..  if( f
33240 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
33250 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20  ESS_EXISTS ){.  
33260 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
33270 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  f;.    *pResOut 
33280 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  = (0==osStat(zPa
33290 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
332a0 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d  .st_size>0);.  }
332b0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f  else{.    *pResO
332c0 75 74 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 50  ut = osAccess(zP
332d0 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d  ath, W_OK|R_OK)=
332e0 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  =0;.  }.  return
332f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
33300 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69  *.**.*/.static i
33310 6e 74 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61 6d  nt mkFullPathnam
33320 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
33330 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
33340 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 70 61       /* Input pa
33350 74 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  th */.  char *zO
33360 75 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ut,             
33370 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
33380 74 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  t buffer */.  in
33390 74 20 6e 4f 75 74 20 20 20 20 20 20 20 20 20 20  t nOut          
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
333b0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
333c0 6f 66 20 62 75 66 66 65 72 20 7a 4f 75 74 20 2a  of buffer zOut *
333d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68  /.){.  int nPath
333e0 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
333f0 33 30 28 7a 50 61 74 68 29 3b 0a 20 20 69 6e 74  30(zPath);.  int
33400 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 69 66 28   iOff = 0;.  if(
33410 20 7a 50 61 74 68 5b 30 5d 21 3d 27 2f 27 20 29   zPath[0]!='/' )
33420 7b 0a 20 20 20 20 69 66 28 20 6f 73 47 65 74 63  {.    if( osGetc
33430 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74 2d 32 29  wd(zOut, nOut-2)
33440 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
33450 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
33460 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
33470 5f 42 4b 50 54 2c 20 22 67 65 74 63 77 64 22 2c  _BKPT, "getcwd",
33480 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20   zPath);.    }. 
33490 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65     iOff = sqlite
334a0 33 53 74 72 6c 65 6e 33 30 28 7a 4f 75 74 29 3b  3Strlen30(zOut);
334b0 0a 20 20 20 20 7a 4f 75 74 5b 69 4f 66 66 2b 2b  .    zOut[iOff++
334c0 5d 20 3d 20 27 2f 27 3b 0a 20 20 7d 0a 20 20 69  ] = '/';.  }.  i
334d0 66 28 20 28 69 4f 66 66 2b 6e 50 61 74 68 2b 31  f( (iOff+nPath+1
334e0 29 3e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 2f 2a  )>nOut ){.    /*
334f0 20 53 51 4c 69 74 65 20 61 73 73 75 6d 65 73 20   SQLite assumes 
33500 74 68 61 74 20 78 46 75 6c 6c 50 61 74 68 6e 61  that xFullPathna
33510 6d 65 28 29 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  me() nul-termina
33520 74 65 73 20 74 68 65 20 6f 75 74 70 75 74 20 62  tes the output b
33530 75 66 66 65 72 0a 20 20 20 20 2a 2a 20 65 76 65  uffer.    ** eve
33540 6e 20 69 66 20 69 74 20 72 65 74 75 72 6e 73 20  n if it returns 
33550 61 6e 20 65 72 72 6f 72 2e 20 20 2a 2f 0a 20 20  an error.  */.  
33560 20 20 7a 4f 75 74 5b 69 4f 66 66 5d 20 3d 20 27    zOut[iOff] = '
33570 5c 30 27 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  \0';.    return 
33580 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
33590 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
335a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
335b0 74 2d 69 4f 66 66 2c 20 26 7a 4f 75 74 5b 69 4f  t-iOff, &zOut[iO
335c0 66 66 5d 2c 20 22 25 73 22 2c 20 7a 50 61 74 68  ff], "%s", zPath
335d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
335e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
335f0 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
33600 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
33610 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 54  full pathname. T
33620 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74 68  he relative path
33630 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61 73  .** is stored as
33640 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65   a nul-terminate
33650 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20  d string in the 
33660 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20 74  buffer pointed t
33670 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20 0a  o by.** zPath. .
33680 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e 74  **.** zOut point
33690 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66  s to a buffer of
336a0 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74 65   at least sqlite
336b0 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65  3_vfs.mxPathname
336c0 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20 74   bytes .** (in t
336d0 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50 41  his case, MAX_PA
336e0 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20 54  THNAME bytes). T
336f0 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73 20  he full-path is 
33700 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74 68  written to.** th
33710 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72 65  is buffer before
33720 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
33730 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 75  tatic int unixFu
33740 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71  llPathname(.  sq
33750 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
33760 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
33770 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
33780 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ject */.  const 
33790 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
337a0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69          /* Possi
337b0 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e 70  bly relative inp
337c0 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e 74  ut path */.  int
337d0 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20 20   nOut,          
337e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
337f0 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75 66  ze of output buf
33800 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  fer in bytes */.
33810 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20 20    char *zOut    
33820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33830 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
33840 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64 65 66 69   */.){.#if !defi
33850 6e 65 64 28 48 41 56 45 5f 52 45 41 44 4c 49 4e  ned(HAVE_READLIN
33860 4b 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 48  K) || !defined(H
33870 41 56 45 5f 4c 53 54 41 54 29 0a 20 20 72 65 74  AVE_LSTAT).  ret
33880 75 72 6e 20 6d 6b 46 75 6c 6c 50 61 74 68 6e 61  urn mkFullPathna
33890 6d 65 28 7a 50 61 74 68 2c 20 7a 4f 75 74 2c 20  me(zPath, zOut, 
338a0 6e 4f 75 74 29 3b 0a 23 65 6c 73 65 0a 20 20 69  nOut);.#else.  i
338b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
338c0 4b 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  K;.  int nByte;.
338d0 20 20 69 6e 74 20 6e 4c 69 6e 6b 20 3d 20 31 3b    int nLink = 1;
338e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
338f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 79 6d  /* Number of sym
33900 62 6f 6c 69 63 20 6c 69 6e 6b 73 20 66 6f 6c 6c  bolic links foll
33910 6f 77 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  owed so far */. 
33920 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
33930 20 3d 20 7a 50 61 74 68 3b 20 20 20 20 20 20 2f   = zPath;      /
33940 2a 20 49 6e 70 75 74 20 70 61 74 68 20 66 6f 72  * Input path for
33950 20 65 61 63 68 20 69 74 65 72 61 74 69 6f 6e 20   each iteration 
33960 6f 66 20 6c 6f 6f 70 20 2a 2f 0a 20 20 63 68 61  of loop */.  cha
33970 72 20 2a 7a 44 65 6c 20 3d 20 30 3b 0a 0a 20 20  r *zDel = 0;..  
33980 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
33990 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
339a0 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
339b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
339c0 73 29 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f  s);..  /* It's o
339d0 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  dd to simulate a
339e0 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c  n io-error here,
339f0 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73   but really this
33a00 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73   is just.  ** us
33a10 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72  ing the io-error
33a20 20 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20   infrastructure 
33a30 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
33a40 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73  ite handles this
33a50 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66  .  ** function f
33a60 61 69 6c 69 6e 67 2e 20 54 68 69 73 20 66 75 6e  ailing. This fun
33a70 63 74 69 6f 6e 20 63 6f 75 6c 64 20 66 61 69 6c  ction could fail
33a80 20 69 66 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65   if, for example
33a90 2c 20 74 68 65 0a 20 20 2a 2a 20 63 75 72 72 65  , the.  ** curre
33aa0 6e 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63  nt working direc
33ab0 74 6f 72 79 20 68 61 73 20 62 65 65 6e 20 75 6e  tory has been un
33ac0 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20 53  linked..  */.  S
33ad0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
33ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
33af0 52 4f 52 20 29 3b 0a 0a 20 20 64 6f 20 7b 0a 0a  ROR );..  do {..
33b00 20 20 20 20 2f 2a 20 43 61 6c 6c 20 73 74 61 74      /* Call stat
33b10 28 29 20 6f 6e 20 70 61 74 68 20 7a 49 6e 2e 20  () on path zIn. 
33b20 53 65 74 20 62 4c 69 6e 6b 20 74 6f 20 74 72 75  Set bLink to tru
33b30 65 20 69 66 20 74 68 65 20 70 61 74 68 20 69 73  e if the path is
33b40 20 61 20 73 79 6d 62 6f 6c 69 63 0a 20 20 20 20   a symbolic.    
33b50 2a 2a 20 6c 69 6e 6b 2c 20 6f 72 20 66 61 6c 73  ** link, or fals
33b60 65 20 6f 74 68 65 72 77 69 73 65 2e 20 20 2a 2f  e otherwise.  */
33b70 0a 20 20 20 20 69 6e 74 20 62 4c 69 6e 6b 20 3d  .    int bLink =
33b80 20 30 3b 0a 20 20 20 20 73 74 72 75 63 74 20 73   0;.    struct s
33b90 74 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28  tat buf;.    if(
33ba0 20 6f 73 4c 73 74 61 74 28 7a 49 6e 2c 20 26 62   osLstat(zIn, &b
33bb0 75 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  uf)!=0 ){.      
33bc0 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e  if( errno!=ENOEN
33bd0 54 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  T ){.        rc 
33be0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
33bf0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
33c00 4b 50 54 2c 20 22 6c 73 74 61 74 22 2c 20 7a 49  KPT, "lstat", zI
33c10 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
33c20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 4c 69  }else{.      bLi
33c30 6e 6b 20 3d 20 53 5f 49 53 4c 4e 4b 28 62 75 66  nk = S_ISLNK(buf
33c40 2e 73 74 5f 6d 6f 64 65 29 3b 0a 20 20 20 20 7d  .st_mode);.    }
33c50 0a 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 20  ..    if( bLink 
33c60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 65  ){.      if( zDe
33c70 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
33c80 7a 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDel = sqlite3_m
33c90 61 6c 6c 6f 63 28 6e 4f 75 74 29 3b 0a 20 20 20  alloc(nOut);.   
33ca0 20 20 20 20 20 69 66 28 20 7a 44 65 6c 3d 3d 30       if( zDel==0
33cb0 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
33cc0 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
33cd0 20 7d 65 6c 73 65 20 69 66 28 20 2b 2b 6e 4c 69   }else if( ++nLi
33ce0 6e 6b 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 53 59  nk>SQLITE_MAX_SY
33cf0 4d 4c 49 4e 4b 53 20 29 7b 0a 20 20 20 20 20 20  MLINKS ){.      
33d00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
33d10 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
33d20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
33d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
33d40 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65 20 3d  .        nByte =
33d50 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a 49 6e 2c   osReadlink(zIn,
33d60 20 7a 44 65 6c 2c 20 6e 4f 75 74 2d 31 29 3b 0a   zDel, nOut-1);.
33d70 20 20 20 20 20 20 20 20 69 66 28 20 6e 42 79 74          if( nByt
33d80 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e<0 ){.         
33d90 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
33da0 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  or(SQLITE_CANTOP
33db0 45 4e 5f 42 4b 50 54 2c 20 22 72 65 61 64 6c 69  EN_BKPT, "readli
33dc0 6e 6b 22 2c 20 7a 49 6e 29 3b 0a 20 20 20 20 20  nk", zIn);.     
33dd0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33de0 20 20 20 20 69 66 28 20 7a 44 65 6c 5b 30 5d 21      if( zDel[0]!
33df0 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
33e00 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
33e10 20 20 20 20 20 20 20 66 6f 72 28 6e 20 3d 20 73         for(n = s
33e20 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
33e30 49 6e 29 3b 20 6e 3e 30 20 26 26 20 7a 49 6e 5b  In); n>0 && zIn[
33e40 6e 2d 31 5d 21 3d 27 2f 27 3b 20 6e 2d 2d 29 3b  n-1]!='/'; n--);
33e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
33e60 20 6e 42 79 74 65 2b 6e 2b 31 3e 6e 4f 75 74 20   nByte+n+1>nOut 
33e70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
33e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
33e90 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
33ea0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
33eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
33ec0 6d 6f 76 65 28 26 7a 44 65 6c 5b 6e 5d 2c 20 7a  move(&zDel[n], z
33ed0 44 65 6c 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20  Del, nByte+1);. 
33ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
33ef0 63 70 79 28 7a 44 65 6c 2c 20 7a 49 6e 2c 20 6e  cpy(zDel, zIn, n
33f00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
33f10 20 6e 42 79 74 65 20 2b 3d 20 6e 3b 0a 20 20 20   nByte += n;.   
33f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
33f30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
33f40 20 7a 44 65 6c 5b 6e 42 79 74 65 5d 20 3d 20 27   zDel[nByte] = '
33f50 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  \0';.        }. 
33f60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 49       }..      zI
33f70 6e 20 3d 20 7a 44 65 6c 3b 0a 20 20 20 20 7d 0a  n = zDel;.    }.
33f80 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
33f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 49  =SQLITE_OK || zI
33fa0 6e 21 3d 7a 4f 75 74 20 7c 7c 20 7a 49 6e 5b 30  n!=zOut || zIn[0
33fb0 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 20 20 69 66  ]=='/' );.    if
33fc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
33fd0 26 26 20 7a 49 6e 21 3d 7a 4f 75 74 20 29 7b 0a  && zIn!=zOut ){.
33fe0 20 20 20 20 20 20 72 63 20 3d 20 6d 6b 46 75 6c        rc = mkFul
33ff0 6c 50 61 74 68 6e 61 6d 65 28 7a 49 6e 2c 20 7a  lPathname(zIn, z
34000 4f 75 74 2c 20 6e 4f 75 74 29 3b 0a 20 20 20 20  Out, nOut);.    
34010 7d 0a 20 20 20 20 69 66 28 20 62 4c 69 6e 6b 3d  }.    if( bLink=
34020 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
34030 7a 49 6e 20 3d 20 7a 4f 75 74 3b 0a 20 20 7d 77  zIn = zOut;.  }w
34040 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
34050 5f 4f 4b 20 29 3b 0a 0a 20 20 73 71 6c 69 74 65  _OK );..  sqlite
34060 33 5f 66 72 65 65 28 7a 44 65 6c 29 3b 0a 20 20  3_free(zDel);.  
34070 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
34080 66 20 20 20 2f 2a 20 48 41 56 45 5f 52 45 41 44  f   /* HAVE_READ
34090 4c 49 4e 4b 20 26 26 20 48 41 56 45 5f 4c 53 54  LINK && HAVE_LST
340a0 41 54 20 2a 2f 0a 7d 0a 0a 0a 23 69 66 6e 64 65  AT */.}...#ifnde
340b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
340c0 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a  AD_EXTENSION./*.
340d0 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f  ** Interfaces fo
340e0 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72  r opening a shar
340f0 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64  ed library, find
34100 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73  ing entry points
34110 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73  .** within the s
34120 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61  hared library, a
34130 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73  nd closing the s
34140 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a  hared library..*
34150 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63  /.#include <dlfc
34160 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64  n.h>.static void
34170 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c   *unixDlOpen(sql
34180 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
34190 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
341a0 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55  Filename){.  UNU
341b0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
341c0 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
341d0 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d   dlopen(zFilenam
341e0 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54  e, RTLD_NOW | RT
341f0 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f  LD_GLOBAL);.}../
34200 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c  *.** SQLite call
34210 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
34220 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65  immediately afte
34230 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  r a call to unix
34240 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e  DlSym() or.** un
34250 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73  ixDlOpen() fails
34260 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c   (returns a null
34270 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20   pointer). If a 
34280 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72  more detailed er
34290 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69  ror.** message i
342a0 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20  s available, it 
342b0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42  is written to zB
342c0 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72  ufOut. If no err
342d0 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73  or message.** is
342e0 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66   available, zBuf
342f0 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f  Out is left unmo
34300 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74  dified and SQLit
34310 65 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74  e uses a default
34320 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67  .** error messag
34330 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
34340 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71  d unixDlError(sq
34350 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73  lite3_vfs *NotUs
34360 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68  ed, int nBuf, ch
34370 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20  ar *zBufOut){.  
34380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
34390 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
343a0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
343b0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
343c0 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72  );.  zErr = dler
343d0 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72  ror();.  if( zEr
343e0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
343f0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20  _snprintf(nBuf, 
34400 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a  zBufOut, "%s", z
34410 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  Err);.  }.  unix
34420 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
34430 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e  static void (*un
34440 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  ixDlSym(sqlite3_
34450 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f  vfs *NotUsed, vo
34460 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
34470 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a  r*zSym))(void){.
34480 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77    /* .  ** GCC w
34490 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72  ith -pedantic-er
344a0 72 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43  rors says that C
344b0 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f  90 does not allo
344c0 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a  w a void* to be.
344d0 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61    ** cast into a
344e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
344f0 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74  nction.  And yet
34500 20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73   the library dls
34510 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a  ym() routine.  *
34520 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64  * returns a void
34530 2a 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c  * which is reall
34540 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  y a pointer to a
34550 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68   function.  So h
34560 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73  ow do we.  ** us
34570 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d  e dlsym() with -
34580 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f  pedantic-errors?
34590 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  **.  ** Varia
345a0 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64  ble x below is d
345b0 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  efined to be a p
345c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
345d0 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a  tion taking.  **
345e0 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64   parameters void
345f0 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72  * and const char
34600 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20  * and returning 
34610 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
34620 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65  unction..  ** We
34630 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79   initialize x by
34640 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20   assigning it a 
34650 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
34660 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e  lsym() function.
34670 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69  .  ** (That assi
34680 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20  gnment requires 
34690 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77  a cast.)  Then w
346a0 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74  e call the funct
346b0 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20  ion that.  ** x 
346c0 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a  points to.  .  *
346d0 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b  *.  ** This work
346e0 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b  -around is unlik
346f0 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72  ely to work corr
34700 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73  ectly on any sys
34710 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79  tem where.  ** y
34720 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74  ou really cannot
34730 20 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e   cast a function
34740 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f   pointer into vo
34750 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20  id*.  But then, 
34760 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65  on the.  ** othe
34770 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20  r hand, dlsym() 
34780 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  will not work on
34790 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65   such a system e
347a0 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76  ither, so we hav
347b0 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c  e.  ** not reall
347c0 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e  y lost anything.
347d0 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28  .  */.  void (*(
347e0 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20  *x)(void*,const 
347f0 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20  char*))(void);. 
34800 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
34810 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20  R(NotUsed);.  x 
34820 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69  = (void(*(*)(voi
34830 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
34840 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20  (void))dlsym;.  
34850 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a  return (*x)(p, z
34860 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Sym);.}.static v
34870 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28  oid unixDlClose(
34880 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
34890 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e  Used, void *pHan
348a0 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  dle){.  UNUSED_P
348b0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
348c0 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61  );.  dlclose(pHa
348d0 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f  ndle);.}.#else /
348e0 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  * if SQLITE_OMIT
348f0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
34900 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20  is defined: */. 
34910 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f   #define unixDlO
34920 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65  pen  0.  #define
34930 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20   unixDlError 0. 
34940 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53   #define unixDlS
34950 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65  ym   0.  #define
34960 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23   unixDlClose 0.#
34970 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  endif../*.** Wri
34980 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
34990 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20   random data to 
349a0 74 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66  the supplied buf
349b0 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
349c0 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64  tic int unixRand
349d0 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76  omness(sqlite3_v
349e0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74  fs *NotUsed, int
349f0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
34a00 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  f){.  UNUSED_PAR
34a10 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
34a20 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f  .  assert((size_
34a30 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28  t)nBuf>=(sizeof(
34a40 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69  time_t)+sizeof(i
34a50 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  nt)));..  /* We 
34a60 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  have to initiali
34a70 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65  ze zBuf to preve
34a80 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d  nt valgrind from
34a90 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20   reporting.  ** 
34aa0 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70  errors.  The rep
34ab0 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76  orts issued by v
34ac0 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f  algrind are inco
34ad0 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64  rrect - we would
34ae0 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61  .  ** prefer tha
34af0 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73  t the randomness
34b00 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79   be increased by
34b10 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74   making use of t
34b20 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61  he.  ** uninitia
34b30 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a  lized space in z
34b40 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69  Buf - but valgri
34b50 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74  nd errors tend t
34b60 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d  o worry.  ** som
34b70 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72  e users.  Rather
34b80 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20   than argue, it 
34b90 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73  seems easier jus
34ba0 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a  t to initialize.
34bb0 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61    ** the whole a
34bc0 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65  rray and silence
34bd0 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20   valgrind, even 
34be0 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65  if that means le
34bf0 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20  ss randomness.  
34c00 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d  ** in the random
34c10 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   seed..  **.  **
34c20 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69   When testing, i
34c30 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66  nitializing zBuf
34c40 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c  [] to zero is al
34c50 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d  l we do.  That m
34c60 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77  eans.  ** that w
34c70 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
34c80 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d   same random num
34c90 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54  ber sequence.  T
34ca0 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20  his makes the.  
34cb0 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61  ** tests repeata
34cc0 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  ble..  */.  mems
34cd0 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
34ce0 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50  );.  randomnessP
34cf0 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29  id = osGetpid(0)
34d00 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ;  .#if !defined
34d10 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
34d20 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
34d30 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53  _OMIT_RANDOMNESS
34d40 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64  ).  {.    int fd
34d50 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20  , got;.    fd = 
34d60 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65  robust_open("/de
34d70 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44  v/urandom", O_RD
34d80 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66  ONLY, 0);.    if
34d90 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ( fd<0 ){.      
34da0 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20  time_t t;.      
34db0 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20  time(&t);.      
34dc0 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c  memcpy(zBuf, &t,
34dd0 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20   sizeof(t));.   
34de0 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
34df0 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e  sizeof(t)], &ran
34e00 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65  domnessPid, size
34e10 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
34e20 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ));.      assert
34e30 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65  ( sizeof(t)+size
34e40 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
34e50 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  )<=(size_t)nBuf 
34e60 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20  );.      nBuf = 
34e70 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65  sizeof(t) + size
34e80 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64  of(randomnessPid
34e90 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34ea0 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73      do{ got = os
34eb0 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e  Read(fd, zBuf, n
34ec0 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f  Buf); }while( go
34ed0 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49  t<0 && errno==EI
34ee0 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62  NTR );.      rob
34ef0 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c  ust_close(0, fd,
34f00 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
34f10 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  }.  }.#endif.  r
34f20 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a  eturn nBuf;.}...
34f30 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20  /*.** Sleep for 
34f40 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20  a little while. 
34f50 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75   Return the amou
34f60 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74  nt of time slept
34f70 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  ..** The argumen
34f80 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  t is the number 
34f90 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
34fa0 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70  we want to sleep
34fb0 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  ..** The return 
34fc0 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
34fd0 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
34fe0 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74  nds of sleep act
34ff0 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74  ually.** request
35000 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65  ed from the unde
35010 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
35020 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65   system, a numbe
35030 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74  r which.** might
35040 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
35050 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
35060 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e   argument, but n
35070 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20  ot less.** than 
35080 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  the argument..*/
35090 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
350a0 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66  Sleep(sqlite3_vf
350b0 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
350c0 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23  microseconds){.#
350d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
350e0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
350f0 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63  sp;..  sp.tv_sec
35100 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20   = microseconds 
35110 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e  / 1000000;.  sp.
35120 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f  tv_nsec = (micro
35130 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30  seconds % 100000
35140 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e  0) * 1000;.  nan
35150 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c  osleep(&sp, NULL
35160 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
35170 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
35180 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65    return microse
35190 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66  conds;.#elif def
351a0 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
351b0 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
351c0 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73  .  usleep(micros
351d0 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45  econds);.  UNUSE
351e0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
351f0 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  sed);.  return m
35200 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c  icroseconds;.#el
35210 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73  se.  int seconds
35220 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73   = (microseconds
35230 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30  +999999)/1000000
35240 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64  ;.  sleep(second
35250 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  s);.  UNUSED_PAR
35260 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
35270 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64  .  return second
35280 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69  s*1000000;.#endi
35290 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  f.}../*.** The f
352a0 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
352b0 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e  e, if set to a n
352c0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69  on-zero value, i
352d0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
352e0 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
352f0 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20  f seconds since 
35300 31 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64  1970 and is used
35310 20 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75   to set the resu
35320 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lt of.** sqlite3
35330 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20  OsCurrentTime() 
35340 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a  during testing..
35350 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
35360 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
35370 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
35380 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73   0;  /* Fake sys
35390 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f  tem time in seco
353a0 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20  nds since 1970. 
353b0 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  */.#endif../*.**
353c0 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
353d0 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
353e0 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
353f0 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69   Time).  Write i
35400 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68  nto *piNow.** th
35410 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  e current time a
35420 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
35430 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74  ian Day number t
35440 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e  imes 86_400_000.
35450 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f    In.** other wo
35460 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20  rds, write into 
35470 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65  *piNow the numbe
35480 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
35490 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69  s since the Juli
354a0 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e  an.** epoch of n
354b0 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68  oon in Greenwich
354c0 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c   on November 24,
354d0 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64   4714 B.C accord
354e0 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72  ing to the.** pr
354f0 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61  oleptic Gregoria
35500 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a  n calendar..**.*
35510 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65  * On success, re
35520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
35530 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   Return SQLITE_E
35540 52 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65  RROR if the time
35550 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61   and date .** ca
35560 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a  nnot be found..*
35570 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
35580 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
35590 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  4(sqlite3_vfs *N
355a0 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f  otUsed, sqlite3_
355b0 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20  int64 *piNow){. 
355c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71   static const sq
355d0 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78  lite3_int64 unix
355e0 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35  Epoch = 24405875
355f0 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  *(sqlite3_int64)
35600 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72  8640000;.  int r
35610 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  c = SQLITE_OK;.#
35620 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45  if defined(NO_GE
35630 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74  TTOD).  time_t t
35640 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20  ;.  time(&t);.  
35650 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74  *piNow = ((sqlit
35660 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30  e3_int64)t)*1000
35670 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65   + unixEpoch;.#e
35680 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  lif OS_VXWORKS. 
35690 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
356a0 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67   sNow;.  clock_g
356b0 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41  ettime(CLOCK_REA
356c0 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20  LTIME, &sNow);. 
356d0 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70   *piNow = unixEp
356e0 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69  och + 1000*(sqli
356f0 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74  te3_int64)sNow.t
35700 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f  v_sec + sNow.tv_
35710 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65  nsec/1000000;.#e
35720 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d  lse.  struct tim
35730 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f  eval sNow;.  (vo
35740 69 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28  id)gettimeofday(
35750 26 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43  &sNow, 0);  /* C
35760 61 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e  annot fail given
35770 20 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73   valid arguments
35780 20 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75   */.  *piNow = u
35790 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a  nixEpoch + 1000*
357a0 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73  (sqlite3_int64)s
357b0 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f  Now.tv_sec + sNo
357c0 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a  w.tv_usec/1000;.
357d0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
357e0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28  QLITE_TEST.  if(
357f0 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
35800 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69  _time ){.    *pi
35810 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69  Now = 1000*(sqli
35820 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65  te3_int64)sqlite
35830 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b  3_current_time +
35840 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a   unixEpoch;.  }.
35850 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f  #endif.  UNUSED_
35860 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
35870 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  d);.  return rc;
35880 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
35890 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
358a0 45 44 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  ED./*.** Find th
358b0 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 28  e current time (
358c0 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f  in Universal Coo
358d0 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e 20  rdinated Time). 
358e0 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63 75   Write the.** cu
358f0 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20 64  rrent time and d
35900 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ate as a Julian 
35910 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20  Day number into 
35920 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65  *prNow and.** re
35930 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20  turn 0.  Return 
35940 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e  1 if the time an
35950 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65  d date cannot be
35960 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
35970 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e  c int unixCurren
35980 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
35990 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f 75 62  s *NotUsed, doub
359a0 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20 73 71  le *prNow){.  sq
359b0 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 20 3d 20  lite3_int64 i = 
359c0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 55  0;.  int rc;.  U
359d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
359e0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 63 20 3d  NotUsed);.  rc =
359f0 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65   unixCurrentTime
35a00 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a 20 20  Int64(0, &i);.  
35a10 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34 30 30  *prNow = i/86400
35a20 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72 6e 20  000.0;.  return 
35a30 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  rc;.}.#else.# de
35a40 66 69 6e 65 20 75 6e 69 78 43 75 72 72 65 6e 74  fine unixCurrent
35a50 54 69 6d 65 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  Time 0.#endif../
35a60 2a 0a 2a 2a 20 54 68 65 20 78 47 65 74 4c 61 73  *.** The xGetLas
35a70 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f 64 20  tError() method 
35a80 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 72  is designed to r
35a90 65 74 75 72 6e 20 61 20 62 65 74 74 65 72 0a 2a  eturn a better.*
35aa0 2a 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  * low-level erro
35ab0 72 20 6d 65 73 73 61 67 65 20 77 68 65 6e 20 6f  r message when o
35ac0 70 65 72 61 74 69 6e 67 2d 73 79 73 74 65 6d 20  perating-system 
35ad0 70 72 6f 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70  problems come up
35ae0 0a 2a 2a 20 64 75 72 69 6e 67 20 53 51 4c 69 74  .** during SQLit
35af0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4f 6e  e operation.  On
35b00 6c 79 20 74 68 65 20 69 6e 74 65 67 65 72 20 72  ly the integer r
35b10 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 63 75  eturn code is cu
35b20 72 72 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64 2e  rrently.** used.
35b30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
35b40 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 28  nixGetLastError(
35b50 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
35b60 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65  Used, int NotUse
35b70 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55 73 65  d2, char *NotUse
35b80 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d3){.  UNUSED_PA
35b90 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
35ba0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
35bb0 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29 3b 0a  ETER(NotUsed2);.
35bc0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
35bd0 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a 20 20  ER(NotUsed3);.  
35be0 72 65 74 75 72 6e 20 65 72 72 6e 6f 3b 0a 7d 0a  return errno;.}.
35bf0 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
35c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
35c10 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
35c20 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
35c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35c40 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
35c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35c90 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
35ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35ce0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
35cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35d00 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
35d10 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
35d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35d30 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
35d40 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
35d50 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
35d60 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
35d70 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
35d80 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
35d90 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
35da0 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
35db0 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
35dc0 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
35dd0 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
35de0 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
35df0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
35e00 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
35e10 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
35e20 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
35e30 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
35e40 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
35e50 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
35e60 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
35e70 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
35e80 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
35e90 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
35ea0 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
35eb0 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
35ec0 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
35ed0 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
35ee0 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
35ef0 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
35f00 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
35f10 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
35f20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
35f30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
35f40 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
35f50 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
35f60 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
35f70 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
35f80 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
35f90 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
35fa0 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
35fb0 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
35fc0 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
35fd0 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
35fe0 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
35ff0 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
36000 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
36010 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
36020 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
36030 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
36040 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
36050 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
36060 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
36070 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
36080 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
36090 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
360a0 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
360b0 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
360c0 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
360d0 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
360e0 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
360f0 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
36100 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
36110 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
36120 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
36130 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
36140 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
36150 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
36160 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
36170 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
36180 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
36190 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
361a0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
361b0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
361c0 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
361d0 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
361e0 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
361f0 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
36200 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
36210 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
36220 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
36230 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
36240 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
36250 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
36260 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
36270 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
36280 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
36290 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
362a0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
362b0 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
362c0 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
362d0 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
362e0 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
362f0 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
36300 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
36310 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
36320 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
36330 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
36340 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
36350 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
36360 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
36370 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
36380 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
36390 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
363a0 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
363b0 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
363c0 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
363d0 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
363e0 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
363f0 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
36400 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
36410 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
36420 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
36430 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
36440 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
36450 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
36460 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
36470 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
36480 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
36490 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
364a0 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
364b0 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
364c0 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
364d0 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
364e0 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
364f0 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
36500 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
36510 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
36520 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
36530 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
36540 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
36550 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
36560 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
36570 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
36580 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
36590 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
365a0 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
365b0 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
365c0 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
365d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
365e0 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
365f0 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
36600 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
36610 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
36620 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
36630 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
36640 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
36650 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
36660 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
36670 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
36680 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b  E_FCNTL_SET_LOCK
36690 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
366a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
366b0 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
366c0 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
366d0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
366e0 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
366f0 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
36700 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
36710 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
36720 20 20 20 20 20 20 20 20 20 20 20 20 26 3c 70 72              &<pr
36730 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
36740 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
36750 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
36760 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
36770 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
36780 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
36790 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
367a0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
367b0 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
367c0 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
367d0 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
367e0 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
367f0 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
36800 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
36810 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
36820 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
36830 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
36840 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
36850 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
36860 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
36870 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
36880 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
36890 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
368a0 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
368b0 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
368c0 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
368d0 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
368e0 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
368f0 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
36900 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
36910 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
36920 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
36930 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
36940 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
36950 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
36960 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
36970 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
36980 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
36990 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
369a0 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
369b0 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
369c0 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
369d0 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
369e0 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
369f0 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
36a00 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
36a10 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
36a20 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
36a30 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
36a40 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
36a50 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
36a60 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
36a70 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
36a80 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
36a90 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
36aa0 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
36ab0 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
36ac0 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
36ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
36ae0 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
36af0 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
36b00 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
36b10 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
36b20 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
36b30 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
36b40 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
36b50 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
36b60 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
36b70 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
36b80 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
36b90 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
36ba0 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
36bb0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
36bc0 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
36bd0 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
36be0 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
36bf0 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
36c00 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
36c10 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
36c20 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
36c30 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
36c40 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
36c50 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
36c60 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
36c70 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
36c80 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
36c90 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
36ca0 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
36cb0 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
36cc0 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
36cd0 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
36ce0 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
36cf0 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
36d00 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
36d10 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
36d20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
36d30 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
36d40 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
36d50 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
36d60 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
36d70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
36d80 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
36d90 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
36da0 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
36db0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
36dc0 73 74 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74 65  st, or its conte
36dd0 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
36de0 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
36df0 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
36e00 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
36e10 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
36e20 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
36e30 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
36e40 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
36e50 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
36e60 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
36e70 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
36e80 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
36e90 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
36ea0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
36eb0 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
36ec0 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
36ed0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
36ee0 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
36ef0 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
36f00 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
36f10 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
36f20 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
36f30 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
36f40 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
36f50 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
36f60 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
36f70 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
36f80 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
36f90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36fa0 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
36fb0 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
36fc0 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
36fd0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
36fe0 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
36ff0 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
37000 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
37010 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
37020 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
37030 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
37040 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
37050 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
37060 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
37070 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
37080 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
37090 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
370a0 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
370b0 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
370c0 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
370d0 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
370e0 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
370f0 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
37100 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
37110 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
37120 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
37130 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
37140 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
37150 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
37160 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
37170 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
37180 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
37190 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
371a0 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
371b0 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
371c0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
371d0 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
371e0 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
371f0 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
37200 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
37210 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
37220 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
37230 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
37240 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
37250 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
37260 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
37270 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
37280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37290 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
372a0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
372b0 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
372c0 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
372d0 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
372e0 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
372f0 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
37300 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
37310 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
37320 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
37330 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
37340 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
37350 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
37360 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
37370 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
37380 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
37390 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
373a0 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
373b0 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
373c0 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
373d0 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
373e0 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
373f0 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
37400 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
37410 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
37420 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
37430 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
37440 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
37450 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
37460 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
37470 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
37480 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
37490 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
374a0 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
374b0 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
374c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
374d0 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
374e0 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
374f0 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
37500 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
37510 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
37520 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
37530 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
37540 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
37550 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
37560 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
37570 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
37580 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
37590 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
375a0 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
375b0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
375c0 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
375d0 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
375e0 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
375f0 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
37600 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
37610 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
37620 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
37630 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
37640 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
37650 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
37660 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
37670 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
37680 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
37690 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
376a0 6c 65 73 20 28 65 78 70 6c 69 63 69 74 6c 79 20  les (explicitly 
376b0 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49  calling the SQLI
376c0 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
376d0 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
376e0 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
376f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
37700 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
37710 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
37720 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
37730 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
37740 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
37750 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
37760 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
37770 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
37780 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
37790 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
377a0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
377b0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
377c0 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
377d0 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
377e0 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
377f0 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
37800 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
37810 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
37820 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37830 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
37840 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
37850 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
37860 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
37870 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
37880 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
37890 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
378a0 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
378b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
378c0 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
378d0 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
378e0 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
378f0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
37900 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
37910 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
37920 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
37930 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
37940 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
37950 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
37960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37970 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
37980 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
37990 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
379a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
379b0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
379c0 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
379d0 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  less */.  int nF
379e0 61 69 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  ails;           
379f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
37a00 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e 67   of conch taking
37a10 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
37a20 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43  oid *oldLockingC
37a30 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f  ontext;     /* O
37a40 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63  riginal lockingc
37a50 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72  ontext to restor
37a60 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  e on close */.  
37a70 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
37a80 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65  ds const *pOldMe
37a90 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69  thod;     /* Ori
37aa0 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64  ginal I/O method
37ab0 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d  s for close */.}
37ac0 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72  ;../* .** The pr
37ad0 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  oxy lock file pa
37ae0 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  th for the datab
37af0 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73  ase at dbPath is
37b00 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50   written into lP
37b10 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d  ath, .** which m
37b20 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c  ust point to val
37b30 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d  id, writable mem
37b40 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ory large enough
37b50 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65   for a maxLen le
37b60 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74  ngth.** file pat
37b70 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h. .*/.static in
37b80 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
37b90 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
37ba0 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
37bb0 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
37bc0 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
37bd0 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
37be0 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
37bf0 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
37c00 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
37c10 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
37c20 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
37c30 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
37c40 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
37c50 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66   {.    if( !conf
37c60 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
37c70 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
37c80 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a  ath, maxLen) ){.
37c90 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
37ca0 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69  GETLOCKPATH  fai
37cb0 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20  led %s errno=%d 
37cc0 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
37cd0 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c            lPath,
37ce0 20 65 72 72 6e 6f 2c 20 6f 73 47 65 74 70 69 64   errno, osGetpid
37cf0 28 30 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (0)));.      ret
37d00 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
37d10 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
37d20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
37d30 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
37d40 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
37d50 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
37d60 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
37d70 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
37d80 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
37d90 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
37da0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
37db0 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
37dc0 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
37dd0 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
37de0 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
37df0 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
37e00 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
37e10 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
37e20 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
37e30 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
37e40 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
37e50 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
37e60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
37e70 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
37e80 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
37e90 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
37ea0 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
37eb0 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
37ec0 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
37ed0 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
37ee0 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
37ef0 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
37f00 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
37f10 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 6f 73  %d\n", lPath, os
37f20 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72  Getpid(0)));.  r
37f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
37f40 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61  .}../* . ** Crea
37f50 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  tes the lock fil
37f60 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e  e and any missin
37f70 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e  g directories in
37f80 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74   lockPath. */.st
37f90 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
37fa0 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  eateLockPath(con
37fb0 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  st char *lockPat
37fc0 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e  h){.  int i, len
37fd0 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58  ;.  char buf[MAX
37fe0 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
37ff0 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20  start = 0;.  .  
38000 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21  assert(lockPath!
38010 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79  =NULL);.  /* try
38020 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74   to create all t
38030 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
38040 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20  directories */. 
38050 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
38060 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  en(lockPath);.  
38070 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[0] = lockPat
38080 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31  h[0];.  for( i=1
38090 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a  ; i<len; i++ ){.
380a0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68      if( lockPath
380b0 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69  [i] == '/' && (i
380c0 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b   - start > 0) ){
380d0 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d  .      /* only m
380e0 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72  kdir if leaf dir
380f0 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f   != "." or "/" o
38100 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20  r ".." */.      
38110 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c  if( i-start>2 ||
38120 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20   (i-start==1 && 
38130 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
38140 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  ' && buf[start] 
38150 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20  != '/') .       
38160 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32    || (i-start==2
38170 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
38180 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
38190 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b  rt+1] != '.') ){
381a0 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d  .        buf[i]=
381b0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66  '\0';.        if
381c0 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20 53  ( osMkdir(buf, S
381d0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
381e0 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
381f0 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
38200 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
38210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
38220 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
38230 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
38240 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
38250 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
38260 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20  ing %s, ".      
38270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
38280 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20  '%s' proxy lock 
38290 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
382a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
382b0 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72          buf, str
382c0 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b  error(err), lock
382d0 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30  Path, osGetpid(0
382e0 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
382f0 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
38300 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
38310 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
38320 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
38330 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
38340 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
38350 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
38360 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
38370 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
38380 69 64 3d 25 64 5c 6e 22 2c 6c 6f 63 6b 50 61 74  id=%d\n",lockPat
38390 68 2c 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  h,osGetpid(0)));
383a0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
383b0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
383c0 65 77 20 56 46 53 20 66 69 6c 65 20 64 65 73 63  ew VFS file desc
383d0 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64 20 69  riptor (stored i
383e0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
383f0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
38400 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20 6f 70  3_malloc) and op
38410 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  en the file name
38420 64 20 22 70 61 74 68 22 20 69 6e 20 74 68 65 20  d "path" in the 
38430 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
38440 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  .**.** The calle
38450 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
38460 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20 63 6c   not only for cl
38470 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  osing the file d
38480 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62 75 74  escriptor.** but
38490 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65 69 6e   also for freein
384a0 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 73 73  g the memory ass
384b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
384c0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
384d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
384e0 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69 78 46  proxyCreateUnixF
384f0 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74 20 63  ile(.    const c
38500 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
38510 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20 74 68    /* path for th
38520 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65 20 2a  e new unixFile *
38530 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  /.    unixFile *
38540 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20 20 2f  *ppFile,       /
38550 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65 61 74  * unixFile creat
38560 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65 64