/ Hex Artifact Content
Login

Artifact cf72e06e15839ebe7121e01d3eebf256c039b0ca:


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 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  >.# include <sys
0c80: 2f 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75  /file.h>.# inclu
0c90: 64 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e  de <sys/param.h>
0ca0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
0cb0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
0cc0: 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64  _STYLE */..#if d
0cd0: 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
0ce0: 29 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f  ) && ((__MAC_OS_
0cf0: 58 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45  X_VERSION_MIN_RE
0d00: 51 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c  QUIRED > 1050) |
0d10: 7c 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  | \.            
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
0d30: 5f 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53  __IPHONE_OS_VERS
0d40: 49 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44  ION_MIN_REQUIRED
0d50: 20 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20   > 2000)).#  if 
0d60: 28 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54  (!defined(TARGET
0d70: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c  _OS_EMBEDDED) ||
0d80: 20 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45   (TARGET_OS_EMBE
0d90: 44 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20  DDED==0)) \.    
0da0: 20 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28     && (!defined(
0db0: 54 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49  TARGET_IPHONE_SI
0dc0: 4d 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52  MULATOR) || (TAR
0dd0: 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c  GET_IPHONE_SIMUL
0de0: 41 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64  ATOR==0)).#    d
0df0: 65 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f  efine HAVE_GETHO
0e00: 53 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65  STUUID 1.#  else
0e10: 0a 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67  .#    warning "g
0e20: 65 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20  ethostuuid() is 
0e30: 64 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e  disabled.".#  en
0e40: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  dif.#endif...#if
0e50: 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e   OS_VXWORKS.# in
0e60: 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c  clude <sys/ioctl
0e70: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  .h>.# include <s
0e80: 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e  emaphore.h>.# in
0e90: 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e  clude <limits.h>
0ea0: 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
0eb0: 57 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65  WORKS */..#if de
0ec0: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0ed0: 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   || SQLITE_ENABL
0ee0: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
0ef0: 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d  # include <sys/m
0f00: 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  ount.h>.#endif..
0f10: 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
0f20: 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69  E.# include <uti
0f30: 6d 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  me.h>.#endif../*
0f40: 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  .** Allowed valu
0f50: 65 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66  es of unixFile.f
0f60: 73 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  sFlags.*/.#defin
0f70: 65 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  e SQLITE_FSFLAGS
0f80: 5f 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78  _IS_MSDOS     0x
0f90: 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  1../*.** If we a
0fa0: 72 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d  re to be thread-
0fb0: 73 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68  safe, include th
0fc0: 65 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65  e pthreads heade
0fd0: 72 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20  r and define.** 
0fe0: 74 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  the SQLITE_UNIX_
0ff0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a  THREADS macro..*
1000: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52  /.#if SQLITE_THR
1010: 45 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64  EADSAFE.# includ
1020: 65 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20  e <pthread.h>.# 
1030: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e  define SQLITE_UN
1040: 49 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e  IX_THREADS 1.#en
1050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75  dif../*.** Defau
1060: 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77  lt permissions w
1070: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e  hen creating a n
1080: 65 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64  ew file.*/.#ifnd
1090: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
10a0: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
10b0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
10c0: 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
10d0: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34  PERMISSIONS 0644
10e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10f0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
1100: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1110: 20 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a   auto proxy dir.
1120: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
1130: 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44  E_DEFAULT_PROXYD
1140: 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23  IR_PERMISSIONS.#
1150: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44   define SQLITE_D
1160: 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
1170: 50 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35  PERMISSIONS 0755
1180: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d  .#endif../*.** M
1190: 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64  aximum supported
11a0: 20 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f   path-length..*/
11b0: 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54  .#define MAX_PAT
11c0: 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 20 41 6c  HNAME 512../* Al
11d0: 77 61 79 73 20 63 61 73 74 20 74 68 65 20 67 65  ways cast the ge
11e0: 74 70 69 64 28 29 20 72 65 74 75 72 6e 20 74 79  tpid() return ty
11f0: 70 65 20 66 6f 72 20 63 6f 6d 70 61 74 69 62 69  pe for compatibi
1200: 6c 69 74 79 20 77 69 74 68 0a 2a 2a 20 6b 65 72  lity with.** ker
1210: 6e 65 6c 20 6d 6f 64 75 6c 65 73 20 69 6e 20 56  nel modules in V
1220: 78 57 6f 72 6b 73 2e 20 2a 2f 0a 23 64 65 66 69  xWorks. */.#defi
1230: 6e 65 20 6f 73 47 65 74 70 69 64 28 58 29 20 28  ne osGetpid(X) (
1240: 70 69 64 5f 74 29 67 65 74 70 69 64 28 29 0a 0a  pid_t)getpid()..
1250: 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74  /*.** Only set t
1260: 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20  he lastErrno if 
1270: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  the error code i
1280: 73 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61  s a real error a
1290: 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72  nd not .** a nor
12a0: 6d 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74  mal expected ret
12b0: 75 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49  urn code of SQLI
12c0: 54 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54  TE_BUSY or SQLIT
12d0: 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  E_OK.*/.#define 
12e0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29  IS_LOCK_ERROR(x)
12f0: 20 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f    ((x != SQLITE_
1300: 4f 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c  OK) && (x != SQL
1310: 49 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46  ITE_BUSY))../* F
1320: 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
1330: 73 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  s */.typedef str
1340: 75 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78  uct unixShm unix
1350: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1360: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
1370: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
1380: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69   unixShmNode uni
13a0: 78 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  xShmNode;       
13b0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
13c0: 20 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70   instance */.typ
13d0: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
13e0: 49 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e  InodeInfo unixIn
13f0: 6f 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e  odeInfo;   /* An
1400: 20 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64   i-node */.typed
1410: 65 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e  ef struct UnixUn
1420: 75 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65  usedFd UnixUnuse
1430: 64 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75  dFd;     /* An u
1440: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
1450: 69 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  iptor */../*.** 
1460: 53 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72  Sometimes, after
1470: 20 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69   a file handle i
1480: 73 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69  s closed by SQLi
1490: 74 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73  te, the file des
14a0: 63 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f  criptor.** canno
14b0: 74 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65  t be closed imme
14c0: 64 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73  diately. In thes
14d0: 65 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63  e cases, instanc
14e0: 65 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  es of the follow
14f0: 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ing.** structure
1500: 20 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f   are used to sto
1510: 72 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  re the file desc
1520: 72 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69  riptor while wai
1530: 74 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f  ting for an.** o
1540: 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69  pportunity to ei
1550: 74 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65  ther close or re
1560: 75 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63  use it..*/.struc
1570: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b  t UnixUnusedFd {
1580: 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15a0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
15b0: 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e  to close */.  in
15c0: 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20  t flags;        
15d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
15e0: 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72   this file descr
15f0: 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64  iptor was opened
1600: 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55   with */.  UnixU
1610: 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20  nusedFd *pNext; 
1620: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75       /* Next unu
1630: 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
1640: 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65  tor on same file
1650: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
1660: 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
1670: 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73  ture is subclass
1680: 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65   of sqlite3_file
1690: 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65   specific to the
16a0: 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70   unix.** VFS imp
16b0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f  lementations..*/
16c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
16d0: 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c  unixFile unixFil
16e0: 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  e;.struct unixFi
16f0: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  le {.  sqlite3_i
1700: 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20  o_methods const 
1710: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
1720: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
1730: 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
1740: 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20  3_vfs *pVfs;    
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1760: 20 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72   The VFS that cr
1770: 65 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46  eated this unixF
1780: 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ile */.  unixIno
1790: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20  deInfo *pInode; 
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b0: 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73  Info about locks
17c0: 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a   on this inode *
17d0: 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20  /.  int h;      
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
1800: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
1810: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1820: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1830: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1840: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1850: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1860: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
1870: 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20  int ctrlFlags;  
1880: 20 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72       /* Behavior
1890: 61 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49  al bits.  UNIXFI
18a0: 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20  LE_* flags */.  
18b0: 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20  int lastErrno;  
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20      /* The unix 
18e0: 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20  errno from last 
18f0: 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76  I/O error */.  v
1900: 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74  oid *lockingCont
1910: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
1920: 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74     /* Locking st
1930: 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61  yle specific sta
1940: 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73  te */.  UnixUnus
1950: 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20  edFd *pUnused;  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
1970: 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69  re-allocated Uni
1980: 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63  xUnusedFd */.  c
1990: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
19a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19b0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
19c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
19d0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1a00: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1a10: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  tion */.  int sz
1a20: 43 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20  Chunk;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a40: 20 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46   Configured by F
1a50: 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20  CNTL_CHUNK_SIZE 
1a60: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
1a70: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1a80: 69 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20  int nFetchOut;  
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ab0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
1ac0: 74 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71  tch refs */.  sq
1ad0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1ae0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1af0: 20 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65    /* Usable size
1b00: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b10: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b20: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b30: 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
1b40: 20 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a     /* Actual siz
1b50: 65 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20  e of mapping at 
1b60: 70 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20  pMapRegion */.  
1b70: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d  sqlite3_int64 mm
1b80: 61 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20  apSizeMax;      
1b90: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65      /* Configure
1ba0: 64 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  d FCNTL_MMAP_SIZ
1bb0: 45 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69  E value */.  voi
1bc0: 64 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d *pMapRegion;  
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65   /* Memory mappe
1bf0: 64 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64  d region */.#end
1c00: 69 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e  if.#ifdef __QNXN
1c10: 54 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f  TO__.  int secto
1c20: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
1c30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1c40: 76 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65  vice sector size
1c50: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65   */.  int device
1c60: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
1c80: 63 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20  computed device 
1c90: 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
1ca0: 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  */.#endif.#if SQ
1cb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1cc0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
1cd0: 6f 70 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20  openFlags;      
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 2f 2a 20 54 68 65 20 66 6c 61 67 73 20 73 70 65  /* The flags spe
1d00: 63 69 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29  cified at open()
1d10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1d20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1d30: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1d40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1d50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1d60: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1d70: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1d80: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1d90: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1da0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1db0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1dc0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
1dd0: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
1de0: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
1df0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
1e00: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
1e10: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
1e20: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
1e30: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
1e40: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
1e50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1e60: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
1e70: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
1e80: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
1e90: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
1ea0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1eb0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
1ec0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
1ed0: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
1ee0: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
1ef0: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
1f00: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
1f10: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1f20: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
1f30: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
1f40: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
1f50: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
1f60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
1f70: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
1f80: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
1f90: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1fa0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
1fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
1fc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1fd0: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
1fe0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
1ff0: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2000: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2010: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2020: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2030: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2040: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2050: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2060: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
2070: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
2080: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
2090: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
20a0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
20b0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
20c0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
20d0: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
20e0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
20f0: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2100: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2110: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2120: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2130: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2140: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2150: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2160: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
2170: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
2180: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
2190: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
21a0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
21b0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
21c0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
21d0: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
21e0: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
21f0: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2200: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2210: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2220: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2230: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2240: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2250: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2260: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
2270: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
2280: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
2290: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
22a0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
22b0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
22c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
22d0: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
22e0: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
22f0: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2300: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2310: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2320: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2330: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2340: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2350: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2360: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
2370: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
2380: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
2390: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
23a0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
23b0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
23c0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
23d0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
23e0: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
23f0: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2400: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2410: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2420: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2430: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2440: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2450: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2460: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2470: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
2480: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
2490: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
24a0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
24b0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
24c0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
24d0: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
24e0: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
24f0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
2500: 45 5f 57 41 52 4e 45 44 20 20 20 20 30 78 30 31  E_WARNED    0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 76 65 72 69 66 79  00     /* verify
2520: 44 62 46 69 6c 65 28 29 20 77 61 72 6e 69 6e 67  DbFile() warning
2530: 73 20 69 73 73 75 65 64 20 2a 2f 0a 23 64 65 66  s issued */.#def
2540: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f  ine UNIXFILE_BLO
2550: 43 4b 20 20 20 20 20 30 78 30 32 30 30 20 20 20  CK     0x0200   
2560: 20 20 2f 2a 20 4e 65 78 74 20 53 48 4d 20 6c 6f    /* Next SHM lo
2570: 63 6b 20 6d 69 67 68 74 20 62 6c 6f 63 6b 20 2a  ck might block *
2580: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
2590: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
25a0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
25b0: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
25c0: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
25d0: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
25e0: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
25f0: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
2600: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
2610: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
2620: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2630: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2640: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
2650: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
2660: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
2670: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
2680: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
2690: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
26a0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
26b0: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
26c0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
26d0: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
26e0: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
26f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
2700: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
2710: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
2720: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
2730: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2740: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
2750: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
2760: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2770: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
2780: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
2790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
27a0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
27b0: 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52 45 4d  ./*.** HAVE_MREM
27c0: 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f 20 74  AP defaults to t
27d0: 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61 6e 64  rue on Linux and
27e0: 20 66 61 6c 73 65 20 65 76 65 72 79 77 68 65 72   false everywher
27f0: 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66 20 21  e else..*/.#if !
2800: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d 52 45  defined(HAVE_MRE
2810: 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69 6e 65  MAP).# if define
2820: 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26 26 20  d(__linux__) && 
2830: 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53 4f 55  defined(_GNU_SOU
2840: 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65 20 48  RCE).#  define H
2850: 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23 20 65  AVE_MREMAP 1.# e
2860: 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 48 41  lse.#  define HA
2870: 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20 65 6e  VE_MREMAP 0.# en
2880: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  dif.#endif../*.*
2890: 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63 61 6c  * Explicitly cal
28a0: 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76 65 72  l the 64-bit ver
28b0: 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28 29 20  sion of lseek() 
28c0: 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74 68 65  on Android. Othe
28d0: 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29 0a 2a  rwise, lseek().*
28e0: 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69 74 20  * is the 32-bit 
28f0: 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20 69 66  version, even if
2900: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
2910: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
2920: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 41 4e  ..*/.#ifdef __AN
2930: 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69 6e 65  DROID__.# define
2940: 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34 0a 23   lseek lseek64.#
2950: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
2960: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
2970: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
2980: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
2990: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
29a0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
29b0: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
29c0: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
29d0: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
29e0: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
29f0: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
2a00: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
2a10: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
2a20: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
2a30: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
2a40: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
2a50: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
2a60: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
2a70: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
2a80: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
2a90: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
2aa0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
2ab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
2ac0: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
2ad0: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
2ae0: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
2af0: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
2b00: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
2b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
2b20: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
2b30: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
2b40: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
2b50: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
2b60: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
2b70: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
2b80: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
2b90: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
2ba0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
2bb0: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
2bc0: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
2bd0: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
2be0: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
2bf0: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
2c00: 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  gid){.#if OS_VXW
2c10: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b  ORKS.  return 0;
2c20: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
2c30: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
2c40: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
2c50: 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  d);.#endif.}../*
2c60: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
2c70: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
2c80: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
2c90: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
2ca0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
2cb0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
2cc0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
2cd0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
2ce0: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
2cf0: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
2d00: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
2d10: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
2d20: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
2d30: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
2d40: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
2d50: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
2d60: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
2d70: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
2d80: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
2d90: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
2da0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
2db0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
2dc0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
2dd0: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
2de0: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
2df0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e10: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
2e20: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
2e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
2e40: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
2e50: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
2e60: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
2e70: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
2e80: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
2e90: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
2ea0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
2eb0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
2ec0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
2ed0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
2ee0: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
2ef0: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
2f00: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
2f10: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
2f20: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
2f30: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
2f40: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
2f50: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2f60: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
2f70: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
2f80: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
2f90: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
2fa0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
2fb0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
2fc0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
2fd0: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
2fe0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
2ff0: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
3000: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3010: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
3020: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
3030: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
3040: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3050: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
3060: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3070: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
3080: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
3090: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
30a0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
30b0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
30c0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
30d0: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
30e0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
30f0: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
3100: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3110: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
3120: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
3130: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
3140: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
3150: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
3160: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
3170: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
3180: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
3190: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
31a0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
31b0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
31c0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
31d0: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
31e0: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
31f0: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
3200: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
3210: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
3220: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
3230: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
3240: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
3250: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3260: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
3270: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3280: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
3290: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
32a0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
32b0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
32c0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
32d0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
32e0: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
32f0: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
3300: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
3310: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
3320: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
3330: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
3340: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3350: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
3360: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
3370: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
3380: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
3390: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
33a0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
33b0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
33c0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
33d0: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
33e0: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
33f0: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
3400: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
3410: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
3420: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
3430: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3440: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
3450: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3460: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
3470: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
3480: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
3490: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
34a0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
34b0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c  SE_PREAD) || SQL
34c0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
34d0: 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 72  NG_STYLE.  { "pr
34e0: 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73 71  ead",        (sq
34f0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3500: 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30 20  r)pread,      0 
3510: 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70   },.#else.  { "p
3520: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
3530: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3540: 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30  tr)0,          0
3550: 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66    },.#endif.#def
3560: 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20 20  ine osPread     
3570: 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74  ((ssize_t(*)(int
3580: 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66  ,void*,size_t,of
3590: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39 5d  f_t))aSyscall[9]
35a0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
35b0: 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
35c0: 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64 36  D64).  { "pread6
35d0: 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  4",      (sqlite
35e0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
35f0: 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c 0a  ead64,    0  },.
3600: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3610: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
3620: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
3630: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
3640: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3650: 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73 73  osPread64   ((ss
3660: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
3670: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3680: 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70 43  )aSyscall[10].pC
3690: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77 72  urrent)..  { "wr
36a0: 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73 71  ite",        (sq
36b0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
36c0: 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30 20  r)write,      0 
36d0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57 72   },.#define osWr
36e0: 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ite     ((ssize_
36f0: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
3700: 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  oid*,size_t))aSy
3710: 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72 65  scall[11].pCurre
3720: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
3730: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
3740: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
3750: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
3760: 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 28  pwrite",       (
3770: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3780: 70 74 72 29 70 77 72 69 74 65 2c 20 20 20 20 20  ptr)pwrite,     
3790: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
37a0: 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20 20  "pwrite",       
37b0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
37c0: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
37d0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
37e0: 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65 20 20  efine osPwrite  
37f0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
3800: 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73  nt,const void*,s
3810: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20  ize_t,off_t))\. 
3820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3830: 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e     aSyscall[12].
3840: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
3850: 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
3860: 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74 65 36  64).  { "pwrite6
3870: 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  4",     (sqlite3
3880: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 77 72  _syscall_ptr)pwr
3890: 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23  ite64,   0  },.#
38a0: 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69 74 65  else.  { "pwrite
38b0: 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65  64",     (sqlite
38c0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
38d0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
38e0: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
38f0: 73 50 77 72 69 74 65 36 34 20 20 28 28 73 73 69  sPwrite64  ((ssi
3900: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73  ze_t(*)(int,cons
3910: 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t void*,size_t,o
3920: 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20 20 20  ff_t))\.        
3930: 20 20 20 20 20 20 20 20 20 20 20 20 61 53 79 73              aSys
3940: 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e  call[13].pCurren
3950: 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22  t)..  { "fchmod"
3960: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3970: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
3980: 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23  mod,     0  },.#
3990: 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20  define osFchmod 
39a0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
39b0: 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  mode_t))aSyscall
39c0: 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [14].pCurrent)..
39d0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
39e0: 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
39f0: 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f  ) && HAVE_POSIX_
3a00: 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66  FALLOCATE.  { "f
3a10: 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28 73  allocate",    (s
3a20: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3a30: 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61  tr)posix_falloca
3a40: 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a  te,  0 },.#else.
3a50: 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c    { "fallocate",
3a60: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3a70: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
3a80: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3a90: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3aa0: 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74  sFallocate ((int
3ab0: 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66  (*)(int,off_t,of
3ac0: 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 35  f_t))aSyscall[15
3ad0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
3ae0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20   "unlink",      
3af0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
3b00: 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20  l_ptr)unlink,   
3b10: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3b20: 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20  fine osUnlink   
3b30: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
3b40: 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b  char*))aSyscall[
3b50: 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  16].pCurrent).. 
3b60: 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f 72   { "openDirector
3b70: 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  y",    (sqlite3_
3b80: 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e  syscall_ptr)open
3b90: 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20 20  Directory,      
3ba0: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f  0 },.#define osO
3bb0: 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28 69  penDirectory ((i
3bc0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
3bd0: 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c  *,int*))aSyscall
3be0: 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [17].pCurrent)..
3bf0: 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20 20    { "mkdir",    
3c00: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
3c10: 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20  call_ptr)mkdir, 
3c20: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
3c30: 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20  define osMkdir  
3c40: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
3c50: 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29  t char*,mode_t))
3c60: 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75  aSyscall[18].pCu
3c70: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64  rrent)..  { "rmd
3c80: 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c  ir",        (sql
3c90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ca0: 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 20  )rmdir,         
3cb0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
3cc0: 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e 74  sRmdir     ((int
3cd0: 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  (*)(const char*)
3ce0: 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43  )aSyscall[19].pC
3cf0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63  urrent)..  { "fc
3d00: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
3d10: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3d20: 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20  r)posixFchown,  
3d30: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3d40: 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69 6e  osFchown    ((in
3d50: 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67  t(*)(int,uid_t,g
3d60: 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  id_t))aSyscall[2
3d70: 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  0].pCurrent)..#i
3d80: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
3d90: 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
3da0: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
3db0: 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22  IZE>0.  { "mmap"
3dc0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3dd0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61  _syscall_ptr)mma
3de0: 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66  p,     0 },.#def
3df0: 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69  ine osMmap ((voi
3e00: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3e10: 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f  _t,int,int,int,o
3e20: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32  ff_t))aSyscall[2
3e30: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
3e40: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
3e50: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3e60: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
3e70: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65          0 },.#de
3e80: 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28  fine osMunmap ((
3e90: 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73  void*(*)(void*,s
3ea0: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
3eb0: 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  22].pCurrent)..#
3ec0: 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
3ed0: 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20 20 20   { "mremap",    
3ee0: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3ef0: 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20  all_ptr)mremap, 
3f00: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
3f10: 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  lse.  { "mremap"
3f20: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20  _syscall_ptr)0, 
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
3f50: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3f60: 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76 6f 69  e osMremap ((voi
3f70: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3f80: 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e  _t,size_t,int,..
3f90: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  .))aSyscall[23].
3fa0: 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20 22 67  pCurrent).  { "g
3fb0: 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73  etpagesize",  (s
3fc0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3fd0: 74 72 29 75 6e 69 78 47 65 74 70 61 67 65 73 69  tr)unixGetpagesi
3fe0: 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65  ze, 0 },.#define
3ff0: 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 20 28   osGetpagesize (
4000: 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53  (int(*)(void))aS
4010: 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72  yscall[24].pCurr
4020: 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c  ent)..  { "readl
4030: 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74  ink",     (sqlit
4040: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72  e3_syscall_ptr)r
4050: 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20  eadlink,        
4060: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52  0 },.#define osR
4070: 65 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f  eadlink ((ssize_
4080: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
4090: 2c 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61  ,char*,size_t))a
40a0: 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72  Syscall[25].pCur
40b0: 72 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d  rent)..#endif..}
40c0: 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  ; /* End of the 
40d0: 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79 73  overrideable sys
40e0: 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a  tem calls */../*
40f0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
4100: 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 29  xSetSystemCall()
4110: 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69 74   method of sqlit
4120: 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f  e3_vfs for all o
4130: 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20  f the.** "unix" 
4140: 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20 53  VFSes.  Return S
4150: 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75  QLITE_OK opon su
4160: 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61 74  ccessfully updat
4170: 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74 65  ing the.** syste
4180: 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20  m call pointer, 
4190: 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  or SQLITE_NOTFOU
41a0: 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20 6e  ND if there is n
41b0: 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a  o configurable.*
41c0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61  * system call na
41d0: 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74  med zName..*/.st
41e0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 74  atic int unixSet
41f0: 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71  SystemCall(.  sq
4200: 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55  lite3_vfs *pNotU
4210: 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54  sed,        /* T
4220: 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e 20  he VFS pointer. 
4230: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 63   Not used */.  c
4240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
4250: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
4260: 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20 63  Name of system c
4270: 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65 20  all to override 
4280: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
4290: 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e  call_ptr pNewFun
42a0: 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  c  /* Pointer to
42b0: 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c 6c   new system call
42c0: 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
42d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20  nsigned int i;. 
42e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
42f0: 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e  _NOTFOUND;..  UN
4300: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
4310: 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20  NotUsed);.  if( 
4320: 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
4330: 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69  /* If no zName i
4340: 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72 65  s given, restore
4350: 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c   all system call
4360: 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61 75  s to their defau
4370: 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69 6e  lt.    ** settin
4380: 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55  gs and return NU
4390: 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  LL.    */.    rc
43a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
43b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
43c0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
43d0: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
43e0: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
43f0: 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70  f( aSyscall[i].p
4400: 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20 20  Default ){.     
4410: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
4420: 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63 61  Current = aSysca
4430: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a  ll[i].pDefault;.
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4450: 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
4460: 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69 66   zName is specif
4470: 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20  ied, operate on 
4480: 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79 73  only the one sys
4490: 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  tem call.    ** 
44a0: 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20 2a  specified..    *
44b0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
44c0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
44d0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
44e0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
44f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
4500: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
4510: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  .zName)==0 ){.  
4520: 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63 61        if( aSysca
4530: 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d  ll[i].pDefault==
4540: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  0 ){.          a
4550: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
4560: 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ult = aSyscall[i
4570: 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20 20  ].pCurrent;.    
4580: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
4590: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
45a0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46 75        if( pNewFu
45b0: 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e 63  nc==0 ) pNewFunc
45c0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45d0: 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20 20  Default;.       
45e0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
45f0: 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63  rrent = pNewFunc
4600: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4610: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4620: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4630: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4640: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
4650: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74  ystem call.  Ret
4660: 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d  urn NULL if zNam
4670: 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65  e is not a.** re
4680: 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d 20  cognized system 
4690: 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c  call name.  NULL
46a0: 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
46b0: 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d 20  d if the system 
46c0: 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65  call.** is curre
46d0: 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a  ntly undefined..
46e0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
46f0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e  3_syscall_ptr un
4700: 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c 28  ixGetSystemCall(
4710: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
4720: 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73  pNotUsed,.  cons
4730: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b  t char *zName.){
4740: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
4750: 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  i;..  UNUSED_PAR
4760: 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64 29  AMETER(pNotUsed)
4770: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
4780: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
4790: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
47a0: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  0]); i++){.    i
47b0: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
47c0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
47d0: 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  me)==0 ) return 
47e0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
47f0: 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rent;.  }.  retu
4800: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
4810: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
4820: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
4830: 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e  em call after zN
4840: 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d  ame.  If zName==
4850: 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74  NULL.** then ret
4860: 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
4870: 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d  the first system
4880: 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e   call.  Return N
4890: 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20  ULL if zName.** 
48a0: 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73 74  is the last syst
48b0: 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e  em call or if zN
48c0: 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6e  ame is not the n
48d0: 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a  ame of a valid.*
48e0: 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a  * system call..*
48f0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
4900: 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79 73  har *unixNextSys
4910: 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f  temCall(sqlite3_
4920: 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  vfs *p, const ch
4930: 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e  ar *zName){.  in
4940: 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55  t i = -1;..  UNU
4950: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
4960: 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b  ;.  if( zName ){
4970: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4980: 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63 61  ArraySize(aSysca
4990: 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  ll)-1; i++){.   
49a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
49b0: 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d  ame, aSyscall[i]
49c0: 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
49d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
49e0: 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79  for(i++; i<Array
49f0: 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b 20  Size(aSyscall); 
4a00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 53  i++){.    if( aS
4a10: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4a20: 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20 61  nt!=0 ) return a
4a30: 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65  Syscall[i].zName
4a40: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
4a50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f  ;.}../*.** Do no
4a60: 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69 6c  t accept any fil
4a70: 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65 73  e descriptor les
4a80: 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75  s than this valu
4a90: 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  e, in order to a
4aa0: 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20  void.** opening 
4ab0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 73  database file us
4ac0: 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69 70  ing file descrip
4ad0: 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63 6f  tors that are co
4ae0: 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 20  mmonly used for 
4af0: 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e 70  .** standard inp
4b00: 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64 20  ut, output, and 
4b10: 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65  error..*/.#ifnde
4b20: 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d  f SQLITE_MINIMUM
4b30: 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f 52  _FILE_DESCRIPTOR
4b40: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
4b50: 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45  _MINIMUM_FILE_DE
4b60: 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64 69  SCRIPTOR 3.#endi
4b70: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  f../*.** Invoke 
4b80: 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d  open().  Do so m
4b90: 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20 75  ultiple times, u
4ba0: 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20 73  ntil it either s
4bb0: 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61  ucceeds or.** fa
4bc0: 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65 61  ils for some rea
4bd0: 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 45  son other than E
4be0: 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  INTR..**.** If t
4bf0: 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  he file creation
4c00: 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20 74   mode "m" is 0 t
4c10: 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74 68  hen set it to th
4c20: 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a  e default for.**
4c30: 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64 65   SQLite.  The de
4c40: 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45 5f  fault is SQLITE_
4c50: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
4c60: 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c  MISSIONS (normal
4c70: 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20 6d  ly.** 0644) as m
4c80: 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20 73  odified by the s
4c90: 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66  ystem umask.  If
4ca0: 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68 65   m is not 0, the
4cb0: 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69  n.** make the fi
4cc0: 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65  le creation mode
4cd0: 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69 67   be exactly m ig
4ce0: 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73 6b  noring the umask
4cf0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61  ..**.** The m pa
4d00: 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65 20  rameter will be 
4d10: 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68  non-zero only wh
4d20: 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61 6c  en creating -wal
4d30: 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61  , -journal,.** a
4d40: 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20  nd -shm files.  
4d50: 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66 69  We want those fi
4d60: 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78 61  les to have *exa
4d70: 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a  ctly* the same.*
4d80: 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 73  * permissions as
4d90: 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
4da0: 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75 6c  database, unadul
4db0: 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20 75  terated by the u
4dc0: 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74  mask..** In that
4dd0: 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61 62   way, if a datab
4de0: 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77 2d  ase file is -rw-
4df0: 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d  rw-rw or -rw-rw-
4e00: 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61  r-, and a.** tra
4e10: 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65 73  nsaction crashes
4e20: 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68 69   and leaves behi
4e30: 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c  nd hot journals,
4e40: 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f   then any.** pro
4e50: 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62 6c  cess that is abl
4e60: 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  e to write to th
4e70: 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20  e database will 
4e80: 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a  also be able to.
4e90: 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20 68  ** recover the h
4ea0: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a  ot journals..*/.
4eb0: 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73  static int robus
4ec0: 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  t_open(const cha
4ed0: 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64  r *z, int f, mod
4ee0: 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64  e_t m){.  int fd
4ef0: 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20  ;.  mode_t m2 = 
4f00: 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44  m ? m : SQLITE_D
4f10: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
4f20: 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65  ISSIONS;.  while
4f30: 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  (1){.#if defined
4f40: 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20 20  (O_CLOEXEC).    
4f50: 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c  fd = osOpen(z,f|
4f60: 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23  O_CLOEXEC,m2);.#
4f70: 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f 73  else.    fd = os
4f80: 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65  Open(z,f,m2);.#e
4f90: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64 3c  ndif.    if( fd<
4fa0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  0 ){.      if( e
4fb0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f  rrno==EINTR ) co
4fc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62 72  ntinue;.      br
4fd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
4fe0: 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49  f( fd>=SQLITE_MI
4ff0: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
5000: 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20  IPTOR ) break;. 
5010: 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a     osClose(fd);.
5020: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
5030: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
5040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5050: 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70 65   "attempt to ope
5060: 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c 65  n \"%s\" as file
5070: 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22 2c   descriptor %d",
5080: 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64 20   z, fd);.    fd 
5090: 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f 73  = -1;.    if( os
50a0: 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22  Open("/dev/null"
50b0: 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65 61  , f, m)<0 ) brea
50c0: 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3e  k;.  }.  if( fd>
50d0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d 21  =0 ){.    if( m!
50e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75  =0 ){.      stru
50f0: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
5100: 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74  .      if( osFst
5110: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
5120: 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20 73  ==0 .       && s
5130: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
5140: 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74 61  0.       && (sta
5150: 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37  tbuf.st_mode&077
5160: 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a  7)!=m .      ){.
5170: 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f 64          osFchmod
5180: 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d  (fd, m);.      }
5190: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
51a0: 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20 26  ed(FD_CLOEXEC) &
51b0: 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c  & (!defined(O_CL
51c0: 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45  OEXEC) || O_CLOE
51d0: 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63  XEC==0).    osFc
51e0: 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44 2c  ntl(fd, F_SETFD,
51f0: 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47   osFcntl(fd, F_G
5200: 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c  ETFD, 0) | FD_CL
5210: 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20  OEXEC);.#endif. 
5220: 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b 0a   }.  return fd;.
5230: 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20  }../*.** Helper 
5240: 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74  functions to obt
5250: 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75 69  ain and relinqui
5260: 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  sh the global mu
5270: 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62  tex. The.** glob
5280: 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65 64  al mutex is used
5290: 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65 20   to protect the 
52a0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e  unixInodeInfo an
52b0: 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65  d.** vxworksFile
52c0: 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64 20  Id objects used 
52d0: 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6c  by this file, al
52e0: 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20 62  l of which may b
52f0: 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79 20  e .** shared by 
5300: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
5310: 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ..**.** Function
5320: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
5330: 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73 65   is used to asse
5340: 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67 6c  rt() that the gl
5350: 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69  obal mutex .** i
5360: 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71 75  s held when requ
5370: 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63 74  ired. This funct
5380: 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
5390: 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65   as part of asse
53a0: 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65  rt() .** stateme
53b0: 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20  nts. e.g..**.** 
53c0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
53d0: 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72 74  ().**     assert
53e0: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
53f0: 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e  ) );.**   unixEn
5400: 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74  terLeave().*/.st
5410: 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45 6e  atic void unixEn
5420: 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a  terMutex(void){.
5430: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5440: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75 74  enter(sqlite3Mut
5450: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
5460: 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53 31  UTEX_STATIC_VFS1
5470: 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  ));.}.static voi
5480: 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78  d unixLeaveMutex
5490: 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
54a0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
54b0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
54c0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
54d0: 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69  TIC_VFS1));.}.#i
54e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
54f0: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
5500: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
5510: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
5520: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
5530: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
5540: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5550: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
5560: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
5570: 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52  QLITE_HAVE_OS_TR
5580: 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  ACE./*.** Helper
5590: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72   function for pr
55a0: 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63 65  inting out trace
55b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
55c0: 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62  m debugging.** b
55d0: 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72 65  inaries. This re
55e0: 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
55f0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
5600: 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 0a  of the supplied.
5610: 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d  ** integer lock-
5620: 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  type..*/.static 
5630: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46 69  const char *azFi
5640: 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65  leLock(int eFile
5650: 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68 28  Lock){.  switch(
5660: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5670: 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20    case NO_LOCK: 
5680: 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20  return "NONE";. 
5690: 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f 4c     case SHARED_L
56a0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48 41  OCK: return "SHA
56b0: 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20 52  RED";.    case R
56c0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65  ESERVED_LOCK: re
56d0: 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22 3b  turn "RESERVED";
56e0: 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49 4e  .    case PENDIN
56f0: 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  G_LOCK: return "
5700: 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63 61  PENDING";.    ca
5710: 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  se EXCLUSIVE_LOC
5720: 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c 55  K: return "EXCLU
5730: 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74  SIVE";.  }.  ret
5740: 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23  urn "ERROR";.}.#
5750: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
5760: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5770: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20  /*.** Print out 
5780: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
5790: 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70  t all locking op
57a0: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
57b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
57c0: 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c 65  used for trouble
57d0: 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f  shooting locks o
57e0: 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64 0a  n multithreaded.
57f0: 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45  ** platforms.  E
5800: 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69  nable by compili
5810: 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53 51  ng with the -DSQ
5820: 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a  LITE_LOCK_TRACE.
5830: 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  ** command-line 
5840: 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f  option on the co
5850: 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63 6f  mpiler.  This co
5860: 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a  de is normally.*
5870: 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  * turned off..*/
5880: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b  .static int lock
5890: 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69 6e  Trace(int fd, in
58a0: 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c 6f  t op, struct flo
58b0: 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a  ck *p){.  char *
58c0: 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b  zOpName, *zType;
58d0: 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20  .  int s;.  int 
58e0: 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66  savedErrno;.  if
58f0: 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b  ( op==F_GETLK ){
5900: 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22  .    zOpName = "
5910: 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  GETLK";.  }else 
5920: 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20  if( op==F_SETLK 
5930: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
5940: 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "SETLK";.  }els
5950: 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63 6e  e{.    s = osFcn
5960: 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20  tl(fd, op, p);. 
5970: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
5980: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b  rintf("fcntl unk
5990: 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e 22  nown %d %d %d\n"
59a0: 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20  , fd, op, s);.  
59b0: 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a    return s;.  }.
59c0: 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d    if( p->l_type=
59d0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
59e0: 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b  zType = "RDLCK";
59f0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
5a00: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
5a10: 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22  ){.    zType = "
5a20: 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20  WRLCK";.  }else 
5a30: 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  if( p->l_type==F
5a40: 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54  _UNLCK ){.    zT
5a50: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
5a60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
5a70: 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61  rt( 0 );.  }.  a
5a80: 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e  ssert( p->l_when
5a90: 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a  ce==SEEK_SET );.
5aa0: 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64    s = osFcntl(fd
5ab0: 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76 65  , op, p);.  save
5ac0: 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  dErrno = errno;.
5ad0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5ae0: 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20 25  intf("fcntl %d %
5af0: 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25 64  d %s %s %d %d %d
5b00: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72   %d\n",.     thr
5b10: 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61  eadid, fd, zOpNa
5b20: 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74 29  me, zType, (int)
5b30: 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74  p->l_start, (int
5b40: 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20  )p->l_len,.     
5b50: 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73  (int)p->l_pid, s
5b60: 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31 29  );.  if( s==(-1)
5b70: 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20   && op==F_SETLK 
5b80: 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46  && (p->l_type==F
5b90: 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74  _RDLCK || p->l_t
5ba0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b  ype==F_WRLCK) ){
5bb0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
5bc0: 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a  k l2;.    l2 = *
5bd0: 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28 66  p;.    osFcntl(f
5be0: 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29  d, F_GETLK, &l2)
5bf0: 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74  ;.    if( l2.l_t
5c00: 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
5c10: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52        zType = "R
5c20: 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65  DLCK";.    }else
5c30: 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d   if( l2.l_type==
5c40: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_WRLCK ){.     
5c50: 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22   zType = "WRLCK"
5c60: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
5c70: 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  l2.l_type==F_UNL
5c80: 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79 70  CK ){.      zTyp
5c90: 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20  e = "UNLCK";.   
5ca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
5cb0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20 7d  sert( 0 );.    }
5cc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
5cd0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66  gPrintf("fcntl-f
5ce0: 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25  ailure-reason: %
5cf0: 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20  s %d %d %d\n",. 
5d00: 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69 6e        zType, (in
5d10: 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69  t)l2.l_start, (i
5d20: 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e  nt)l2.l_len, (in
5d30: 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d  t)l2.l_pid);.  }
5d40: 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65 64  .  errno = saved
5d50: 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  Errno;.  return 
5d60: 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63  s;.}.#undef osFc
5d70: 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46 63  ntl.#define osFc
5d80: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
5d90: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
5da0: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  OCK_TRACE */../*
5db0: 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e 63  .** Retry ftrunc
5dc0: 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61 74  ate() calls that
5dd0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49 4e   fail due to EIN
5de0: 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c  TR.**.** All cal
5df0: 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65 28  ls to ftruncate(
5e00: 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 69  ) within this fi
5e10: 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 64  le should be mad
5e20: 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69  e through.** thi
5e30: 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20 74  s wrapper.  On t
5e40: 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74 66  he Android platf
5e50: 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20 74  orm, bypassing t
5e60: 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a  he logic below.*
5e70: 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20  * could lead to 
5e80: 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61  a corrupt databa
5e90: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
5ea0: 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  t robust_ftrunca
5eb0: 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74 65  te(int h, sqlite
5ec0: 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69  3_int64 sz){.  i
5ed0: 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f  nt rc;.#ifdef __
5ee0: 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f  ANDROID__.  /* O
5ef0: 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e  n Android, ftrun
5f00: 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75 73  cate() always us
5f10: 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65 74  es 32-bit offset
5f20: 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a  s, even if .  **
5f30: 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49   _FILE_OFFSET_BI
5f40: 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65 64  TS=64 is defined
5f50: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74 20  . This means it 
5f60: 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74 74  is unsafe to att
5f70: 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75  empt to.  ** tru
5f80: 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f 20  ncate a file to 
5f90: 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72 20  any size larger 
5fa0: 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e  than 2GiB. Silen
5fb0: 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20  tly ignore any. 
5fc0: 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70 74   ** such attempt
5fd0: 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e  s.  */.  if( sz>
5fe0: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 30  (sqlite3_int64)0
5ff0: 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20 20  x7FFFFFFF ){.   
6000: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
6010: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
6020: 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72    do{ rc = osFtr
6030: 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77  uncate(h,sz); }w
6040: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
6050: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
6060: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6070: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6080: 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73 74   translates a st
6090: 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72 72  andard POSIX err
60a0: 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d  no code into som
60b0: 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c  ething.** useful
60c0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73 20   to the clients 
60d0: 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20 66  of the sqlite3 f
60e0: 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63 69  unctions.  Speci
60f0: 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a  fically, it is.*
6100: 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74 72  * intended to tr
6110: 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65 74  anslate a variet
6120: 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e 22  y of "try again"
6130: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c   errors into SQL
6140: 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20  ITE_BUSY.** and 
6150: 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70 6c  a variety of "pl
6160: 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20 66  ease close the f
6170: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 4e  ile descriptor N
6180: 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20  OW" errors into 
6190: 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .** SQLITE_IOERR
61a0: 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64  .** .** Errors d
61b0: 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61  uring initializa
61c0: 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f  tion of locks, o
61d0: 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  r file system su
61e0: 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c  pport for locks,
61f0: 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c  .** should handl
6200: 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55  e ENOLCK, ENOTSU
6210: 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73 65  P, EOPNOTSUPP se
6220: 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61  parately..*/.sta
6230: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45 72  tic int sqliteEr
6240: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
6250: 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f 72  r(int posixError
6260: 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45 72  , int sqliteIOEr
6270: 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28 70  r) {.  switch (p
6280: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69 66  osixError) {.#if
6290: 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70   0.  /* At one p
62a0: 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20 77  oint this code w
62b0: 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64  as not commented
62c0: 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c   out. In theory,
62d0: 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20 2a   this branch.  *
62e0: 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  * should never b
62f0: 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20 66  e hit, as this f
6300: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f  unction should o
6310: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
6320: 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69  ter.  ** a locki
6330: 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63 74  ng-related funct
6340: 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28  ion (i.e. fcntl(
6350: 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64 20  )) has returned 
6360: 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20  non-zero with.  
6370: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
6380: 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69 72  errno as the fir
6390: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e  st argument. Sin
63a0: 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c 6c  ce a system call
63b0: 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a   has failed,.  *
63c0: 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62  * errno should b
63d0: 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a  e non-zero..  **
63e0: 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74 68  .  ** Despite th
63f0: 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65 61  is, if errno rea
6400: 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65 20  lly is zero, we 
6410: 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74  still don't want
6420: 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20   to return.  ** 
6430: 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73  SQLITE_OK. The s
6440: 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65  ystem call faile
6450: 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51  d, and *some* SQ
6460: 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75 6c  Lite error shoul
6470: 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67  d be.  ** propag
6480: 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68 65  ated back to the
6490: 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74   caller. Comment
64a0: 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68 20  ing this branch 
64b0: 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d  out means errno=
64c0: 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  =0.  ** will be 
64d0: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 22  handled by the "
64e0: 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20 62  default:" case b
64f0: 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73  elow..  */.  cas
6500: 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  e 0: .    return
6510: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
6520: 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41 49  if..  case EAGAI
6530: 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44  N:.  case ETIMED
6540: 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53  OUT:.  case EBUS
6550: 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a  Y:.  case EINTR:
6560: 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20  .  case ENOLCK: 
6570: 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20   .    /* random 
6580: 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c  NFS retry error,
6590: 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66   unless during f
65a0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
65b0: 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f  rt .     * intro
65c0: 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69  spection, in whi
65d0: 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d  ch it actually m
65e0: 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61 79  eans what it say
65f0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
6600: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
6610: 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a   .  case EACCES:
6620: 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53 20   .    /* EACCES 
6630: 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20 64  is like EAGAIN d
6640: 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70  uring locking op
6650: 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f  erations, but no
6660: 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d 65  t any other time
6670: 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  */.    if( (sqli
6680: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
6690: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c  E_IOERR_LOCK) ||
66a0: 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69 74   .        (sqlit
66b0: 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45  eIOErr == SQLITE
66c0: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c  _IOERR_UNLOCK) |
66d0: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
66e0: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
66f0: 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20  E_IOERR_RDLOCK) 
6700: 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  ||.        (sqli
6710: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
6720: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
6730: 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20  ERVEDLOCK) ){.  
6740: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6750: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
6760: 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74    /* else fall t
6770: 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73 65  hrough */.  case
6780: 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65 74   EPERM: .    ret
6790: 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
67a0: 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54  .    .#if EOPNOT
67b0: 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20  SUPP!=ENOTSUP.  
67c0: 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a  case EOPNOTSUPP:
67d0: 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69   .    /* somethi
67e0: 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c 79  ng went terribly
67f0: 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64 75   awry, unless du
6800: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
6810: 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20 2a   support .     *
6820: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20   introspection, 
6830: 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74 75  in which it actu
6840: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
6850: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
6860: 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55 50  f.#ifdef ENOTSUP
6870: 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50 3a  .  case ENOTSUP:
6880: 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64   .    /* invalid
6890: 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72 69   fd, unless duri
68a0: 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  ng file system s
68b0: 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65 63  upport introspec
68c0: 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a  tion, in which .
68d0: 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61 6c       * it actual
68e0: 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74  ly means what it
68f0: 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a   says */.#endif.
6900: 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63 61    case EIO:.  ca
6910: 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73 65  se EBADF:.  case
6920: 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20   EINVAL:.  case 
6930: 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65  ENOTCONN:.  case
6940: 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65 20   ENODEV:.  case 
6950: 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e  ENXIO:.  case EN
6960: 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53 54  OENT:.#ifdef EST
6970: 41 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  ALE             
6980: 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41 4c          /* ESTAL
6990: 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  E is not defined
69a0: 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73 74   on Interix syst
69b0: 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45 53  ems */.  case ES
69c0: 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63  TALE:.#endif.  c
69d0: 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20  ase ENOSYS:.    
69e0: 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64 20  /* these should 
69f0: 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e 74  force the client
6a00: 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66 69   to close the fi
6a10: 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74  le and reconnect
6a20: 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61 75   */.    .  defau
6a30: 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  lt: .    return 
6a40: 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d  sqliteIOErr;.  }
6a50: 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
6a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6aa0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
6ab0: 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e  ******* Begin Un
6ac0: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
6ad0: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
6ae0: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
6af0: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f  ****.**.** On mo
6b00: 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75  st versions of u
6b10: 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20  nix, we can get 
6b20: 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20  a unique ID for 
6b30: 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74  a file by concat
6b40: 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64  enating.** the d
6b50: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64  evice number and
6b60: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
6b70: 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f 65  r.  But this doe
6b80: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
6b90: 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57  Works..** On VxW
6ba0: 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66  orks, a unique f
6bb0: 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20 62  ile id must be b
6bc0: 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f  ased on the cano
6bd0: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  nical filename..
6be0: 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20  **.** A pointer 
6bf0: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
6c00: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6c10: 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62 65  structure can be
6c20: 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e   used as a.** un
6c30: 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20  ique file ID in 
6c40: 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69  VxWorks.  Each i
6c50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
6c60: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
6c70: 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20  ns.** a copy of 
6c80: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69  the canonical fi
6c90: 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69  lename.  There i
6ca0: 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e  s also a referen
6cb0: 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54  ce count.  .** T
6cc0: 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  he structure is 
6cd0: 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74  reclaimed when t
6ce0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69  he number of poi
6cf0: 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70  nters to it drop
6d00: 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a  s to.** zero..**
6d10: 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65  .** There are ne
6d20: 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69  ver very many fi
6d30: 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20  les open at one 
6d40: 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73  time and lookups
6d50: 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65   are not.** a pe
6d60: 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63  rformance-critic
6d70: 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69  al path, so it i
6d80: 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20  s sufficient to 
6d90: 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72  put these.** str
6da0: 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e  uctures on a lin
6db0: 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72  ked list..*/.str
6dc0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6dd0: 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  d {.  struct vxw
6de0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78  orksFileId *pNex
6df0: 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61  t;  /* Next in a
6e00: 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c   list of them al
6e10: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  l */.  int nRef;
6e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e30: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6e40: 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
6e50: 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e  this one */.  in
6e60: 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20  t nName;        
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
6e80: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61  ength of the zCa
6e90: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74  nonicalName[] st
6ea0: 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ring */.  char *
6eb0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20  zCanonicalName; 
6ec0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e          /* Canon
6ed0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f  ical filename */
6ee0: 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  .};..#if OS_VXWO
6ef0: 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75  RKS./* .** All u
6f00: 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20  nique filenames 
6f10: 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69  are held on a li
6f20: 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65 64  nked list headed
6f30: 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   by this.** vari
6f40: 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20  able:.*/.static 
6f50: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
6f60: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c  leId *vxworksFil
6f70: 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  eList = 0;../*.*
6f80: 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c  * Simplify a fil
6f90: 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63  ename into its c
6fa0: 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a  anonical form.**
6fb0: 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66   by making the f
6fc0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
6fd0: 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76  :.**.**  * remov
6fe0: 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67  ing any trailing
6ff0: 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f   and duplicate /
7000: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
7010: 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a  ./ into just /.*
7020: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f  *  * convert /A/
7030: 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20 61  ../ where A is a
7040: 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69  ny simple name i
7050: 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a  nto just /.**.**
7060: 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64   Changes are mad
7070: 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74  e in-place.  Ret
7080: 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65  urn the new name
7090: 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54   length..**.** T
70a0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
70b0: 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e  name is in z[0..
70c0: 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68  n-1].  Return th
70d0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63  e number of.** c
70e0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
70f0: 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65   simplified name
7100: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7110: 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e  vxworksSimplifyN
7120: 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74  ame(char *z, int
7130: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b   n){.  int i, j;
7140: 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26  .  while( n>1 &&
7150: 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20   z[n-1]=='/' ){ 
7160: 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a  n--; }.  for(i=j
7170: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
7180: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27     if( z[i]=='/'
7190: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
71a0: 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74  i+1]=='/' ) cont
71b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
71c0: 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69  z[i+1]=='.' && i
71d0: 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d  +2<n && z[i+2]==
71e0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '/' ){.        i
71f0: 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63   += 1;.        c
7200: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
7210: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
7220: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20  ]=='.' && i+3<n 
7230: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26  && z[i+2]=='.' &
7240: 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b  & z[i+3]=='/' ){
7250: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
7260: 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27  j>0 && z[j-1]!='
7270: 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  /' ){ j--; }.   
7280: 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20       if( j>0 ){ 
7290: 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69  j--; }.        i
72a0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63   += 2;.        c
72b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
72c0: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b  .    }.    z[j++
72d0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ] = z[i];.  }.  
72e0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  z[j] = 0;.  retu
72f0: 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  rn j;.}../*.** F
7300: 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ind a unique fil
7310: 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69 76  e ID for the giv
7320: 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  en absolute path
7330: 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  name.  Return.**
7340: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7350: 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  e vxworksFileId 
7360: 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f  object.  This po
7370: 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e 69  inter is the uni
7380: 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a  que.** file ID..
7390: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66  **.** The nRef f
73a0: 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f  ield of the vxwo
73b0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
73c0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
73d0: 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62  before.** the ob
73e0: 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65 64  ject is returned
73f0: 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73  .  A new vxworks
7400: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
7410: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
7420: 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f  added to the glo
7430: 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65  bal list if nece
7440: 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssary..**.** If 
7450: 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
7460: 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73  ion error occurs
7470: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
7480: 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
7490: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76  vxworksFileId *v
74a0: 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64  xworksFindFileId
74b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62  (const char *zAb
74c0: 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73  soluteName){.  s
74d0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
74e0: 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20  eId *pNew;      
74f0: 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79     /* search key
7500: 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44   and new file ID
7510: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77   */.  struct vxw
7520: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e  orksFileId *pCan
7530: 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72  didate;   /* For
7540: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78   looping over ex
7550: 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20  isting file IDs 
7560: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7580: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
7590: 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e  th of zAbsoluteN
75a0: 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20  ame string */.. 
75b0: 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75   assert( zAbsolu
75c0: 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29  teName[0]=='/' )
75d0: 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  ;.  n = (int)str
75e0: 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  len(zAbsoluteNam
75f0: 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  e);.  pNew = sql
7600: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
7610: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28  izeof(*pNew) + (
7620: 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  n+1) );.  if( pN
7630: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
7640: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ;.  pNew->zCanon
7650: 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  icalName = (char
7660: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65  *)&pNew[1];.  me
7670: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  mcpy(pNew->zCano
7680: 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f  nicalName, zAbso
7690: 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a  luteName, n+1);.
76a0: 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d    n = vxworksSim
76b0: 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e  plifyName(pNew->
76c0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
76d0: 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  n);..  /* Search
76e0: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
76f0: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
7700: 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63  hing the canonic
7710: 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66  al name..  ** If
7720: 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e   found, incremen
7730: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
7740: 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  count and return
7750: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20   a pointer to.  
7760: 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ** the existing 
7770: 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20  file ID..  */.  
7780: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
7790: 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61  ;.  for(pCandida
77a0: 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  te=vxworksFileLi
77b0: 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20  st; pCandidate; 
77c0: 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64  pCandidate=pCand
77d0: 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  idate->pNext){. 
77e0: 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74     if( pCandidat
77f0: 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20  e->nName==n .   
7800: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e    && memcmp(pCan
7810: 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63  didate->zCanonic
7820: 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43  alName, pNew->zC
7830: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
7840: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
7850: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
7860: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61  New);.       pCa
7870: 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b  ndidate->nRef++;
7880: 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  .       unixLeav
7890: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
78a0: 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61   return pCandida
78b0: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  te;.    }.  }.. 
78c0: 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73   /* No match was
78d0: 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c   found.  We will
78e0: 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65   make a new file
78f0: 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e   ID */.  pNew->n
7900: 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d  Ref = 1;.  pNew-
7910: 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e  >nName = n;.  pN
7920: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f  ew->pNext = vxwo
7930: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76  rksFileList;.  v
7940: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
7950: 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61   pNew;.  unixLea
7960: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
7970: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7980: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
7990: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
79a0: 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c   on a vxworksFil
79b0: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65  eId object.  Fre
79c0: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
79d0: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
79e0: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
79f0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
7a00: 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c   void vxworksRel
7a10: 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63  easeFileId(struc
7a20: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7a30: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74  *pId){.  unixEnt
7a40: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
7a50: 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30  ert( pId->nRef>0
7a60: 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d   );.  pId->nRef-
7a70: 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52  -;.  if( pId->nR
7a80: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ef==0 ){.    str
7a90: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
7aa0: 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  d **pp;.    for(
7ab0: 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c  pp=&vxworksFileL
7ac0: 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21  ist; *pp && *pp!
7ad0: 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70  =pId; pp = &((*p
7ae0: 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20  p)->pNext)){}.  
7af0: 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70    assert( *pp==p
7b00: 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Id );.    *pp = 
7b10: 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pId->pNext;.    
7b20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
7b30: 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
7b40: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e  veMutex();.}.#en
7b50: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
7b60: 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  S */./**********
7b70: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69  ***** End of Uni
7b80: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
7b90: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
7ba0: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
7bb0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7bc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c00: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
7c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c50: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
7c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7c70: 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72  ** Posix Advisor
7c80: 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
7c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7ca0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53  ******.**.** POS
7cb0: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
7cc0: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20  s are broken by 
7cd0: 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54  design.  ANSI ST
7ce0: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
7cf0: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
7d00: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
7d10: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
7d20: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
7d30: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
7d40: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
7d50: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
7d60: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
7d70: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
7d80: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
7d90: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
7da0: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
7db0: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
7dc0: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
7dd0: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
7de0: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
7df0: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
7e00: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
7e10: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
7e20: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
7e30: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
7e40: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
7e50: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
7e60: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
7e70: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
7e80: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
7e90: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
7ea0: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
7eb0: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
7ec0: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
7ed0: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
7ee0: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
7ef0: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
7f00: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
7f10: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
7f20: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
7f30: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
7f40: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
7f50: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
7f60: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
7f70: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
7f80: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
7f90: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
7fa0: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
7fb0: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
7fc0: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
7fd0: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
7fe0: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
7ff0: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
8000: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
8010: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
8020: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
8030: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
8040: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
8050: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
8060: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
8070: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
8080: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
8090: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
80a0: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  names..**.** Thi
80b0: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  s means that we 
80c0: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
80d0: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
80e0: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
80f0: 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65  s.** among compe
8100: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
8110: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
8120: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
8130: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
8140: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
8150: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
8160: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
8170: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
8180: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
8190: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
81a0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
81b0: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
81c0: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
81d0: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
81e0: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
81f0: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
8200: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
8210: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
8220: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
8230: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
8240: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
8250: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8260: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
8270: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
8280: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
8290: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
82a0: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
82b0: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
82c0: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
82d0: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
82e0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
82f0: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
8300: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
8310: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
8320: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
8330: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
8340: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
8350: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
8360: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
8370: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
8380: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
8390: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
83a0: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
83b0: 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75  ** (Aside: The u
83c0: 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62  se of inode numb
83d0: 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44  ers as unique ID
83e0: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
83f0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46  on VxWorks..** F
8400: 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68  or VxWorks, we h
8410: 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61  ave to use the a
8420: 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75  lternative uniqu
8430: 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65  e ID system base
8440: 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61  d on.** canonica
8450: 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  l filename and i
8460: 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68  mplemented in th
8470: 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73  e previous divis
8480: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion.).**.** The 
8490: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
84a0: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
84b0: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
84c0: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
84d0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
84e0: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
84f0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
8500: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
8510: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
8520: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
8530: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
8540: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
8550: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
8560: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
8570: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
8580: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
8590: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
85a0: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
85b0: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
85c0: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
85d0: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
85e0: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
85f0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
8600: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
8610: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
8620: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
8630: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
8640: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
8650: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
8660: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
8670: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
8680: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
8690: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
86a0: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
86b0: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
86c0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
86d0: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
86e0: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
86f0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
8700: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
8710: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
8720: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
8730: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
8740: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
8750: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
8760: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
8770: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
8780: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
8790: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
87a0: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
87b0: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
87c0: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
87d0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
87e0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
87f0: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
8800: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
8810: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
8820: 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20  *.** But wait:  
8830: 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f  there are yet mo
8840: 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  re problems with
8850: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
8860: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  locks..**.** If 
8870: 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65  you close a file
8880: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
8890: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c   points to a fil
88a0: 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73  e that has locks
88b0: 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f  ,.** all locks o
88c0: 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
88d0: 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68   are owned by th
88e0: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
88f0: 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65  s are.** release
8900: 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  d.  To work arou
8910: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  nd this problem,
8920: 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49   each unixInodeI
8930: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61  nfo object.** ma
8940: 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20  intains a count 
8950: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
8960: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f   pending locks o
8970: 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20  n tha inode..** 
8980: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
8990: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
89a0: 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66   an unixFile, if
89b0: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74   there are.** ot
89c0: 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65  her unixFile ope
89d0: 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e  n on the same in
89e0: 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c  ode that are hol
89f0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20  ding locks, the 
8a00: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65  call.** to close
8a10: 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  () the file desc
8a20: 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72  riptor is deferr
8a30: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20  ed until all of 
8a40: 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e  the locks clear.
8a50: 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64  .** The unixInod
8a60: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
8a70: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
8a80: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
8a90: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
8aa0: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
8ab0: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
8ac0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
8ad0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
8ae0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
8af0: 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72  *.** Yet another
8b00: 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78   problem:  Linux
8b10: 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70  Threads do not p
8b20: 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f  lay well with po
8b30: 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  six locks..**.**
8b40: 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73   Many older vers
8b50: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73  ions of linux us
8b60: 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61  e the LinuxThrea
8b70: 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68  ds library which
8b80: 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78   is.** not posix
8b90: 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64   compliant.  Und
8ba0: 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  er LinuxThreads,
8bb0: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
8bc0: 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63  by thread.** A c
8bd0: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
8be0: 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20  d or overridden 
8bf0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
8c00: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79  hread B..** Only
8c10: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f   thread A can mo
8c20: 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20  dify the lock.  
8c30: 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  Locking behavior
8c40: 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69   is correct.** i
8c50: 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e  f the appliation
8c60: 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20   uses the newer 
8c70: 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72  Native Posix Thr
8c80: 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54  ead Library (NPT
8c90: 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d  L).** on linux -
8ca0: 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63   with NPTL a loc
8cb0: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
8cc0: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
8cd0: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74  de locks.** in t
8ce0: 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68  hread B.  But th
8cf0: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
8d00: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
8d10: 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74  -time which.** t
8d20: 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79  hreading library
8d30: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
8d40: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
8d50: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a  way to know at.*
8d60: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  * compile-time w
8d70: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
8d80: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
8d90: 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72  ide locks on thr
8da0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61  ead B..** One ha
8db0: 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69  s to do a run-ti
8dc0: 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63  me check to disc
8dd0: 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f  over the behavio
8de0: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  r of the.** curr
8df0: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ent process..**.
8e00: 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74  ** SQLite used t
8e10: 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54  o support LinuxT
8e20: 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70  hreads.  But sup
8e30: 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68  port for LinuxTh
8e40: 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f  reads.** was dro
8e50: 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77  pped beginning w
8e60: 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e  ith version 3.7.
8e70: 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  0.  SQLite will 
8e80: 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a  still work with.
8e90: 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ** LinuxThreads 
8ea0: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31  provided that (1
8eb0: 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f  ) there is no mo
8ec0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e  re than one conn
8ed0: 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64  ection .** per d
8ee0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
8ef0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
8f00: 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73   and (2) databas
8f10: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
8f20: 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72   do not move acr
8f30: 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  oss threads..*/.
8f40: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
8f50: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
8f60: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
8f70: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
8f80: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
8f90: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75  e a particular u
8fa0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
8fb0: 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ect..*/.struct u
8fc0: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
8fd0: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
8fe0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
8ff0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
9000: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
9010: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
9020: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
9030: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
9040: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
9050: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
9080: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
9090: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
90a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
90b0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
90c0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
90d0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
90e0: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
90f0: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
9100: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
9110: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
9120: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
9130: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
9140: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
9150: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
9160: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
9170: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
9180: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
9190: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
91a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
91b0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
91c0: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
91d0: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
91e0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
91f0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
9200: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
9210: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
9220: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
9230: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
9240: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
9250: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
9260: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
9270: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
9280: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9290: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
92a0: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
92b0: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
92c0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
92d0: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
92e0: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
92f0: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
9300: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
9310: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
9320: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
9330: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
9340: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9370: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
9380: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
9390: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
93a0: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
93b0: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
93c0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
93d0: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
93e0: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
93f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9400: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
9410: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
9420: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
9430: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
9440: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
9450: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
9460: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
9470: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
9480: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
9490: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
94a0: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
94b0: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
94c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
94d0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
94e0: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
94f0: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
9500: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
9510: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
9520: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
9530: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
9540: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
9550: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
9560: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
9570: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
9580: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
9590: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
95a0: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
95b0: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
95c0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
95d0: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
95e0: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
95f0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
9600: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
9610: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
9620: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
9630: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
9640: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
9650: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
9660: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
9670: 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73  LogError_x(), is
9680: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
9690: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
96a0: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
96b0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
96c0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
96d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
96e0: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
96f0: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
9700: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
9710: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
9720: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
9730: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
9740: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
9750: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
9760: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
9770: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
9780: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
9790: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
97a0: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
97b0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
97c0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
97d0: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
97e0: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
97f0: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
9800: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
9810: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
9820: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
9830: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9840: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
9850: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
9860: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
9870: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
9880: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
9890: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
98a0: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
98b0: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
98c0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
98d0: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
98e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
98f0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
9900: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
9910: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
9920: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
9930: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
9940: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
9950: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
9960: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
9970: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
9980: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
9990: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
99a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
99b0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
99c0: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
99d0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
99e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
99f0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
9a00: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
9a10: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
9a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a30: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
9a40: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
9a50: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
9a60: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
9a90: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
9aa0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
9ab0: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
9ac0: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
9ad0: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
9ae0: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
9af0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
9b00: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
9b10: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
9b20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
9b30: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
9b40: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
9b50: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
9b60: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
9b70: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
9b80: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
9b90: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
9ba0: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
9bb0: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
9bc0: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
9bd0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
9be0: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
9bf0: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
9c00: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
9c10: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
9c20: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
9c30: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
9c40: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
9c50: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
9c60: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
9c70: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
9c80: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
9c90: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
9ca0: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
9cb0: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
9cc0: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
9cd0: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
9ce0: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
9cf0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
9d00: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
9d10: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
9d20: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
9d30: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
9d40: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
9d50: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
9d60: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
9d70: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
9d80: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
9d90: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
9da0: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
9db0: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
9dc0: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
9dd0: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
9de0: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
9df0: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
9e00: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
9e10: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
9e20: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
9e30: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
9e40: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
9e50: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
9e60: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
9e70: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
9e80: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
9e90: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
9ea0: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
9eb0: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
9ec0: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
9ed0: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
9ee0: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
9ef0: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
9f00: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
9f10: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
9f20: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
9f30: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
9f40: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
9f50: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
9f60: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
9f70: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
9f80: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
9f90: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
9fa0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
9fb0: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
9fc0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
9fd0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
9fe0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
9ff0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
a000: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
a010: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
a020: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
a030: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
a040: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
a050: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
a060: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
a070: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
a080: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
a090: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
a0a0: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
a0b0: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
a0c0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
a0d0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
a0e0: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
a0f0: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
a100: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
a110: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
a120: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
a130: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
a140: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
a150: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
a160: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
a170: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
a180: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
a190: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
a1a0: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
a1b0: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
a1c0: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
a1d0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
a1e0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
a1f0: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
a200: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
a210: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
a220: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
a230: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
a240: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
a250: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
a260: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
a270: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
a280: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
a290: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
a2a0: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
a2b0: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
a2c0: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
a2d0: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
a2e0: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
a2f0: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
a300: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
a310: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
a320: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
a330: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
a340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a350: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
a360: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
a370: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
a380: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 46  /*.** Set the pF
a390: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e 20  ile->lastErrno. 
a3a0: 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73 75   Do this in a su
a3b0: 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61 74  broutine as that
a3c0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20 63   provides.** a c
a3d0: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
a3e0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
a3f0: 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
a400: 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72 72  oid storeLastErr
a410: 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  no(unixFile *pFi
a420: 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a  le, int error){.
a430: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
a440: 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f  no = error;.}../
a450: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66  *.** Close all f
a460: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
a470: 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74 68  accumuated in th
a480: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d  e unixInodeInfo-
a490: 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a  >pUnused list..*
a4a0: 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  / .static void c
a4b0: 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 75  losePendingFds(u
a4c0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
a4d0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
a4e0: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
a4f0: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
a500: 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20 55  UnusedFd *p;.  U
a510: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e 65  nixUnusedFd *pNe
a520: 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f  xt;.  for(p=pIno
a530: 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20  de->pUnused; p; 
a540: 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  p=pNext){.    pN
a550: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
a560: 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
a570: 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f  (pFile, p->fd, _
a580: 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71  _LINE__);.    sq
a590: 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
a5a0: 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e   }.  pInode->pUn
a5b0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
a5c0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e 69  ** Release a uni
a5d0: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
a5e0: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
a5f0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
a600: 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a 2a  dInodeInfo()..**
a610: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
a620: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
a630: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
a640: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
a650: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
a660: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a670: 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
a680: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49 6e  c void releaseIn
a690: 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c 65  odeInfo(unixFile
a6a0: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
a6b0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
a6c0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
a6d0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
a6e0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
a6f0: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49 6e    if( ALWAYS(pIn
a700: 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  ode) ){.    pIno
a710: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
a720: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
a730: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
a740: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53 68  ert( pInode->pSh
a750: 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20 20  mNode==0 );.    
a760: 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
a770: 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
a780: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  if( pInode->pPre
a790: 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  v ){.        ass
a7a0: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ert( pInode->pPr
a7b0: 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64  ev->pNext==pInod
a7c0: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
a7d0: 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ode->pPrev->pNex
a7e0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
a7f0: 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  t;.      }else{.
a800: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
a810: 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64  inodeList==pInod
a820: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f  e );.        ino
a830: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d  deList = pInode-
a840: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
a850: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
a860: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20  ->pNext ){.     
a870: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
a880: 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d  e->pNext->pPrev=
a890: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
a8a0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
a8b0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
a8c0: 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20 7d  ->pPrev;.      }
a8d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
a8e0: 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ree(pInode);.   
a8f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
a900: 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73  Given a file des
a910: 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20  criptor, locate 
a920: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
a930: 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a  o object that.**
a940: 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74 20   describes that 
a950: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
a960: 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f    Create a new o
a970: 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ne if necessary.
a980: 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20    The.** return 
a990: 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20 75  value might be u
a9a0: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66 20  ninitialized if 
a9b0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  an error occurs.
a9c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78  .**.** The mutex
a9d0: 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74   entered using t
a9e0: 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
a9f0: 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  x() function mus
aa00: 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65  t be held.** whe
aa10: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
aa20: 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
aa30: 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72 6f   Return an appro
aa40: 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
aa50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
aa60: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a   findInodeInfo(.
aa70: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
aa80: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
aa90: 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77 69   /* Unix file wi
aaa0: 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73 65  th file desc use
aab0: 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a  d in the key */.
aac0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
aad0: 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20 20  **ppInode       
aae0: 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75   /* Return the u
aaf0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
ab00: 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ect here */.){. 
ab10: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
ab20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab30: 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20 72  /* System call r
ab40: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
ab50: 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20  int fd;         
ab60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ab70: 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
ab80: 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65 20  iptor for pFile 
ab90: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
aba0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
abb0: 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b 65      /* Lookup ke
abc0: 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49 6e  y for the unixIn
abd0: 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74 72  odeInfo */.  str
abe0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
abf0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
ac00: 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e  ow-level file in
ac10: 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 75  formation */.  u
ac20: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ac30: 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f 2a  node = 0;     /*
ac40: 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78 49   Candidate unixI
ac50: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20  nodeInfo object 
ac60: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75 6e  */..  assert( un
ac70: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
ac80: 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d 6c  ..  /* Get low-l
ac90: 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  evel information
aca0: 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20   about the file 
acb0: 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65 64  that we can used
acc0: 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65 20   to.  ** create 
acd0: 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66 6f  a unique name fo
ace0: 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  r the file..  */
acf0: 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68  .  fd = pFile->h
ad00: 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74  ;.  rc = osFstat
ad10: 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a  (fd, &statbuf);.
ad20: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
ad30: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ad40: 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
ad50: 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c 4f  .#ifdef EOVERFLO
ad60: 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  W.    if( pFile-
ad70: 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56 45  >lastErrno==EOVE
ad80: 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20 53  RFLOW ) return S
ad90: 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65 6e  QLITE_NOLFS;.#en
ada0: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
adb0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
adc0: 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45  ..#ifdef __APPLE
add0: 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58 20  __.  /* On OS X 
ade0: 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c 65  on an msdos file
adf0: 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f 64  system, the inod
ae00: 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70 6f  e number is repo
ae10: 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72 72  rted.  ** incorr
ae20: 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d 73  ectly for zero-s
ae30: 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65 20  ize files.  See 
ae40: 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20 54  ticket #3260.  T
ae50: 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f 75  o work.  ** arou
ae60: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  nd this problem 
ae70: 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74 20  (we consider it 
ae80: 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20 6e  a bug in OS X, n
ae90: 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a 20  ot SQLite).  ** 
aea0: 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65 61  we always increa
aeb0: 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  se the file size
aec0: 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e 67   to 1 by writing
aed0: 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
aee0: 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63 63   ** prior to acc
aef0: 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64 65  essing the inode
af00: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f 6e   number.  The on
af10: 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20 69  e byte written i
af20: 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49 20  s.  ** an ASCII 
af30: 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77 68  'S' character wh
af40: 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e 73  ich also happens
af50: 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
af60: 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74 68   byte.  ** in th
af70: 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65 72  e header of ever
af80: 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  y SQLite databas
af90: 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  e.  In this way,
afa0: 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 69   if there.  ** i
afb0: 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
afc0: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e 6f  on such that ano
afd0: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
afe0: 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74 65  already populate
aff0: 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73 74  d.  ** the first
b000: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
b010: 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67 65  abase, no damage
b020: 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a 20   is done..  */. 
b030: 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74 5f   if( statbuf.st_
b040: 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69 6c  size==0 && (pFil
b050: 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c  e->fsFlags & SQL
b060: 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d  ITE_FSFLAGS_IS_M
b070: 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20 20  SDOS)!=0 ){.    
b080: 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74 65  do{ rc = osWrite
b090: 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d 77  (fd, "S", 1); }w
b0a0: 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
b0b0: 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20  rno==EINTR );.  
b0c0: 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a 20    if( rc!=1 ){. 
b0d0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
b0e0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
b0f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
b100: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
b110: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73 46    }.    rc = osF
b120: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
b130: 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
b140: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  0 ){.      store
b150: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
b160: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
b170: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
b180: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  RR;.    }.  }.#e
b190: 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28 26  ndif..  memset(&
b1a0: 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65 6f  fileId, 0, sizeo
b1b0: 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66 69  f(fileId));.  fi
b1c0: 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74 62  leId.dev = statb
b1d0: 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20 4f  uf.st_dev;.#if O
b1e0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c 65  S_VXWORKS.  file
b1f0: 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d 3e  Id.pId = pFile->
b200: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69 6c  pId;.#else.  fil
b210: 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75  eId.ino = statbu
b220: 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66  f.st_ino;.#endif
b230: 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64  .  pInode = inod
b240: 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28 20  eList;.  while( 
b250: 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d 70  pInode && memcmp
b260: 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f 64  (&fileId, &pInod
b270: 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f  e->fileId, sizeo
b280: 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20 20  f(fileId)) ){.  
b290: 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
b2a0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  e->pNext;.  }.  
b2b0: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
b2c0: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73 71  .    pInode = sq
b2d0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
b2e0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20  sizeof(*pInode) 
b2f0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
b300: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  e==0 ){.      re
b310: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
b320: 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  M;.    }.    mem
b330: 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73  set(pInode, 0, s
b340: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b  izeof(*pInode));
b350: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e  .    memcpy(&pIn
b360: 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69  ode->fileId, &fi
b370: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
b380: 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64  eId));.    pInod
b390: 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20  e->nRef = 1;.   
b3a0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d   pInode->pNext =
b3b0: 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
b3c0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20  pInode->pPrev = 
b3d0: 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65  0;.    if( inode
b3e0: 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74  List ) inodeList
b3f0: 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65  ->pPrev = pInode
b400: 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20  ;.    inodeList 
b410: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73  = pInode;.  }els
b420: 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e{.    pInode->n
b430: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70  Ref++;.  }.  *pp
b440: 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a  Inode = pInode;.
b450: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b460: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
b470: 75 72 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c  urn TRUE if pFil
b480: 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d  e has been renam
b490: 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73  ed or unlinked s
b4a0: 69 6e 63 65 20 69 74 20 77 61 73 20 66 69 72 73  ince it was firs
b4b0: 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61  t opened..*/.sta
b4c0: 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d  tic int fileHasM
b4d0: 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  oved(unixFile *p
b4e0: 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58  File){.#if OS_VX
b4f0: 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70  WORKS.  return p
b500: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20  File->pInode!=0 
b510: 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70  && pFile->pId!=p
b520: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
b530: 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a  leId.pId;.#else.
b540: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
b550: 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c  f;.  return pFil
b560: 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a  e->pInode!=0 &&.
b570: 20 20 20 20 20 20 28 6f 73 53 74 61 74 28 70 46        (osStat(pF
b580: 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66  ile->zPath, &buf
b590: 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f 69  )!=0 || buf.st_i
b5a0: 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  no!=pFile->pInod
b5b0: 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a  e->fileId.ino);.
b5c0: 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  #endif.}.../*.**
b5d0: 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c   Check a unixFil
b5e0: 65 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61  e that is a data
b5f0: 62 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68  base.  Verify th
b600: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
b610: 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20  ** (1) There is 
b620: 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64  exactly one hard
b630: 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c   link on the fil
b640: 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c  e.** (2) The fil
b650: 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
b660: 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20  lic link.** (3) 
b670: 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  The file has not
b680: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
b690: 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20   unlinked.**.** 
b6a0: 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f  Issue sqlite3_lo
b6b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
b6c0: 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69  ,...) messages i
b6d0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f  f anything is no
b6e0: 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74  t right..*/.stat
b6f0: 69 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62  ic void verifyDb
b700: 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
b710: 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20  File){.  struct 
b720: 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20  stat buf;.  int 
b730: 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  rc;.  if( pFile-
b740: 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
b750: 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b 0a  XFILE_WARNED ){.
b760: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f      /* One or mo
b770: 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  re of the follow
b780: 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61 76  ing warnings hav
b790: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69  e already been i
b7a0: 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a 20  ssued.  Do not. 
b7b0: 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68 65     ** repeat the
b7c0: 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63  m so as not to c
b7d0: 6c 75 74 74 65 72 20 74 68 65 20 65 72 72 6f 72  lutter the error
b7e0: 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74 75   log */.    retu
b7f0: 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6f  rn;.  }.  rc = o
b800: 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
b810: 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63   &buf);.  if( rc
b820: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
b830: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
b840: 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66  RNING, "cannot f
b850: 73 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22  stat db file %s"
b860: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
b870: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
b880: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
b890: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
b8a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
b8b0: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20  buf.st_nlink==0 
b8c0: 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46  && (pFile->ctrlF
b8d0: 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
b8e0: 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20  DELETE)==0 ){.  
b8f0: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b900: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66  LITE_WARNING, "f
b910: 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69  ile unlinked whi
b920: 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46  le open: %s", pF
b930: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
b940: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
b950: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
b960: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
b970: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e  ;.  }.  if( buf.
b980: 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20  st_nlink>1 ){.  
b990: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
b9a0: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d  LITE_WARNING, "m
b9b0: 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f  ultiple links to
b9c0: 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c   file: %s", pFil
b9d0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
b9e0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
b9f0: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
ba00: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
ba10: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61    }.  if( fileHa
ba20: 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b  sMoved(pFile) ){
ba30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
ba40: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
ba50: 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77   "file renamed w
ba60: 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20  hile open: %s", 
ba70: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
ba80: 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
ba90: 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
baa0: 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75  WARNED;.    retu
bab0: 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  rn;.  }.}.../*.*
bac0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bad0: 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
bae0: 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
baf0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
bb00: 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
bb10: 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
bb20: 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
bb30: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
bb40: 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
bb50: 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
bb60: 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
bb70: 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
bb80: 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
bb90: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
bba0: 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
bbb0: 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
bbc0: 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
bbd0: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
bbe0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
bbf0: 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65   int unixCheckRe
bc00: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
bc10: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
bc20: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
bc30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
bc40: 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
bc50: 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
bc60: 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
bc70: 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75  ile*)id;..  Simu
bc80: 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
bc90: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
bca0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
bcb0: 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  CK; );..  assert
bcc0: 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69  ( pFile );.  uni
bcd0: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
bce0: 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
bcf0: 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
bd00: 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
bd10: 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   */..  /* Check 
bd20: 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
bd30: 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
bd40: 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
bd50: 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49  .  if( pFile->pI
bd60: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
bd70: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
bd80: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
bd90: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72  .  }..  /* Other
bda0: 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
bdb0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
bdc0: 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69  olds it..  */.#i
bdd0: 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a  fndef __DJGPP__.
bde0: 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
bdf0: 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  && !pFile->pInod
be00: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
be10: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
be20: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f  ock lock;.    lo
be30: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
be40: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
be50: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
be60: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  VED_BYTE;.    lo
be70: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  ck.l_len = 1;.  
be80: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
be90: 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28  F_WRLCK;.    if(
bea0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
beb0: 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_GETLK, &loc
bec0: 6b 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  k) ){.      rc =
bed0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
bee0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
bef0: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
bf00: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
bf10: 6e 6f 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  no);.    } else 
bf20: 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21  if( lock.l_type!
bf30: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
bf40: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
bf50: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
bf60: 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
bf70: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
bf80: 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
bf90: 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29   %d %d %d (unix)
bfa0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
bfb0: 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
bfc0: 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
bfd0: 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
bfe0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  rc;.}../*.** Att
bff0: 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79  empt to set a sy
c000: 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  stem-lock on the
c010: 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68   file pFile.  Th
c020: 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65  e lock is .** de
c030: 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b  scribed by pLock
c040: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
c050: 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  File was opened 
c060: 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20  read/write from 
c070: 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20  unix-excl, then 
c080: 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a  the only lock.**
c090: 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69   ever obtained i
c0a0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
c0b0: 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f  ock, and it is o
c0c0: 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20  btained exactly 
c0d0: 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73  once.** the firs
c0e0: 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20  t time any lock 
c0f0: 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41  is attempted.  A
c100: 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79  ll subsequent sy
c110: 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  stem locking.** 
c120: 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d  operations becom
c130: 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69  e no-ops.  Locki
c140: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74  ng operations st
c150: 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72  ill happen inter
c160: 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64  nally,.** in ord
c170: 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  er to coordinate
c180: 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20   access between 
c190: 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73  separate databas
c1a0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
c1b0: 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f   within this pro
c1c0: 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66  cess, but all of
c1d0: 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64   that is handled
c1e0: 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74   in memory and t
c1f0: 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  he.** operating 
c200: 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
c210: 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a  participate..**.
c220: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
c230: 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75   is a pass-throu
c240: 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45  gh to fcntl(F_SE
c250: 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73  TLK) if pFile is
c260: 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46   using.** any VF
c270: 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e  S other than "un
c280: 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70  ix-excl" or if p
c290: 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f  File is opened o
c2a0: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a  n "unix-excl".**
c2b0: 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c   and is read-onl
c2c0: 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  y..**.** Zero is
c2d0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
c2e0: 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20   call completes 
c2f0: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72  successfully, or
c300: 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a   -1 if a call.**
c310: 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c   to fcntl() fail
c320: 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  s. In this case,
c330: 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70   errno is set ap
c340: 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20  propriately (by 
c350: 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61  fcntl())..*/.sta
c360: 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
c370: 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70  Lock(unixFile *p
c380: 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f  File, struct flo
c390: 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e  ck *pLock){.  in
c3a0: 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  t rc;.  unixInod
c3b0: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
c3c0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
c3d0: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
c3e0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
c3f0: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
c400: 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65  );.  if( ((pFile
c410: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
c420: 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20  IXFILE_EXCL)!=0 
c430: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  || pInode->bProc
c440: 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28  essLock).   && (
c450: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
c460: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
c470: 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  NLY)==0).  ){.  
c480: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
c490: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
c4a0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
c4b0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
c4c0: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
c4d0: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
c4e0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
c4f0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
c500: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
c510: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
c520: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
c530: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
c540: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
c550: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
c560: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
c570: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
c580: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
c590: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
c5a0: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
c5b0: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
c5c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
c5d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
c5e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
c5f0: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
c600: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 6f 73  lse{.    rc = os
c610: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
c620: 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63 6b 29 3b  F_SETLK, pLock);
c630: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c640: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
c650: 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
c660: 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
c670: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
c680: 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
c690: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
c6a0: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
c6b0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
c6c0: 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
c6d0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
c6e0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
c6f0: 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
c700: 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
c710: 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
c720: 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
c730: 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
c740: 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
c750: 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
c760: 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
c770: 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
c780: 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
c790: 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
c7a0: 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
c7b0: 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
c7c0: 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
c7d0: 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
c7e0: 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
c7f0: 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
c800: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
c810: 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
c820: 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
c830: 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
c840: 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
c850: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
c860: 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
c870: 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
c880: 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
c890: 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
c8a0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
c8b0: 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
c8c0: 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
c8d0: 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
c8e0: 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
c8f0: 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
c900: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
c910: 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
c920: 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
c930: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
c940: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
c950: 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
c960: 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
c970: 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c  int unixLock(sql
c980: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
c990: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
c9a0: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
c9b0: 67 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  g describes the 
c9c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
c9d0: 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f  f the various lo
c9e0: 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63  cks and.  ** loc
c9f0: 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e  k transitions in
ca00: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f   terms of the PO
ca10: 53 49 58 20 61 64 76 69 73 6f 72 79 20 73 68 61  SIX advisory sha
ca20: 72 65 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76  red and exclusiv
ca30: 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d  e.  ** lock prim
ca40: 69 74 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72  itives (called r
ca50: 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72  ead-locks and wr
ca60: 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c  ite-locks below,
ca70: 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63   to avoid.  ** c
ca80: 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51  onfusion with SQ
ca90: 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29  Lite lock names)
caa0: 2e 20 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73  . The algorithms
cab0: 20 61 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64   are complicated
cac0: 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69  .  ** slightly i
cad0: 6e 20 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f  n order to be co
cae0: 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 77 69  mpatible with wi
caf0: 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69  ndows systems si
cb00: 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a  multaneously.  *
cb10: 2a 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  * accessing the 
cb20: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69  same database fi
cb30: 6c 65 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74  le, in case that
cb40: 20 69 73 20 65 76 65 72 20 72 65 71 75 69 72 65   is ever require
cb50: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d  d..  **.  ** Sym
cb60: 62 6f 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20  bols defined in 
cb70: 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74  os.h indentify t
cb80: 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65  he 'pending byte
cb90: 27 20 61 6e 64 20 74 68 65 20 27 72 65 73 65 72  ' and the 'reser
cba0: 76 65 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20  ved.  ** byte', 
cbb0: 65 61 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65  each single byte
cbc0: 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  s at well known 
cbd0: 6f 66 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65  offsets, and the
cbe0: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
cbf0: 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e  ** range', a ran
cc00: 67 65 20 6f 66 20 35 31 30 20 62 79 74 65 73 20  ge of 510 bytes 
cc10: 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20  at a well known 
cc20: 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a  offset..  **.  *
cc30: 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48  * To obtain a SH
cc40: 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61  ARED lock, a rea
cc50: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
cc60: 65 64 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ed on the 'pendi
cc70: 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20  ng.  ** byte'.  
cc80: 49 66 20 74 68 69 73 20 69 73 20 73 75 63 63 65  If this is succe
cc90: 73 73 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20  ssful, a random 
cca0: 62 79 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73  byte from the 's
ccb0: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ccc0: 72 61 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c  range' is read-l
ccd0: 6f 63 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f  ocked and the lo
cce0: 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69  ck on the 'pendi
ccf0: 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73 65  ng byte' release
cd00: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70  d..  **.  ** A p
cd10: 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20  rocess may only 
cd20: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
cd30: 44 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20  D lock after it 
cd40: 68 61 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  has a SHARED loc
cd50: 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56  k..  ** A RESERV
cd60: 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  ED lock is imple
cd70: 6d 65 6e 74 65 64 20 62 79 20 67 72 61 62 62 69  mented by grabbi
cd80: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  ng a write-lock 
cd90: 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73  on the.  ** 'res
cda0: 65 72 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20  erved byte'. .  
cdb0: 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73  **.  ** A proces
cdc0: 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69  s may only obtai
cdd0: 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  n a PENDING lock
cde0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 6f 62   after it has ob
cdf0: 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48  tained a.  ** SH
ce00: 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e  ARED lock. A PEN
ce10: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70  DING lock is imp
ce20: 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61  lemented by obta
ce30: 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  ining a write-lo
ce40: 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27  ck.  ** on the '
ce50: 70 65 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54  pending byte'. T
ce60: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
ce70: 20 6e 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c   no new SHARED l
ce80: 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a  ocks can be.  **
ce90: 20 6f 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65   obtained, but e
cea0: 78 69 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c  xisting SHARED l
ceb0: 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64  ocks are allowed
cec0: 20 74 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70   to persist. A p
ced0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73  rocess.  ** does
cee0: 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74   not have to obt
cef0: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
cf00: 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74  ock on the way t
cf10: 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  o a PENDING lock
cf20: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70  ..  ** This prop
cf30: 65 72 74 79 20 69 73 20 75 73 65 64 20 62 79 20  erty is used by 
cf40: 74 68 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f  the algorithm fo
cf50: 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61  r rolling back a
cf60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20   journal file.  
cf70: 2a 2a 20 61 66 74 65 72 20 61 20 63 72 61 73 68  ** after a crash
cf80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45  ..  **.  ** An E
cf90: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f  XCLUSIVE lock, o
cfa0: 62 74 61 69 6e 65 64 20 61 66 74 65 72 20 61 20  btained after a 
cfb0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
cfc0: 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d  held, is.  ** im
cfd0: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74  plemented by obt
cfe0: 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c  aining a write-l
cff0: 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72  ock on the entir
d000: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
d010: 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63   ** range'. Sinc
d020: 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b  e all other lock
d030: 73 20 72 65 71 75 69 72 65 20 61 20 72 65 61 64  s require a read
d040: 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20  -lock on one of 
d050: 74 68 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77  the bytes.  ** w
d060: 69 74 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65  ithin this range
d070: 2c 20 74 68 69 73 20 65 6e 73 75 72 65 73 20 74  , this ensures t
d080: 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63  hat no other loc
d090: 6b 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74  ks are held on t
d0a0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d0b0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
d0c0: 20 72 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65   reason a single
d0d0: 20 62 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20   byte cannot be 
d0e0: 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20  used instead of 
d0f0: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
d100: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20  .  ** range' is 
d110: 74 68 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f  that some versio
d120: 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f  ns of windows do
d130: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61   not support rea
d140: 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a  d-locks. By.  **
d150: 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f   locking a rando
d160: 6d 20 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61  m byte from a ra
d170: 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20  nge, concurrent 
d180: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79  SHARED locks may
d190: 20 65 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e   exist.  ** even
d1a0: 20 69 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   if the locking 
d1b0: 70 72 69 6d 69 74 69 76 65 20 75 73 65 64 20 69  primitive used i
d1c0: 73 20 61 6c 77 61 79 73 20 61 20 77 72 69 74 65  s always a write
d1d0: 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e  -lock..  */.  in
d1e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d1f0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
d200: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
d210: 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
d220: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
d230: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
d240: 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  k;.  int tErrno 
d250: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
d260: 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
d270: 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
d280: 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29  %s was %s(%s,%d)
d290: 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e   pid=%d (unix)\n
d2a0: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
d2b0: 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
d2c0: 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
d2d0: 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
d2e0: 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a  eLock),.      az
d2f0: 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e  FileLock(pFile->
d300: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d310: 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  k), pFile->pInod
d320: 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
d330: 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
d340: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
d350: 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  is already a loc
d360: 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f  k of this type o
d370: 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69  r more restricti
d380: 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75  ve on the.  ** u
d390: 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68  nixFile, do noth
d3a0: 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74  ing. Don't use t
d3b0: 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69  he end_lock: exi
d3c0: 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20  t path, as.  ** 
d3d0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
d3e0: 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c   hasn't been cal
d3f0: 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20  led yet..  */.  
d400: 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
d410: 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock>=eFileLock 
d420: 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  ){.    OSTRACE((
d430: 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f  "LOCK    %d %s o
d440: 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29  k (already held)
d450: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
d460: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
d470: 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69    azFileLock(eFi
d480: 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72  leLock)));.    r
d490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d4a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
d4b0: 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67  sure the locking
d4c0: 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72   sequence is cor
d4d0: 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20  rect..  **  (1) 
d4e0: 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
d4f0: 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
d500: 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
d510: 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
d520: 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
d530: 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
d540: 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
d550: 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
d560: 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
d570: 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
d580: 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
d590: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
d5a0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
d5b0: 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
d5c0: 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
d5d0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d5e0: 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
d5f0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
d600: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
d610: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d620: 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
d630: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
d640: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
d650: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  CK );..  /* This
d660: 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
d670: 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
d680: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
d690: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
d6a0: 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
d6b0: 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
d6c0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
d6d0: 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
d6e0: 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
d6f0: 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
d700: 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
d710: 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
d720: 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
d730: 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
d740: 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
d750: 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
d760: 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
d770: 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
d780: 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
d790: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
d7a0: 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e  FileLock>=PENDIN
d7b0: 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  G_LOCK || eFileL
d7c0: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ock>SHARED_LOCK)
d7d0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ).  ){.    rc = 
d7e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
d7f0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
d800: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53    }..  /* If a S
d810: 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65  HARED lock is re
d820: 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d  quested, and som
d830: 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74  e thread using t
d840: 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a  his PID already.
d850: 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45    ** has a SHARE
d860: 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f  D or RESERVED lo
d870: 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ck, then increme
d880: 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  nt reference cou
d890: 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74  nts and.  ** ret
d8a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20  urn SQLITE_OK.. 
d8b0: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d8c0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d8d0: 20 26 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f   && .      (pIno
d8e0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
d8f0: 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
d900: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
d910: 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
d920: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
d930: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
d940: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
d950: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
d960: 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
d970: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
d980: 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
d990: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d9a0: 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
d9b0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
d9c0: 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
d9d0: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
d9e0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
d9f0: 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e    }...  /* A PEN
da00: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65  DING lock is nee
da10: 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75 69  ded before acqui
da20: 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f  ring a SHARED lo
da30: 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20  ck and before.  
da40: 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20  ** acquiring an 
da50: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
da60: 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44 20   For the SHARED 
da70: 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e  lock, the PENDIN
da80: 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72  G will.  ** be r
da90: 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  eleased..  */.  
daa0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
dab0: 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65  .  lock.l_whence
dac0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69   = SEEK_SET;.  i
dad0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
dae0: 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20  ARED_LOCK .     
daf0: 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   || (eFileLock==
db00: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
db10: 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  & pFile->eFileLo
db20: 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29  ck<PENDING_LOCK)
db30: 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  .  ){.    lock.l
db40: 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f  _type = (eFileLo
db50: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f  ck==SHARED_LOCK?
db60: 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29  F_RDLCK:F_WRLCK)
db70: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
db80: 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
db90: 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  E;.    if( unixF
dba0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
dbb0: 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74  lock) ){.      t
dbc0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
dbd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
dbe0: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
dbf0: 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
dc00: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
dc10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
dc20: 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
dc30: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
dc40: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
dc50: 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
dc60: 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
dc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
dc80: 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
dc90: 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
dca0: 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
dcb0: 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
dcc0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
dcd0: 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
dce0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
dcf0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
dd00: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
dd10: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
dd20: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
dd30: 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
dd40: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
dd50: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
dd60: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
dd70: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
dd80: 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
dd90: 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
dda0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
ddb0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
ddc0: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
ddd0: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
dde0: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
ddf0: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
de00: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
de10: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
de20: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
de30: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
de40: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
de50: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
de60: 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
de70: 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
de80: 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
de90: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
dea0: 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
deb0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
dec0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
ded0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
dee0: 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
def0: 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20 26  (pFile, &lock) &
df00: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
df10: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
df20: 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69   could happen wi
df30: 74 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75  th a network mou
df40: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72  nt */.      tErr
df50: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
df60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
df70: 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20 20  ERR_UNLOCK; .   
df80: 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29   }..    if( rc )
df90: 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  {.      if( rc!=
dfa0: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
dfb0: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
dfc0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
dfd0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
dfe0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
dff0: 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
e000: 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
e010: 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
e020: 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
e030: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
e040: 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
e050: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
e060: 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
e070: 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
e080: 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
e090: 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
e0a0: 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
e0b0: 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
e0c0: 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
e0d0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
e0e0: 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
e0f0: 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
e100: 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
e110: 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
e120: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
e130: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
e140: 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
e150: 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
e160: 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
e170: 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
e180: 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
e190: 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
e1a0: 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
e1b0: 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
e1c0: 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
e1d0: 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
e1e0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
e1f0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
e200: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
e210: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
e220: 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
e230: 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
e240: 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
e250: 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
e260: 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
e270: 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
e280: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
e290: 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
e2a0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
e2b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
e2c0: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
e2d0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
e2e0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
e2f0: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
e300: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
e310: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
e320: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
e330: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
e340: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
e350: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
e360: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
e370: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
e380: 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  K);.      if( rc
e390: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  !=SQLITE_BUSY ){
e3a0: 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
e3b0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e3c0: 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  Errno);.      }.
e3d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69      }.  }.  ..#i
e3e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
e3f0: 47 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68  G.  /* Set up th
e400: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f  e transaction-co
e410: 75 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65  unter change che
e420: 63 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e  cking flags when
e430: 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  .  ** transition
e440: 69 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45  ing from a SHARE
e450: 44 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20  D to a RESERVED 
e460: 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67  lock.  The chang
e470: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52  e.  ** from SHAR
e480: 45 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d  ED to RESERVED m
e490: 61 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69  arks the beginni
e4a0: 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20  ng of a normal. 
e4b0: 20 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74   ** write operat
e4c0: 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a  ion (not a hot j
e4d0: 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29  ournal rollback)
e4e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
e4f0: 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26  =SQLITE_OK.   &&
e500: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e510: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20  k<=SHARED_LOCK. 
e520: 20 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d    && eFileLock==
e530: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20  RESERVED_LOCK.  
e540: 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  ){.    pFile->tr
e550: 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b  ansCntrChng = 0;
e560: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
e570: 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  date = 0;.    pF
e580: 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
e590: 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64  te = 1;.  }.#end
e5a0: 69 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  if...  if( rc==S
e5b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e5c0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
e5d0: 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
e5e0: 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
e5f0: 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
e600: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
e610: 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
e620: 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  E_LOCK ){.    pF
e630: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
e640: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
e650: 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
e660: 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
e670: 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f  OCK;.  }..end_lo
e680: 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
e690: 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
e6a0: 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
e6b0: 73 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20  s %s (unix)\n", 
e6c0: 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65  pFile->h, azFile
e6d0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
e6e0: 20 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49   .      rc==SQLI
e6f0: 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
e700: 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
e710: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e720: 20 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65   Add the file de
e730: 73 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79  scriptor used by
e740: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69   file handle pFi
e750: 6c 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73  le to the corres
e760: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73  ponding.** pUnus
e770: 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  ed list..*/.stat
e780: 69 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69  ic void setPendi
e790: 6e 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70  ngFd(unixFile *p
e7a0: 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f  File){.  unixIno
e7b0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
e7c0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
e7d0: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
e7e0: 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  p = pFile->pUnus
e7f0: 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d  ed;.  p->pNext =
e800: 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64   pInode->pUnused
e810: 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  ;.  pInode->pUnu
e820: 73 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65  sed = p;.  pFile
e830: 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c  ->h = -1;.  pFil
e840: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
e850: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
e860: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
e870: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
e880: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
e890: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
e8a0: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
e8b0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
e8c0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
e8d0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
e8e0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
e8f0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e900: 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
e910: 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
e920: 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
e930: 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
e940: 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
e950: 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e  * .** If handleN
e960: 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65  FSUnlock is true
e970: 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72  , then on downgr
e980: 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  ading an EXCLUSI
e990: 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45  VE_LOCK to SHARE
e9a0: 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61  D.** the byte ra
e9b0: 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69  nge is divided i
e9c0: 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20  nto 2 parts and 
e9d0: 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69  the first part i
e9e0: 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a  s unlocked then.
e9f0: 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64  ** set to a read
ea00: 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
ea10: 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69  other part is si
ea20: 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20  mply unlocked.  
ea30: 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61  This works .** a
ea40: 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42  round a bug in B
ea50: 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c  SD NFS lockd (al
ea60: 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53  so seen on MacOS
ea70: 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61  X 10.3+) that fa
ea80: 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76  ils to .** remov
ea90: 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
eaa0: 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65   on a region whe
eab0: 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  n a read lock is
eac0: 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   set..*/.static 
ead0: 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  int posixUnlock(
eae0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
eaf0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c  , int eFileLock,
eb00: 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e   int handleNFSUn
eb10: 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c  lock){.  unixFil
eb20: 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
eb30: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
eb40: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
eb50: 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  e;.  struct floc
eb60: 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63  k lock;.  int rc
eb70: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
eb80: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
eb90: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
eba0: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
ebb0: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
ebc0: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
ebd0: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
ebe0: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
ebf0: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
ec00: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
ec10: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
ec20: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
ec30: 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
ec40: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ec50: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
ec60: 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
ec70: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
ec80: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
ec90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
eca0: 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
ecb0: 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
ecc0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
ecd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
ece0: 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
ecf0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
ed00: 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
ed10: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
ed20: 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
ed30: 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
ed40: 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64  ileLock );..#ifd
ed50: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
ed60: 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
ed70: 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
ed80: 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
ed90: 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
eda0: 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
edb0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
edc0: 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
edd0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
ede0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
edf0: 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
ee00: 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
ee10: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
ee20: 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
ee30: 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
ee40: 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
ee50: 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
ee60: 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
ee70: 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
ee80: 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
ee90: 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
eea0: 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
eeb0: 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
eec0: 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
eed0: 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
eee0: 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
eef0: 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
ef00: 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
ef10: 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
ef20: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
ef30: 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   */.    pFile->i
ef40: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
ef50: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
ef60: 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20   downgrading to 
ef70: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
ef80: 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c   NFS involves cl
ef90: 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65  earing the write
efa0: 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66   lock.    ** bef
efb0: 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67  ore establishing
efc0: 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20   the readlock - 
efd0: 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20  to avoid a race 
efe0: 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77  condition we dow
eff0: 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68  ngrade.    ** th
f000: 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63  e lock in 2 bloc
f010: 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74  ks, so that part
f020: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69   of the range wi
f030: 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79  ll be covered by
f040: 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65   a .    ** write
f050: 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20   lock until the 
f060: 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20  rest is covered 
f070: 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a  by a read lock:.
f080: 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57      **  1:   [WW
f090: 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20  WWW].    **  2: 
f0a0: 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a    [....W].    **
f0b0: 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20    3:   [RRRRW]. 
f0c0: 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52     **  4:   [RRR
f0d0: 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  R.].    */.    i
f0e0: 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
f0f0: 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66  ARED_LOCK ){.#if
f100: 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c   !defined(__APPL
f110: 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f  E__) || !SQLITE_
f120: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
f130: 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64  TYLE.      (void
f140: 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b  )handleNFSUnlock
f150: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f160: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d  handleNFSUnlock=
f170: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
f180: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
f190: 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
f1a0: 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
f1b0: 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e  LE.      if( han
f1c0: 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a  dleNFSUnlock ){.
f1d0: 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72          int tErr
f1e0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
f1f0: 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20    /* Error code 
f200: 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c  from system call
f210: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20   errors */.     
f220: 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65     off_t divSize
f230: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d   = SHARED_SIZE -
f240: 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20   1;.        .   
f250: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
f260: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
f270: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
f280: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
f290: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
f2a0: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
f2b0: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f2c0: 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
f2d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
f2e0: 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
f2f0: 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29 7b   &lock)==(-1) ){
f300: 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
f310: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
f320: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f330: 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20  _IOERR_UNLOCK;. 
f340: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
f350: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
f360: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
f370: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f380: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
f390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
f3a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
f3b0: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
f3c0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
f3d0: 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
f3e0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
f3f0: 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
f400: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
f410: 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
f420: 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
f430: 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
f440: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f450: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f460: 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20 29  , &lock)==(-1) )
f470: 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
f480: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
f490: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
f4a0: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
f4b0: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
f4c0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
f4d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
f4e0: 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
f4f0: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
f500: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
f510: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
f520: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f530: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
f540: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
f550: 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  }.        lock.l
f560: 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b  _type = F_UNLCK;
f570: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f580: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f590: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f5a0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f5b0: 5f 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a  _FIRST+divSize;.
f5c0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f5d0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f5e0: 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  -divSize;.      
f5f0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f600: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f610: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
f620: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
f630: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  no;.          rc
f640: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
f650: 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
f660: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
f670: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
f680: 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
f690: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
f6a0: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
f6b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
f6c0: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
f6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
f6e0: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  se.#endif /* def
f6f0: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
f700: 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
f710: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
f720: 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  /.      {.      
f730: 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
f740: 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20  F_RDLCK;.       
f750: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f760: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f770: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
f780: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
f790: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c          lock.l_l
f7a0: 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45  en = SHARED_SIZE
f7b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
f7c0: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
f7d0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20 20  , &lock) ){.    
f7e0: 20 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f        /* In theo
f7f0: 72 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  ry, the call to 
f800: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63  unixFileLock() c
f810: 61 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75  annot fail becau
f820: 73 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20  se another.     
f830: 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20       ** process 
f840: 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e  is holding an in
f850: 63 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e  compatible lock.
f860: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69   If it does, thi
f870: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f880: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74  indicates that t
f890: 68 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  he other process
f8a0: 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
f8b0: 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20  g the locking.  
f8c0: 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f          ** proto
f8d0: 63 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70  col. If this hap
f8e0: 70 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  pens, return SQL
f8f0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
f900: 2e 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20  . Returning.    
f910: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
f920: 42 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75  BUSY would confu
f930: 73 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79  se the upper lay
f940: 65 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20  er (in practice 
f950: 69 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20  it causes .     
f960: 20 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72       ** an asser
f970: 74 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a  t to fail). */ .
f980: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
f990: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
f9a0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  CK;.          st
f9b0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
f9c0: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
f9d0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
f9e0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
f9f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
fa00: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
fa10: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
fa20: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
fa30: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
fa40: 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44 49  .l_start = PENDI
fa50: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  NG_BYTE;.    loc
fa60: 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61  k.l_len = 2L;  a
fa70: 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f 42  ssert( PENDING_B
fa80: 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f  YTE+1==RESERVED_
fa90: 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28 20  BYTE );.    if( 
faa0: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
fab0: 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30 20 29 7b  le, &lock)==0 ){
fac0: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  .      pInode->e
fad0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
fae0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73  D_LOCK;.    }els
faf0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
fb00: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
fb10: 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  K;.      storeLa
fb20: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
fb30: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 67 6f 74  rrno);.      got
fb40: 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
fb50: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65 46    }.  }.  if( eF
fb60: 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
fb70: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65   ){.    /* Decre
fb80: 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
fb90: 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
fba0: 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
fbb0: 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
fbc0: 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
fbd0: 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
fbe0: 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
fbf0: 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
fc00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
fc10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e  ..    */.    pIn
fc20: 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a  ode->nShared--;.
fc30: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
fc40: 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20  nShared==0 ){.  
fc50: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
fc60: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
fc70: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
fc80: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
fc90: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
fca0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
fcb0: 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46  .      if( unixF
fcc0: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
fcd0: 6c 6f 63 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lock)==0 ){.    
fce0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
fcf0: 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
fd00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
fd10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
fd20: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
fd30: 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
fd40: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
fd50: 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 49  rno);.        pI
fd60: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
fd70: 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  = NO_LOCK;.     
fd80: 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
fd90: 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
fda0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
fdb0: 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
fdc0: 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b  he count of lock
fdd0: 73 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73  s against this s
fde0: 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20  ame file.  When 
fdf0: 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74  the.    ** count
fe00: 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63   reaches zero, c
fe10: 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66  lose any other f
fe20: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
fe30: 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20  whose close.    
fe40: 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20  ** was deferred 
fe50: 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74  because of outst
fe60: 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20  anding locks..  
fe70: 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d    */.    pInode-
fe80: 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73  >nLock--;.    as
fe90: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
fea0: 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66  ock>=0 );.    if
feb0: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
fec0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 ){.      clos
fed0: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
fee0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65  e);.    }.  }..e
fef0: 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69  nd_unlock:.  uni
ff00: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
ff10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ff20: 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c  OK ) pFile->eFil
ff30: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
ff40: 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  k;.  return rc;.
ff50: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74  }../*.** Lower t
ff60: 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
ff70: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
ff80: 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
ff90: 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
ffa0: 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69  ck.** must be ei
ffb0: 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20  ther NO_LOCK or 
ffc0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a  SHARED_LOCK..**.
ffd0: 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
ffe0: 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
fff0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
10000 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
10010 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71  below.** the req
10020 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c  uested locking l
10030 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  evel, this routi
10040 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
10050 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
10060 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
10070 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
10080 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51  ileLock){.#if SQ
10090 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
100a0 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65  ZE>0.  assert( e
100b0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
100c0 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46  _LOCK || ((unixF
100d0 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63  ile *)id)->nFetc
100e0 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  hOut==0 );.#endi
100f0 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78  f.  return posix
10100 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
10110 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66  Lock, 0);.}..#if
10120 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
10130 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69  _SIZE>0.static i
10140 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75  nt unixMapfile(u
10150 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36  nixFile *pFd, i6
10160 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63  4 nByte);.static
10170 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66   void unixUnmapf
10180 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
10190 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  d);.#endif../*.*
101a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
101b0 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72  performs the par
101c0 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65  ts of the "close
101d0 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e   file" operation
101e0 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   .** common to a
101f0 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  ll locking schem
10200 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68  es. It closes th
10210 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20  e directory and 
10220 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c  file.** handles,
10230 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61 6c   if they are val
10240 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c  id, and sets all
10250 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75   fields of the u
10260 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63  nixFile.** struc
10270 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a  ture to 0..**.**
10280 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63   It is *not* nec
10290 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74  essary to hold t
102a0 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68  he mutex when th
102b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
102c0 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e  lled,.** even on
102d0 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74   VxWorks.  A mut
102e0 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69  ex will be acqui
102f0 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62  red on VxWorks b
10300 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73  y the.** vxworks
10310 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20  ReleaseFileId() 
10320 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74  routine..*/.stat
10330 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78  ic int closeUnix
10340 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  File(sqlite3_fil
10350 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
10360 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10370 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53  xFile*)id;.#if S
10380 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
10390 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61  IZE>0.  unixUnma
103a0 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65  pfile(pFile);.#e
103b0 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65  ndif.  if( pFile
103c0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f  ->h>=0 ){.    ro
103d0 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
103e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49  , pFile->h, __LI
103f0 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65  NE__);.    pFile
10400 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69  ->h = -1;.  }.#i
10410 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
10420 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b  f( pFile->pId ){
10430 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
10440 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
10450 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20  FILE_DELETE ){. 
10460 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46       osUnlink(pF
10470 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  ile->pId->zCanon
10480 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  icalName);.    }
10490 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65  .    vxworksRele
104a0 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d  aseFileId(pFile-
104b0 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65  >pId);.    pFile
104c0 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23  ->pId = 0;.  }.#
104d0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
104e0 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52  ITE_UNLINK_AFTER
104f0 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69  _CLOSE.  if( pFi
10500 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
10510 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20  UNIXFILE_DELETE 
10520 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  ){.    osUnlink(
10530 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
10540 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10550 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d  *(char**)&pFile-
10560 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
10570 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20  le->zPath = 0;. 
10580 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52   }.#endif.  OSTR
10590 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d  ACE(("CLOSE   %-
105a0 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29  3d\n", pFile->h)
105b0 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
105c0 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (-1);.  sqlite3_
105d0 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75  free(pFile->pUnu
105e0 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  sed);.  memset(p
105f0 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  File, 0, sizeof(
10600 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65  unixFile));.  re
10610 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10620 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
10630 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
10640 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73   int unixClose(s
10650 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
10660 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
10670 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
10680 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10690 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65  xFile *)id;.  ve
106a0 72 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65  rifyDbFile(pFile
106b0 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28  );.  unixUnlock(
106c0 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  id, NO_LOCK);.  
106d0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
106e0 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65  ;..  /* unixFile
106f0 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79  .pInode is alway
10700 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74  s valid here. Ot
10710 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65  herwise, a diffe
10720 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20  rent close.  ** 
10730 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f  routine (e.g. no
10740 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75  lockClose()) wou
10750 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  ld be called ins
10760 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  tead..  */.  ass
10770 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ert( pFile->pIno
10780 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70  de->nLock>0 || p
10790 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
107a0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
107b0 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46  .  if( ALWAYS(pF
107c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20  ile->pInode) && 
107d0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
107e0 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Lock ){.    /* I
107f0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
10800 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
10810 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
10820 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
10830 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65  st.    ** yet be
10840 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
10850 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
10860 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
10870 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a  d the file.    *
10880 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
10890 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
108a0 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62  list.  It will b
108b0 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
108c0 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77  closed .    ** w
108d0 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
108e0 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
108f0 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
10900 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
10910 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
10920 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
10930 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
10940 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
10950 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
10960 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
10980 66 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69  f the posix advi
10990 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  sory lock implem
109a0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
109b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
10a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
10a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70  ********** No-op
10a80 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
10a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
10ab0 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73  * Of the various
10ac0 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65   locking impleme
10ad0 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62  ntations availab
10ae0 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66  le, this is by f
10af0 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65  ar the.** simple
10b00 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20  st:  locking is 
10b10 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74  ignored.  No att
10b20 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
10b30 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
10b40 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65  e.** file for re
10b50 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
10b60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63  ..**.** This loc
10b70 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70  king mode is app
10b80 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65  ropriate for use
10b90 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61   on read-only da
10ba0 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20  tabases.** (ex: 
10bb0 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61  databases that a
10bc0 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43  re burned into C
10bd0 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70  D-ROM, for examp
10be0 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20  le.)  It can.** 
10bf0 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20  also be used if 
10c00 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20  the application 
10c10 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74  employs some ext
10c20 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20  ernal mechanism 
10c30 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69  to.** prevent si
10c40 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73  multaneous acces
10c50 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61  s of the same da
10c60 74 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72  tabase by two or
10c70 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73   more.** databas
10c80 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20  e connections.  
10c90 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73  But there is a s
10ca0 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64  erious risk of d
10cb0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
10cc0 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f  ption if this lo
10cd0 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73  cking mode is us
10ce0 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73  ed in situations
10cf0 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a   where multiple.
10d00 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ** database conn
10d10 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65  ections are acce
10d20 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
10d30 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
10d40 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65  the same.** time
10d50 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65   and one or more
10d60 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63   of those connec
10d70 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e  tions are writin
10d80 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  g..*/..static in
10d90 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73  t nolockCheckRes
10da0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
10db0 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
10dc0 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
10dd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10de0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a  ER(NotUsed);.  *
10df0 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72  pResOut = 0;.  r
10e00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10e10 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  .}.static int no
10e20 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33  lockLock(sqlite3
10e30 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
10e40 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20  int NotUsed2){. 
10e50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
10e60 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55  R2(NotUsed, NotU
10e70 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  sed2);.  return 
10e80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61  SQLITE_OK;.}.sta
10e90 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e  tic int nolockUn
10ea0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
10eb0 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  e *NotUsed, int 
10ec0 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55  NotUsed2){.  UNU
10ed0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e  SED_PARAMETER2(N
10ee0 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32  otUsed, NotUsed2
10ef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10f00 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
10f10 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a  Close the file..
10f20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f  */.static int no
10f30 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65  lockClose(sqlite
10f40 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20  3_file *id) {.  
10f50 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
10f60 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a  File(id);.}../**
10f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10f80 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d  * End of the no-
10f90 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  op lock implemen
10fa0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
10fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
10fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
11010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
11060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11070 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f  ******* Begin do
11080 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a  t-file Locking *
11090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
110a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
110b0 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20  .** The dotfile 
110c0 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
110d0 74 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20  tation uses the 
110e0 65 78 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70  existence of sep
110f0 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69  arate lock.** fi
11100 6c 65 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69  les (really a di
11110 72 65 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74  rectory) to cont
11120 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68  rol access to th
11130 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
11140 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75  s works.** on ju
11150 73 74 20 61 62 6f 75 74 20 65 76 65 72 79 20 66  st about every f
11160 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e  ilesystem imagin
11170 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65  able.  But there
11180 20 61 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77   are serious dow
11190 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  nsides:.**.**   
111a0 20 28 31 29 20 20 54 68 65 72 65 20 69 73 20 7a   (1)  There is z
111b0 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e  ero concurrency.
111c0 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65    A single reade
111d0 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68  r blocks all oth
111e0 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f  er.**         co
111f0 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72  nnections from r
11200 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
11210 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  g the database..
11220 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e  **.**    (2)  An
11230 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61   application cra
11240 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73  sh or power loss
11250 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65   can leave stale
11260 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20   lock files.**  
11270 20 20 20 20 20 20 20 73 69 74 74 69 6e 67 20 61         sitting a
11280 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20  round that need 
11290 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61  to be cleared ma
112a0 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65  nually..**.** Ne
112b0 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f  vertheless, a do
112c0 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72  tlock is an appr
112d0 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20  opriate locking 
112e0 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69 66 20  mode for use if 
112f0 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b  no.** other lock
11300 69 6e 67 20 73 74 72 61 74 65 67 79 20 69 73 20  ing strategy is 
11310 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
11320 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   Dotfile locking
11330 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69   works by creati
11340 6e 67 20 61 20 73 75 62 64 69 72 65 63 74 6f 72  ng a subdirector
11350 79 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  y in the same di
11360 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68  rectory as.** th
11370 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 77  e database and w
11380 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  ith the same nam
11390 65 20 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c  e but with a ".l
113a0 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61  ock" extension a
113b0 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69  dded..** The exi
113c0 73 74 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b  stence of a lock
113d0 20 64 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69   directory impli
113e0 65 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  es an EXCLUSIVE 
113f0 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72  lock.  All other
11400 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28  .** lock types (
11410 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
11420 2c 20 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d  , PENDING) are m
11430 61 70 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55  apped into EXCLU
11440 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  SIVE..*/../*.** 
11450 54 68 65 20 66 69 6c 65 20 73 75 66 66 69 78 20  The file suffix 
11460 61 64 64 65 64 20 74 6f 20 74 68 65 20 64 61 74  added to the dat
11470 61 20 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  a base filename 
11480 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61  in order to crea
11490 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64  te the.** lock d
114a0 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65  irectory..*/.#de
114b0 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
114c0 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
114d0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
114e0 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
114f0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
11500 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
11510 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
11520 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
11530 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
11540 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
11550 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
11560 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
11570 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
11580 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11590 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
115a0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
115b0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
115c0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
115d0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
115e0 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
115f0 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
11600 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11610 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
11620 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
11630 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
11640 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
11650 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
11660 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
11670 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
11680 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
11690 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
116a0 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
116b0 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
116c0 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
116d0 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
116e0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
116f0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
11700 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
11710 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
11720 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
11730 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
11740 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
11750 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
11760 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
11770 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
11780 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
11790 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
117a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
117b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
117c0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
117d0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
117e0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
117f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11800 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
11810 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
11820 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
11830 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
11840 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
11850 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
11860 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
11870 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
11880 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
11890 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
118a0 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
118b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
118c0 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
118d0 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
118e0 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
118f0 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
11900 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
11910 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
11920 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
11930 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
11940 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c  ed = osAccess(zL
11950 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a  ockFile, 0)==0;.
11960 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
11970 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
11980 25 64 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c  %d %d (dotlock)\
11990 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
119a0 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
119b0 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
119c0 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
119d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
119e0 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
119f0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
11a00 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
11a10 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
11a20 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
11a30 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
11a40 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
11a50 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
11a60 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
11a70 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
11a80 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
11a90 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
11aa0 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
11ab0 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
11ac0 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
11ad0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
11ae0 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
11af0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
11b00 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
11b10 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
11b20 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
11b30 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
11b40 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
11b50 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
11b60 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
11b70 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
11b80 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
11b90 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
11ba0 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
11bb0 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
11bc0 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
11bd0 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
11be0 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
11bf0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
11c00 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
11c10 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
11c20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
11c30 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
11c40 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
11c50 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
11c60 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
11c70 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
11c80 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
11c90 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11ca0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
11cb0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
11cc0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
11cd0 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
11ce0 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
11cf0 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68  evel..**.** With
11d00 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
11d10 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79  , we really only
11d20 20 73 75 70 70 6f 72 74 20 73 74 61 74 65 20 28   support state (
11d30 34 29 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  4): EXCLUSIVE..*
11d40 2a 20 42 75 74 20 77 65 20 74 72 61 63 6b 20 74  * But we track t
11d50 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67  he other locking
11d60 20 6c 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c   levels internal
11d70 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
11d80 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71  t dotlockLock(sq
11d90 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
11da0 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
11db0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11dc0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11dd0 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63  id;.  char *zLoc
11de0 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
11df0 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
11e00 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20  ntext;.  int rc 
11e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
11e20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 61   /* If we have a
11e30 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68  ny lock, then th
11e40 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65  e lock file alre
11e50 61 64 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c  ady exists.  All
11e60 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f   we have.  ** to
11e70 20 64 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75   do is adjust ou
11e80 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72  r internal recor
11e90 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65  d of the lock le
11ea0 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  vel..  */.  if( 
11eb0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11ec0 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20   > NO_LOCK ){.  
11ed0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11ee0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11ef0 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70      /* Always up
11f00 64 61 74 65 20 74 68 65 20 74 69 6d 65 73 74 61  date the timesta
11f10 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69  mp on the old fi
11f20 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56  le */.#ifdef HAV
11f30 45 5f 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d  E_UTIME.    utim
11f40 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c  e(zLockFile, NUL
11f50 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74  L);.#else.    ut
11f60 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  imes(zLockFile, 
11f70 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NULL);.#endif.  
11f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11f90 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
11fa0 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
11fb0 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d  e lock */.  rc =
11fc0 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69   osMkdir(zLockFi
11fd0 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28  le, 0777);.  if(
11fe0 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20   rc<0 ){.    /* 
11ff0 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63  failed to open/c
12000 72 65 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64  reate the lock d
12010 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20  irectory */.    
12020 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
12030 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49  no;.    if( EEXI
12040 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  ST == tErrno ){.
12050 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12060 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c  E_BUSY;.    } el
12070 73 65 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  se {.      rc = 
12080 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12090 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
120a0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  , SQLITE_IOERR_L
120b0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
120c0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
120d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
120e0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
120f0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
12100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65    }.    }.    re
12110 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20  turn rc;.  } .  
12120 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
12130 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
12140 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
12150 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12160 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
12170 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12180 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
12190 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
121a0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
121b0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
121c0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
121d0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
121e0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
121f0 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12200 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12210 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12220 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12230 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12240 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12250 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12260 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12270 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68   no-op..**.** Wh
12280 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  en the locking l
12290 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f  evel reaches NO_
122a0 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65  LOCK, delete the
122b0 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73   lock file..*/.s
122c0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
122d0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
122e0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
122f0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
12300 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
12310 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
12320 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
12330 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
12340 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
12350 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
12360 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
12370 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
12380 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
12390 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29  pid=%d (dotlock)
123a0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
123b0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
123c0 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
123d0 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
123e0 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
123f0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
12400 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
12410 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
12420 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
12430 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
12440 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
12450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12460 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64  ;.  }..  /* To d
12470 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72  owngrade to shar
12480 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74  ed, simply updat
12490 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e  e our internal n
124a0 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a  otion of the.  *
124b0 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e  * lock state.  N
124c0 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77  o need to mess w
124d0 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20  ith the file on 
124e0 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  disk..  */.  if(
124f0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
12500 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  ED_LOCK ){.    p
12510 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
12520 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
12530 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12540 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
12550 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b   To fully unlock
12560 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64   the database, d
12570 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
12580 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ile */.  assert(
12590 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c   eFileLock==NO_L
125a0 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73  OCK );.  rc = os
125b0 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 29  Rmdir(zLockFile)
125c0 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26 20  ;.  if( rc<0 && 
125d0 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52 20 29  errno==ENOTDIR )
125e0 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b 28 7a   rc = osUnlink(z
125f0 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
12600 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69 6e 74   rc<0 ){.    int
12610 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12620 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20  .    rc = 0;.   
12630 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d 20 74   if( ENOENT != t
12640 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
12650 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12660 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20  _UNLOCK;.    }. 
12670 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12680 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
12690 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
126a0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
126b0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
126c0 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
126d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
126e0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
126f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
12700 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
12710 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74  le.  Make sure t
12720 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e  he lock has been
12730 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72 65   released before
12740 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61   closing..*/.sta
12750 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43  tic int dotlockC
12760 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
12770 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72  e *id) {.  int r
12780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
12790 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75   if( id ){.    u
127a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
127b0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
127c0 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63      dotlockUnloc
127d0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
127e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
127f0 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  (pFile->lockingC
12800 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20  ontext);.    rc 
12810 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
12820 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
12830 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a  n rc;.}./*******
12840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
12850 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65 20  of the dot-file 
12860 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
12870 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ion ************
12880 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
12890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128d0 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
128e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
128f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12920 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
12930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12940 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20  *** Begin flock 
12950 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
12960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12970 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  ********.**.** U
12980 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20 73  se the flock() s
12990 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f  ystem call to do
129a0 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a   file locking..*
129b0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63  *.** flock() loc
129c0 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
129d0 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e  -file locking in
129e0 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f 75   that the variou
129f0 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20  s.** fine-grain 
12a00 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73  locking levels s
12a10 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c 69  upported by SQLi
12a20 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65 64  te are collapsed
12a30 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c   into.** a singl
12a40 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
12a50 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12a60 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45 52  s, SHARED, RESER
12a70 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44  VED, and.** PEND
12a80 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74 68  ING locks are th
12a90 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73 20  e same thing as 
12aa0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12ab0 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74  k.  SQLite.** st
12ac0 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20 79  ill works when y
12ad0 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74 20  ou do this, but 
12ae0 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20 72  concurrency is r
12af0 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20  educed since.** 
12b00 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  only a single pr
12b10 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65 61  ocess can be rea
12b20 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
12b30 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a  e at a time..**.
12b40 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65 63  ** Omit this sec
12b50 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f 45  tion if SQLITE_E
12b60 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12b70 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f 66  YLE is turned of
12b80 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  f.*/.#if SQLITE_
12b90 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
12ba0 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  TYLE../*.** Retr
12bb0 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
12bc0 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
12bd0 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
12be0 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
12bf0 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
12c00 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
12c10 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
12c20 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
12c30 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
12c40 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
12c50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12c60 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
12c70 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
12c80 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
12c90 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
12ca0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
12cb0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
12cc0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
12cd0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
12ce0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
12cf0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
12d00 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
12d10 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
12d20 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
12d30 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
12d40 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
12d50 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
12d60 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
12d70 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
12d80 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
12d90 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
12da0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
12db0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
12dc0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
12dd0 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
12de0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
12df0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12e00 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
12e10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
12e20 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
12e30 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
12e40 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
12e50 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
12e60 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
12e70 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12e80 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
12e90 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
12ea0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
12eb0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
12ec0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
12ed0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
12ee0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
12ef0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
12f00 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
12f10 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
12f20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
12f30 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
12f40 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
12f50 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
12f60 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
12f70 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
12f80 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
12f90 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
12fa0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
12fb0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
12fc0 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
12fd0 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
12fe0 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
12ff0 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
13000 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
13010 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
13020 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
13030 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
13040 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
13050 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
13060 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
13070 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
13080 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20   error */.      
13090 20 20 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49    lrc = SQLITE_I
130a0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 20 20  OERR_UNLOCK; .  
130b0 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
130c0 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
130d0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
130e0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
130f0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
13100 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20     rc = lrc;.   
13110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13120 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
13130 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
13140 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 73 65  rrno;.      rese
13150 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
13160 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20  /* someone else 
13170 6d 69 67 68 74 20 68 61 76 65 20 69 74 20 72 65  might have it re
13180 73 65 72 76 65 64 20 2a 2f 0a 20 20 20 20 20 20  served */.      
13190 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f  lrc = sqliteErro
131a0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
131b0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
131c0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20  OERR_LOCK); .   
131d0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
131e0 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
131f0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
13200 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
13210 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  o);.        rc =
13220 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   lrc;.      }.  
13230 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
13240 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
13250 20 25 64 20 25 64 20 25 64 20 28 66 6c 6f 63 6b   %d %d %d (flock
13260 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
13270 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
13280 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
13290 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
132a0 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
132b0 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
132c0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
132d0 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
132e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 65 73  LITE_OK;.    res
132f0 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e  erved=1;.  }.#en
13300 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
13310 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
13320 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a 70 52 65  ERRORS */.  *pRe
13330 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
13340 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13350 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
13360 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
13370 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
13380 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c  parameter eFileL
13390 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20  ock - one.** of 
133a0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
133b0 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41  *.**     (1) SHA
133c0 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  RED_LOCK.**     
133d0 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  (2) RESERVED_LOC
133e0 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e  K.**     (3) PEN
133f0 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  DING_LOCK.**    
13400 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c   (4) EXCLUSIVE_L
13410 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69  OCK.**.** Someti
13420 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74  mes when request
13430 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61  ing one lock sta
13440 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c  te, additional l
13450 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72  ock states.** ar
13460 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65  e inserted in be
13470 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b  tween.  The lock
13480 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f  ing might fail o
13490 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74  n one of the lat
134a0 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  er.** transition
134b0 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f  s leaving the lo
134c0 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65  ck state differe
134d0 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20  nt from what it 
134e0 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73  started but.** s
134f0 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74  till short of it
13500 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c  s goal.  The fol
13510 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f  lowing chart sho
13520 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a  ws the allowed.*
13530 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e  * transitions an
13540 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69  d the inserted i
13550 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
13560 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c  es:.**.**    UNL
13570 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a  OCKED -> SHARED.
13580 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
13590 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53  RESERVED.**    S
135a0 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  HARED -> (PENDIN
135b0 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
135c0 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d  **    RESERVED -
135d0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
135e0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50  XCLUSIVE.**    P
135f0 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53  ENDING -> EXCLUS
13600 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28  IVE.**.** flock(
13610 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75  ) only really su
13620 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20  pport EXCLUSIVE 
13630 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b  locks.  We track
13640 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a   intermediate.**
13650 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20   lock states in 
13660 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
13670 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74 20   structure, but 
13680 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44  all locks SHARED
13690 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65   or.** above are
136a0 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56   really EXCLUSIV
136b0 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c  E locks and excl
136c0 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72  ude all other pr
136d0 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
136e0 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e  access the file.
136f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13700 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
13710 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
13720 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
13730 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
13740 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
13750 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
13760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13770 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
13780 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
13790 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20  leLock) {.  int 
137a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
137b0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
137c0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
137d0 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  d;..  assert( pF
137e0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 69 66 20  ile );..  /* if 
137f0 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
13800 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
13810 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
13820 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
13830 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
13840 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
13850 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
13860 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
13870 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13880 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
13890 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
138a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
138b0 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
138c0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
138d0 20 0a 20 20 69 66 20 28 72 6f 62 75 73 74 5f 66   .  if (robust_f
138e0 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
138f0 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42  OCK_EX | LOCK_NB
13900 29 29 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72  )) {.    int tEr
13910 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
13920 20 2f 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20   /* didn't get, 
13930 6d 75 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a  must be busy */.
13940 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
13950 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
13960 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
13970 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
13980 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
13990 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
139a0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
139b0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
139c0 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20  .    }.  } else 
139d0 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20 69 74 2c  {.    /* got it,
139e0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
139f0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
13a00 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
13a10 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
13a20 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
13a30 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
13a40 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  s (flock)\n", pF
13a50 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f  ile->h, azFileLo
13a60 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a  ck(eFileLock), .
13a70 20 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53             rc==S
13a80 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
13a90 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 23 69  : "failed"));.#i
13aa0 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
13ab0 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
13ac0 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
13ad0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
13ae0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  = SQLITE_IOERR )
13af0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
13b00 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64  E_BUSY;.  }.#end
13b10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13b20 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13b30 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65 74 75 72  RRORS */.  retur
13b40 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
13b50 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13b60 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13b70 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13b80 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13b90 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13ba0 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13bb0 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13bc0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13bd0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13be0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
13bf0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
13c00 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
13c10 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
13c20 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
13c30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
13c40 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13c50 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28  int flockUnlock(
13c60 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
13c70 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
13c80 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
13c90 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
13ca0 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73 73 65 72  *)id;.  .  asser
13cb0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
13cc0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
13cd0 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
13ce0 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20  =%d (flock)\n", 
13cf0 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c  pFile->h, eFileL
13d00 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ock,.           
13d10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13d20 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b  , osGetpid(0)));
13d30 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
13d40 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
13d50 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
13d60 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
13d70 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
13d80 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
13d90 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
13da0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13db0 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
13dc0 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
13dd0 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
13de0 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
13df0 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
13e00 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
13e10 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
13e20 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
13e30 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
13e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13e50 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
13e60 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
13e70 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
13e80 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
13e90 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
13ea0 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
13eb0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13ec0 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
13ed0 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
13ee0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
13ef0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
13f00 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
13f10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
13f20 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
13f30 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
13f40 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
13f50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f60 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
13f70 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
13f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
13f90 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
13fa0 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
13fb0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13fc0 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
13fd0 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
13fe0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
13ff0 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
14000 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
14010 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
14020 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
14030 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
14040 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20  E && !OS_VXWORK 
14050 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
14060 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
14070 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69  the flock lock i
14080 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140f0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14140 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
14160 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68  gin Named Semaph
14170 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ore Locking ****
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14190 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64  ****.**.** Named
141a0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
141b0 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f  ng is only suppo
141c0 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  rted on VxWorks.
141d0 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
141e0 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
141f0 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c   dot-lock and fl
14200 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72  ock in that it r
14210 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75  eally only.** su
14220 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45  pports EXCLUSIVE
14230 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20   locking.  Only 
14240 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
14250 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69   can read or wri
14260 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  te.** the databa
14270 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d  se file at a tim
14280 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  e.  This reduces
14290 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75   potential concu
142a0 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d  rrency, but.** m
142b0 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d  akes the lock im
142c0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63  plementation muc
142d0 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66  h easier..*/.#if
142e0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a   OS_VXWORKS../*.
142f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14300 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
14310 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
14320 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
14330 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
14340 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
14350 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
14360 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
14370 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
14380 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
14390 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
143a0 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
143b0 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
143c0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
143d0 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
143e0 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
143f0 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
14400 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
14410 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
14420 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63 6b 52  c int semXCheckR
14430 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
14440 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14450 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20  t *pResOut) {.  
14460 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14470 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
14480 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
14490 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
144a0 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
144b0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
144c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
144d0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
144e0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
144f0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a  sert( pFile );..
14500 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
14510 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
14520 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
14530 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
14540 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
14550 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
14560 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
14570 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
14580 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
14590 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
145a0 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f  ess holds it. */
145b0 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64  .  if( !reserved
145c0 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70   ){.    sem_t *p
145d0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
145e0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20  ode->pSem;..    
145f0 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28  if( sem_trywait(
14600 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20  pSem)==-1 ){.   
14610 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
14620 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28  errno;.      if(
14630 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e   EAGAIN != tErrn
14640 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  o ){.        rc 
14650 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
14660 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
14670 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
14680 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
14690 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f  CK);.        sto
146a0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
146b0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
146c0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
146d0 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
146e0 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20  se has the lock 
146f0 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e  when we are in N
14700 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20  O_LOCK */.      
14710 20 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46    reserved = (pF
14720 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c  ile->eFileLock <
14730 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
14740 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
14750 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f  {.      /* we co
14760 75 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77  uld have it if w
14770 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20  e want it */.   
14780 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d     sem_post(pSem
14790 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
147a0 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
147b0 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
147c0 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  sem)\n", pFile->
147d0 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
147e0 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
147f0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
14800 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
14810 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
14820 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
14830 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
14840 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
14850 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
14860 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
14870 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
14880 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
14890 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
148a0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
148b0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
148c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
148d0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
148e0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
148f0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
14900 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
14910 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
14920 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
14930 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
14940 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
14950 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
14960 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
14970 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
14980 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
14990 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
149a0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
149b0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
149c0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
149d0 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
149e0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
149f0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
14a00 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
14a10 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
14a20 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
14a30 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
14a40 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
14a50 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
14a60 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
14a70 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
14a80 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
14a90 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
14aa0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
14ab0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14ac0 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f  .** Semaphore lo
14ad0 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20  cks only really 
14ae0 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56  support EXCLUSIV
14af0 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61  E locks.  We tra
14b00 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a  ck intermediate.
14b10 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69  ** lock states i
14b20 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  n the sqlite3_fi
14b30 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75  le structure, bu
14b40 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52  t all locks SHAR
14b50 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61  ED or.** above a
14b60 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53  re really EXCLUS
14b70 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78  IVE locks and ex
14b80 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20  clude all other 
14b90 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a  processes from.*
14ba0 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  * access the fil
14bb0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
14bc0 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
14bd0 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
14be0 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65    Use the sqlite
14bf0 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72  3OsUnlock().** r
14c00 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20  outine to lower 
14c10 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e  a locking level.
14c20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
14c30 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  emXLock(sqlite3_
14c40 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
14c50 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
14c60 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14c70 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14c80 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
14c90 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
14ca0 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  m;.  int rc = SQ
14cb0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69  LITE_OK;..  /* i
14cc0 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
14cd0 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20  e a lock, it is 
14ce0 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a  exclusive.  .  *
14cf0 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65  * Just adjust le
14d00 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20  vel and punt on 
14d10 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20  outta here. */. 
14d20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c   if (pFile->eFil
14d30 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29  eLock > NO_LOCK)
14d40 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
14d50 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14d60 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ock;.    rc = SQ
14d70 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
14d80 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
14d90 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b    }.  .  /* lock
14da0 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62   semaphore now b
14db0 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e  ut bail out when
14dc0 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e   already locked.
14dd0 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72   */.  if( sem_tr
14de0 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20  ywait(pSem)==-1 
14df0 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14e00 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
14e10 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o sem_end_lock;.
14e20 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74    }..  /* got it
14e30 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61  , set the type a
14e40 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a  nd return ok */.
14e50 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
14e60 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
14e70 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a  . sem_end_lock:.
14e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
14e90 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
14ea0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
14eb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
14ec0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
14ed0 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
14ee0 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ** must be eithe
14ef0 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41  r NO_LOCK or SHA
14f00 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20  RED_LOCK..**.** 
14f10 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
14f20 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14f30 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14f40 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14f50 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  ow.** the reques
14f60 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ted locking leve
14f70 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  l, this routine 
14f80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
14f90 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 55 6e  tatic int semXUn
14fa0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
14fb0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
14fc0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
14fd0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
14fe0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
14ff0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
15000 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
15010 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
15020 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
15030 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
15040 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
15050 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
15060 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
15070 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
15080 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
15090 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
150a0 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
150b0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
150c0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
150d0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
150e0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
150f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15100 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
15110 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15120 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
15130 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74   shared can just
15140 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20   be set because 
15150 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61  we always have a
15160 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20  n exclusive */. 
15170 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if (eFileLock==
15180 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20  SHARED_LOCK) {. 
15190 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
151a0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
151b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
151c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
151d0 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20 75 6e  /* no, really un
151e0 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20 28 20  lock. */.  if ( 
151f0 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3d 3d  sem_post(pSem)==
15200 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
15210 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  c, tErrno = errn
15220 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  o;.    rc = sqli
15230 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
15240 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
15250 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
15260 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
15270 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
15280 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
15290 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
152a0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rno);.    }.    
152b0 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a  return rc; .  }.
152c0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
152d0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
152e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
152f0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73  ;.}../*. ** Clos
15300 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74  e a file.. */.st
15310 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43 6c 6f  atic int semXClo
15320 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
15330 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64 20  *id) {.  if( id 
15340 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
15350 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15360 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d 58  le*)id;.    semX
15370 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
15380 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
15390 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
153a0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
153b0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
153c0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
153d0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
153e0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69 78  );.    closeUnix
153f0 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20  File(id);.  }.  
15400 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15410 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  ;.}..#endif /* O
15420 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a  S_VXWORKS */./*.
15430 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  ** Named semapho
15440 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e  re locking is on
15450 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ly available on 
15460 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a  VxWorks..**.****
15470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
15480 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  of the named sem
15490 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70 6c  aphore lock impl
154a0 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
154b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
154c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
154f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a  **********/.../*
15510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
15560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15570 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
15580 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  AFP Locking ****
15590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
155a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
155b0 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20 41  .** AFP is the A
155c0 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f 74  pple Filing Prot
155d0 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61 20  ocol.  AFP is a 
155e0 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73 74  network filesyst
155f0 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41  em found.** on A
15600 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20 63  pple Macintosh c
15610 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68 20  omputers - both 
15620 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a  OS9 and OSX..**.
15630 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20 69  ** Third-party i
15640 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 6f  mplementations o
15650 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c 61  f AFP are availa
15660 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20 63  ble.  But this c
15670 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79  ode here.** only
15680 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a   works on OSX..*
15690 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
156a0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
156b0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
156c0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54  NG_STYLE./*.** T
156d0 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  he afpLockingCon
156e0 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20 63  text structure c
156f0 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70 20  ontains all afp 
15700 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73 74  lock specific st
15710 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ate.*/.typedef s
15720 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67  truct afpLocking
15730 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b 69  Context afpLocki
15740 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63  ngContext;.struc
15750 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
15760 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73 65  ext {.  int rese
15770 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  rved;.  const ch
15780 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20  ar *dbPath;     
15790 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
157a0 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65  of the open file
157b0 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 42   */.};..struct B
157c0 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 0a  yteRangeLockPB2.
157d0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  {.  unsigned lon
157e0 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20 20  g long offset;  
157f0 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20        /* offset 
15800 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74 6f  to first byte to
15810 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
15820 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65  ned long long le
15830 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a 20  ngth;        /* 
15840 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  nbr of bytes to 
15850 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
15860 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65 74  ed long long ret
15870 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20 6e  RangeStart; /* n
15880 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20 6c  br of 1st byte l
15890 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73 73  ocked if success
158a0 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ful */.  unsigne
158b0 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c 61  d char unLockFla
158c0 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20  g;         /* 1 
158d0 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f  = unlock, 0 = lo
158e0 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ck */.  unsigned
158f0 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46 6c   char startEndFl
15900 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d 72  ag;       /* 1=r
15910 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f 72  el to end of for
15920 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61 72  k, 0=rel to star
15930 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20  t */.  int fd;  
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15950 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
15960 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20 74   desc to assoc t
15970 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a 2f  his lock with */
15980 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66 70  .};..#define afp
15990 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
159a0 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49 4f  FSCTL        _IO
159b0 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75  WR('z', 23, stru
159c0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
159d0 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  PB2)../*.** This
159e0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 6f   is a utility fo
159f0 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c 65  r setting or cle
15a00 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e 67  aring a bit-rang
15a10 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20  e lock on an.** 
15a20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e 0a  AFP filesystem..
15a30 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  ** .** Return SQ
15a40 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
15a50 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 20  ss, SQLITE_BUSY 
15a60 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
15a70 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65 74  tatic int afpSet
15a80 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68  Lock(.  const ch
15a90 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20 20  ar *path,       
15aa0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
15ab0 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
15ac0 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f 63   locked or unloc
15ad0 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ked */.  unixFil
15ae0 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
15af0 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
15b00 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
15b10 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e 73  on path */.  uns
15b20 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
15b30 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20 46  offset,     /* F
15b40 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65 20  irst byte to be 
15b50 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73 69  locked */.  unsi
15b60 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
15b70 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e 75  ength,     /* Nu
15b80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
15b90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 73   lock */.  int s
15ba0 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20 20  etLockFlag      
15bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15bc0 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20 20  e to set lock.  
15bd0 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20 6c  False to clear l
15be0 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
15bf0 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  ct ByteRangeLock
15c00 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65 72  PB2 pb;.  int er
15c10 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f 63  r;.  .  pb.unLoc
15c20 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b 46  kFlag = setLockF
15c30 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20 70  lag ? 0 : 1;.  p
15c40 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20 3d  b.startEndFlag =
15c50 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74 20   0;.  pb.offset 
15c60 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e 6c  = offset;.  pb.l
15c70 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b 20  ength = length; 
15c80 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c 65  .  pb.fd = pFile
15c90 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41 43  ->h;.  .  OSTRAC
15ca0 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 5b  E(("AFPSETLOCK [
15cb0 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e 20  %s] for %d%s in 
15cc0 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c  range %llx:%llx\
15cd0 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f 63  n", .    (setLoc
15ce0 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46 22  kFlag?"ON":"OFF"
15cf0 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70 62  ), pFile->h, (pb
15d00 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76 61  .fd==-1?"[testva
15d10 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20 6f  l-1]":""),.    o
15d20 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29 3b  ffset, length));
15d30 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28 70  .  err = fsctl(p
15d40 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52 61  ath, afpfsByteRa
15d50 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20 26  ngeLock2FSCTL, &
15d60 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20 65  pb, 0);.  if ( e
15d70 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  rr==-1 ) {.    i
15d80 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 74  nt rc;.    int t
15d90 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
15da0 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50     OSTRACE(("AFP
15db0 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20 74  SETLOCK failed t
15dc0 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20 25  o fsctl() '%s' %
15dd0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
15de0 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72 72        path, tErr
15df0 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45 72  no, strerror(tEr
15e00 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20 53  rno)));.#ifdef S
15e10 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
15e20 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
15e30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
15e40 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20  Y;.#else.    rc 
15e50 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
15e60 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
15e70 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  no,.            
15e80 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b 46          setLockF
15e90 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f 45  lag ? SQLITE_IOE
15ea0 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54 45  RR_LOCK : SQLITE
15eb0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
15ec0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
15ed0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
15ee0 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 69  _ERRORS */.    i
15ef0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15f00 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74  (rc) ){.      st
15f10 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
15f20 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
15f30 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
15f40 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
15f50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15f60 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
15f70 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
15f80 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
15f90 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
15fa0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
15fb0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
15fc0 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
15fd0 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
15fe0 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
15ff0 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
16000 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
16010 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
16020 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
16030 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
16040 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
16050 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
16060 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
16070 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
16080 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
16090 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
160a0 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  nt afpCheckReser
160b0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
160c0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
160d0 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
160e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
160f0 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
16100 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
16110 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16120 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  *)id;.  afpLocki
16130 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
16140 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74  xt;.  .  Simulat
16150 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
16160 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
16170 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
16180 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
16190 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e 74   pFile );.  cont
161a0 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e  ext = (afpLockin
161b0 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c  gContext *) pFil
161c0 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
161d0 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78 74  t;.  if( context
161e0 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20  ->reserved ){.  
161f0 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b 0a    *pResOut = 1;.
16200 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16210 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
16220 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
16230 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
16240 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
16250 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
16260 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b  */.  .  /* Check
16270 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
16280 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
16290 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
162a0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  /.  if( pFile->p
162b0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
162c0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
162d0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
162e0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74  ;.  }.  .  /* Ot
162f0 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73  herwise see if s
16300 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
16310 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20 2a  s holds it..   *
16320 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
16330 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b  d ){.    /* lock
16340 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62 79   the RESERVED by
16350 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c 72  te */.    int lr
16360 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
16370 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
16380 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
16390 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20 20  BYTE, 1,1);  .  
163a0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
163b0 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  =lrc ){.      /*
163c0 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65 64   if we succeeded
163d0 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20 72   in taking the r
163e0 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75 6e  eserved lock, un
163f0 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74 6f  lock it to resto
16400 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  re.      ** the 
16410 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20 2a  original state *
16420 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61 66  /.      lrc = af
16430 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
16440 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
16450 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
16460 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c 73  1, 0);.    } els
16470 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20  e {.      /* if 
16480 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65 74  we failed to get
16490 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20 73   the lock then s
164a0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73 74  omeone else must
164b0 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20 20   have it */.    
164c0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
164d0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49 53      }.    if( IS
164e0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
164f0 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72 63   ){.      rc=lrc
16500 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
16510 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
16520 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
16530 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
16540 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d %d (afp)\n", p
16550 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
16560 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a 70  erved));.  .  *p
16570 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
16580 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
16590 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
165a0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
165b0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
165c0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
165d0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
165e0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
165f0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
16600 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
16610 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
16620 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
16630 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
16640 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
16650 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
16660 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
16670 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
16680 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
16690 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
166a0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
166b0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
166c0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
166d0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
166e0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
166f0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
16700 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
16710 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
16720 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
16730 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
16740 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
16750 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
16760 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
16770 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
16780 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
16790 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
167a0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
167b0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
167c0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
167d0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
167e0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
167f0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
16800 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
16810 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16820 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16830 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
16840 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
16850 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16860 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16870 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16880 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
16890 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
168a0 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
168b0 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
168c0 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74 65  t afpLock(sqlite
168d0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
168e0 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e  eFileLock){.  in
168f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16900 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
16910 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
16920 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  )id;.  unixInode
16930 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
16940 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
16950 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16960 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66  t *context = (af
16970 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
16980 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  *) pFile->lockin
16990 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61  gContext;.  .  a
169a0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
169b0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
169c0 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
169d0 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
169e0 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  afp)\n", pFile->
169f0 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  h,.           az
16a00 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
16a10 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ck), azFileLock(
16a20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16a30 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a  ),.           az
16a40 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d  FileLock(pInode-
16a50 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e  >eFileLock), pIn
16a60 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 6f  ode->nShared , o
16a70 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20  sGetpid(0)));.. 
16a80 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
16a90 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f  already a lock o
16aa0 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d  f this type or m
16ab0 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65 20  ore restrictive 
16ac0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78  on the.  ** unix
16ad0 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
16ae0 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
16af0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  afp_end_lock: ex
16b00 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
16b10 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
16b20 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61  ) hasn't been ca
16b30 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20  lled yet..  */. 
16b40 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
16b50 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b  eLock>=eFileLock
16b60 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28   ){.    OSTRACE(
16b70 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
16b80 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64  ok (already held
16b90 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  ) (afp)\n", pFil
16ba0 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
16bb0 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
16bc0 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65  eLock)));.    re
16bd0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16be0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
16bf0 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ure the locking 
16c00 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72  sequence is corr
16c10 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ect.  **  (1) We
16c20 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
16c30 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
16c40 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
16c50 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
16c60 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
16c70 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
16c80 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
16c90 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
16ca0 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
16cb0 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
16cc0 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
16cd0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
16ce0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
16cf0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16d00 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
16d10 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
16d20 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
16d30 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
16d40 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
16d50 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
16d60 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
16d70 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
16d80 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
16d90 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73   );.  .  /* This
16da0 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64 65 64   mutex is needed
16db0 20 62 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   because pFile->
16dc0 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
16dd0 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a   across threads.
16de0 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72    */.  unixEnter
16df0 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
16e00 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
16e10 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65  e;..  /* If some
16e20 20 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68   thread using th
16e30 69 73 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63  is PID has a loc
16e40 6b 20 76 69 61 20 61 20 64 69 66 66 65 72 65 6e  k via a differen
16e50 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a  t unixFile*.  **
16e60 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65   handle that pre
16e70 63 6c 75 64 65 73 20 74 68 65 20 72 65 71 75 65  cludes the reque
16e80 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72  sted lock, retur
16e90 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69  n BUSY..  */.  i
16ea0 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65  f( (pFile->eFile
16eb0 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46  Lock!=pInode->eF
16ec0 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20  ileLock && .    
16ed0 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
16ee0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
16ef0 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
16f00 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20  >SHARED_LOCK)). 
16f10 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20      ){.    rc = 
16f20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16f30 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
16f40 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  ck;.  }.  .  /* 
16f50 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  If a SHARED lock
16f60 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 61   is requested, a
16f70 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  nd some thread u
16f80 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c  sing this PID al
16f90 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61  ready.  ** has a
16fa0 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45 52   SHARED or RESER
16fb0 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69  VED lock, then i
16fc0 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e  ncrement referen
16fd0 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20  ce counts and.  
16fe0 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ** return SQLITE
16ff0 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  _OK..  */.  if( 
17000 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
17010 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20  D_LOCK && .     
17020 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
17030 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
17040 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  || pInode->eFile
17050 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
17060 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65  OCK) ){.    asse
17070 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
17080 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
17090 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
170a0 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
170b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
170c0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29  ode->nShared>0 )
170d0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  ;.    pFile->eFi
170e0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
170f0 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
17100 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20  ->nShared++;.   
17110 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
17120 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
17130 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20  nd_lock;.  }.   
17140 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47   .  /* A PENDING
17150 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20   lock is needed 
17160 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
17170 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61   a SHARED lock a
17180 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61  nd before.  ** a
17190 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c  cquiring an EXCL
171a0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72  USIVE lock.  For
171b0 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b   the SHARED lock
171c0 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69  , the PENDING wi
171d0 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61  ll.  ** be relea
171e0 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  sed..  */.  if( 
171f0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
17200 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c  D_LOCK .      ||
17210 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43   (eFileLock==EXC
17220 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
17230 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c  File->eFileLock<
17240 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20  PENDING_LOCK).  
17250 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65  ){.    int faile
17260 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20  d;.    failed = 
17270 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
17280 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
17290 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  e, PENDING_BYTE,
172a0 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28   1, 1);.    if (
172b0 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20  failed) {.      
172c0 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
172d0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
172e0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
172f0 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72    .  /* If contr
17300 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73 20  ol gets to this 
17310 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75  point, then actu
17320 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e  ally go ahead an
17330 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72  d make.  ** oper
17340 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c  ating system cal
17350 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ls for the speci
17360 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a  fied lock..  */.
17370 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
17380 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  =SHARED_LOCK ){.
17390 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72      int lrc1, lr
173a0 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20  c2, lrc1Errno = 
173b0 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20  0;.    long lk, 
173c0 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61  mask;.    .    a
173d0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
173e0 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20  Shared==0 );.   
173f0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
17400 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b  >eFileLock==0 );
17410 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61  .        .    ma
17420 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e  sk = (sizeof(lon
17430 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54  g)==8) ? LARGEST
17440 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66  _INT64 : 0x7ffff
17450 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  fff;.    /* Now 
17460 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
17470 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  k SHARED_LOCK */
17480 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61  .    /* note tha
17490 74 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66  t the quality of
174a0 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
174b0 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74  doesn't matter t
174c0 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20  hat much */.    
174d0 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a  lk = random(); .
174e0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
174f0 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d  edByte = (lk & m
17500 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a  ask)%(SHARED_SIZ
17510 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31  E - 1);.    lrc1
17520 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17530 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17540 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20  File, .         
17550 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
17560 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
17570 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  , 1, 1);.    if(
17580 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
17590 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72  rc1) ){.      lr
175a0 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d  c1Errno = pFile-
175b0 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20  >lastErrno;.    
175c0 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
175d0 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
175e0 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
175f0 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  lrc2 = afpSetLoc
17600 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
17610 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e  h, pFile, PENDIN
17620 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  G_BYTE, 1, 0);. 
17630 20 20 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c     .    if( IS_L
17640 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
17650 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  ) {.      storeL
17660 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
17670 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20  lrc1Errno);.    
17680 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20    rc = lrc1;.   
17690 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
176a0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
176b0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
176c0 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20  OR(lrc2) ){.    
176d0 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20    rc = lrc2;.   
176e0 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
176f0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  lock;.    } else
17700 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c   if( lrc1 != SQL
17710 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20  ITE_OK ) {.     
17720 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20   rc = lrc1;.    
17730 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70  } else {.      p
17740 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17750 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
17760 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f       pInode->nLo
17770 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f  ck++;.      pIno
17780 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b  de->nShared = 1;
17790 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
177a0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
177b0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
177c0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
177d0 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  1 ){.    /* We a
177e0 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e  re trying for an
177f0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
17800 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  but another thre
17810 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20  ad in this.     
17820 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
17830 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
17840 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
17850 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
17860 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
17870 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
17880 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
17890 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
178a0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
178b0 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
178c0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
178d0 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
178e0 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
178f0 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
17900 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
17910 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20  nt failed = 0;. 
17920 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
17930 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
17940 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c  ;.    if (eFileL
17950 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f  ock >= RESERVED_
17960 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65  LOCK && pFile->e
17970 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52  FileLock < RESER
17980 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  VED_LOCK) {.    
17990 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61      /* Acquire a
179a0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
179b0 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
179c0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
179d0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
179e0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
179f0 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20  YTE, 1,1);.     
17a00 20 69 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a   if( !failed ){.
17a10 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d          context-
17a20 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20  >reserved = 1;. 
17a30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17a40 20 69 66 20 28 21 66 61 69 6c 65 64 20 26 26 20   if (!failed && 
17a50 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43  eFileLock == EXC
17a60 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20  LUSIVE_LOCK) {. 
17a70 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20       /* Acquire 
17a80 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
17a90 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20  k */.        .  
17aa0 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
17ab0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65  e shared lock be
17ac0 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68 65 20  fore trying the 
17ad0 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65  range.  we'll ne
17ae0 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20  ed to .      ** 
17af0 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20  reestablish the 
17b00 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77  shared lock if w
17b10 65 20 63 61 6e 27 74 20 67 65 74 20 74 68 65 20  e can't get the 
17b20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20   afpUnlock.     
17b30 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28   */.      if( !(
17b40 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c  failed = afpSetL
17b50 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
17b60 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52  ath, pFile, SHAR
17b70 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20  ED_FIRST +.     
17b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b90 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72      pInode->shar
17ba0 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29  edByte, 1, 0)) )
17bb0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 61  {.        int fa
17bc0 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f  iled2 = SQLITE_O
17bd0 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f  K;.        /* no
17be0 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65  w attemmpt to ge
17bf0 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20  t the exclusive 
17c00 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20  lock range */.  
17c10 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
17c20 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
17c30 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
17c40 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20  , SHARED_FIRST, 
17c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c70 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b  SHARED_SIZE, 1);
17c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 66 61 69  .        if( fai
17c90 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64 32 20  led && (failed2 
17ca0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
17cb0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
17cc0 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ile, .          
17cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41               SHA
17ce0 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f  RED_FIRST + pIno
17cf0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
17d00 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20  1, 1)) ){.      
17d10 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65      /* Can't ree
17d20 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
17d30 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74  red lock.  Sqlit
17d40 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68  e can't deal, th
17d50 69 73 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  is is.          
17d60 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f  ** a critical I/
17d70 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20  O error.        
17d80 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72    */.          r
17d90 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53  c = ((failed & S
17da0 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
17db0 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20  SQLITE_IOERR) ? 
17dc0 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20  failed2 : .     
17dd0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17de0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
17df0 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f         goto afp_
17e00 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  end_lock;.      
17e10 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65    } .      }else
17e20 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  {.        rc = f
17e30 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a  ailed; .      }.
17e40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61      }.    if( fa
17e50 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
17e60 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d   = failed;.    }
17e70 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63  .  }.  .  if( rc
17e80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17e90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17ea0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
17eb0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
17ec0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
17ed0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
17ee0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
17ef0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
17f00 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
17f10 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
17f20 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
17f30 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
17f40 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61  G_LOCK;.  }.  .a
17f50 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  fp_end_lock:.  u
17f60 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
17f70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
17f80 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 61  K    %d %s %s (a
17f90 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
17fa0 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
17fb0 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
17fc0 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b     rc==SQLITE_OK
17fd0 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65   ? "ok" : "faile
17fe0 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  d"));.  return r
17ff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
18000 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
18010 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
18020 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
18030 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
18040 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
18050 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18060 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18070 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
18080 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
18090 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
180a0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
180b0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
180c0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
180d0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
180e0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
180f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18100 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  afpUnlock(sqlite
18110 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
18120 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
18130 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18140 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
18150 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18160 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
18170 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
18180 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
18190 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
181a0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
181b0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
181c0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
181d0 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b   skipShared = 0;
181e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
181f0 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  EST.  int h = pF
18200 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a  ile->h;.#endif..
18210 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
18220 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
18230 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
18240 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
18250 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  d (afp)\n", pFil
18260 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
18270 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
18280 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46  e->eFileLock, pF
18290 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69  ile->pInode->eFi
182a0 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
182b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a  Inode->nShared,.
182c0 20 20 20 20 20 20 20 20 20 20 20 6f 73 47 65 74             osGet
182d0 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
182e0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
182f0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
18300 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18310 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
18320 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18340 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
18350 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
18360 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
18370 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
18380 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
18390 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
183a0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
183b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
183c0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
183d0 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
183e0 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  k );.    Simulat
183f0 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
18400 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
18410 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
18420 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
18430 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20  rrorBenign(0);. 
18440 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54     .#ifdef SQLIT
18450 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
18460 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
18470 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
18480 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
18490 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
184a0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
184b0 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
184c0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
184d0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
184e0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
184f0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
18500 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
18510 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
18520 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
18530 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
18540 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
18550 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
18560 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
18570 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
18580 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
18590 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
185a0 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
185b0 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
185c0 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
185d0 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
185e0 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
185f0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
18600 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
18610 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
18620 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
18630 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
18640 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
18650 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46             || pF
18660 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30  ile->dbUpdate==0
18670 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
18680 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
18690 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20 70 46  hng==1 );.    pF
186a0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
186b0 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  te = 0;.#endif. 
186c0 20 20 20 0a 20 20 20 20 69 66 28 20 70 46 69 6c     .    if( pFil
186d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  e->eFileLock==EX
186e0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
186f0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18700 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18710 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
18720 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
18730 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20  ED_SIZE, 0);.   
18740 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18750 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
18760 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
18770 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
18780 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20 20 20  ed>1) ){.       
18790 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73 74 61   /* only re-esta
187a0 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64  blish the shared
187b0 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73 73 61   lock if necessa
187c0 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ry */.        in
187d0 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65  t sharedLockByte
187e0 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
187f0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
18800 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  te;.        rc =
18810 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18820 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18830 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  le, sharedLockBy
18840 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
18850 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
18860 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20 31    skipShared = 1
18870 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18880 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18890 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
188a0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49  eFileLock>=PENDI
188b0 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  NG_LOCK ){.     
188c0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
188d0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
188e0 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47  , pFile, PENDING
188f0 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20  _BYTE, 1, 0);.  
18900 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72 63 3d    } .    if( rc=
18910 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
18920 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
18930 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26  RESERVED_LOCK &&
18940 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
18950 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
18960 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
18970 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
18980 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
18990 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  E, 1, 0);.      
189a0 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20 20 20  if( !rc ){ .    
189b0 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
189c0 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20 20 20  erved = 0; .    
189d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
189e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
189f0 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
18a00 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
18a10 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
18a20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
18a30 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
18a40 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a  RED_LOCK;.    }.
18a50 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
18a60 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69 6c 65  LITE_OK && eFile
18a70 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
18a80 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65  ..    /* Decreme
18a90 6e 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  nt the shared lo
18aa0 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c  ck counter.  Rel
18ab0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73  ease the lock us
18ac0 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53  ing an.    ** OS
18ad0 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20   call only when 
18ae0 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74  all threads in t
18af0 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73  his same process
18b00 20 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20   have released. 
18b10 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a     ** the lock..
18b20 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67      */.    unsig
18b30 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68  ned long long sh
18b40 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
18b50 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
18b60 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
18b70 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61      pInode->nSha
18b80 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  red--;.    if( p
18b90 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
18ba0 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d 75 6c  0 ){.      Simul
18bb0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18bc0 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c  (1);.      Simul
18bd0 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d  ateIOError( h=(-
18be0 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d 75 6c  1) ).      Simul
18bf0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
18c00 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  (0);.      if( !
18c10 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a 20 20  skipShared ){.  
18c20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
18c30 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
18c40 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73 68  bPath, pFile, sh
18c50 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31 2c  aredLockByte, 1,
18c60 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
18c70 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a 20 20     if( !rc ){.  
18c80 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
18c90 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
18ca0 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
18cb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
18cc0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
18cd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
18ce0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18cf0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
18d00 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k--;.      asser
18d10 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
18d20 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  >=0 );.      if(
18d30 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d   pInode->nLock==
18d40 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f  0 ){.        clo
18d50 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
18d60 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  le);.      }.   
18d70 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
18d80 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
18d90 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18da0 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  K ) pFile->eFile
18db0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
18dc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
18dd0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
18de0 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70 20 41  file & cleanup A
18df0 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f 63 6b  FP specific lock
18e00 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a  ing context .*/.
18e10 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 6c  static int afpCl
18e20 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
18e30 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
18e40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
18e50 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
18e60 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
18e70 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
18e80 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69 64 2c     afpUnlock(id,
18e90 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 75   NO_LOCK);.    u
18ea0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
18eb0 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
18ec0 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65 2d  pInode && pFile-
18ed0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29  >pInode->nLock )
18ee0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
18ef0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
18f00 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
18f10 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
18f20 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
18f30 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61       ** yet beca
18f40 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
18f50 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
18f60 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
18f70 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
18f80 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  * descriptor to 
18f90 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69 6e 67  pInode->aPending
18fa0 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75  .  It will be au
18fb0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73  tomatically clos
18fc0 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a  ed when.      **
18fd0 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69   the last lock i
18fe0 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20  s cleared..     
18ff0 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e   */.      setPen
19000 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20  dingFd(pFile);. 
19010 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
19020 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
19030 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
19040 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
19050 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
19060 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
19070 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c  e(id);.    unixL
19080 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
19090 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
190a0 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
190b0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
190c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
190d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
190e0 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61  /*.** The code a
190f0 62 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20  bove is the AFP 
19100 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74  lock implementat
19110 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69  ion.  The code i
19120 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f  s specific.** to
19130 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73   MacOSX and does
19140 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68   not work on oth
19150 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d  er unix platform
19160 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69  s.  No alternati
19170 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62  ve.** is availab
19180 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27  le.  If you don'
19190 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20  t compile for a 
191a0 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75  mac, then the "u
191b0 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20  nix-afp".** VFS 
191c0 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
191d0 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ..**.***********
191e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
191f0 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69  f the AFP lock i
19200 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
19210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19220 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
19230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19270 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
19280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192c0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
192d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
192e0 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b  * Begin NFS Lock
192f0 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
19300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19310 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e  ****/..#if defin
19320 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
19330 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
19340 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a  OCKING_STYLE./*.
19350 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f   ** Lower the lo
19360 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
19370 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
19380 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
19390 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a  k.  eFileLock. *
193a0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
193b0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
193c0 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a  ED_LOCK.. **. **
193d0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
193e0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
193f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
19400 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
19410 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75  low. ** the requ
19420 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
19430 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
19440 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a  e is a no-op.. *
19450 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73  /.static int nfs
19460 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
19470 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
19480 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72  leLock){.  retur
19490 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64  n posixUnlock(id
194a0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
194b0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
194c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
194d0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
194e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
194f0 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
19500 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
19510 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
19520 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
19530 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
19540 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
19550 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
19560 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
19570 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
19580 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
19590 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
195a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
195b0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
195c0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
195d0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
195e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
195f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
19640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
19680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
19690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
196a0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
196b0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
196c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
196d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
196e0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
196f0 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
19700 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
19710 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
19720 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
19730 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
19740 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
19750 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
19760 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
19770 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
19780 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
19790 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
197a0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
197b0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
197c0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
197d0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
197e0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
197f0 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
19800 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
19810 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
19820 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
19830 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
19840 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19850 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
19860 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
19870 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
19880 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19890 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
198a0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
198b0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
198c0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
198d0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
198e0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
198f0 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
19900 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
19910 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
19920 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
19930 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
19940 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
19950 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
19960 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
19970 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d 20 62  ** in any form b
19980 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77 69  y default, we wi
19990 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  ll not attempt t
199a0 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f  o define _XOPEN_
199b0 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20 74  SOURCE..** See t
199c0 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e 64  ickets #2741 and
199d0 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f   #2681..**.** To
199e0 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20   avoid stomping 
199f0 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20  the errno value 
19a00 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61 64  on a failed read
19a10 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76   the lastErrno v
19a20 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62  alue.** is set b
19a30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
19a40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19a50 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78 46  eekAndRead(unixF
19a60 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65 33  ile *id, sqlite3
19a70 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20 76  _int64 offset, v
19a80 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63  oid *pBuf, int c
19a90 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  nt){.  int got;.
19aa0 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20 30 3b    int prior = 0;
19ab0 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
19ac0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
19ad0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
19ae0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
19af0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
19b00 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61 73 73  MER_START;.  ass
19b10 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74 26 30  ert( cnt==(cnt&0
19b20 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73  x1ffff) );.  ass
19b30 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29 3b 0a  ert( id->h>2 );.
19b40 20 20 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65    do{.#if define
19b50 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20  d(USE_PREAD).   
19b60 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69   got = osPread(i
19b70 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c  d->h, pBuf, cnt,
19b80 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69   offset);.    Si
19b90 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67  mulateIOError( g
19ba0 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66  ot = -1 );.#elif
19bb0 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19bc0 41 44 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20  AD64).    got = 
19bd0 6f 73 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c  osPread64(id->h,
19be0 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
19bf0 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
19c00 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
19c10 2d 31 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  -1 );.#else.    
19c20 6e 65 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65  newOffset = lsee
19c30 6b 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  k(id->h, offset,
19c40 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
19c50 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
19c60 20 6e 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a   newOffset-- );.
19c70 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
19c80 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20  t!=offset ){.   
19c90 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74     if( newOffset
19ca0 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20   == -1 ){.      
19cb0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
19cc0 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
19cd0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  errno);.      }e
19ce0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  lse{.        sto
19cf0 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69  reLastErrno((uni
19d00 78 46 69 6c 65 2a 29 69 64 2c 20 30 29 3b 0a 20  xFile*)id, 0);. 
19d10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
19d20 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
19d30 20 20 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69    got = osRead(i
19d40 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
19d50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  ;.#endif.    if(
19d60 20 67 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61   got==cnt ) brea
19d70 6b 3b 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30  k;.    if( got<0
19d80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72   ){.      if( er
19d90 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f  rno==EINTR ){ go
19da0 74 20 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b  t = 1; continue;
19db0 20 7d 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d   }.      prior =
19dc0 20 30 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   0;.      storeL
19dd0 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69  astErrno((unixFi
19de0 6c 65 2a 29 69 64 2c 20 20 65 72 72 6e 6f 29 3b  le*)id,  errno);
19df0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19e00 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3e    }else if( got>
19e10 30 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d  0 ){.      cnt -
19e20 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66  = got;.      off
19e30 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  set += got;.    
19e40 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a    prior += got;.
19e50 20 20 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f        pBuf = (vo
19e60 69 64 2a 29 28 67 6f 74 20 2b 20 28 63 68 61 72  id*)(got + (char
19e70 2a 29 70 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20  *)pBuf);.    }. 
19e80 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e 30 20 29   }while( got>0 )
19e90 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20  ;.  TIMER_END;. 
19ea0 20 4f 53 54 52 41 43 45 28 28 22 52 45 41 44 20   OSTRACE(("READ 
19eb0 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
19ec0 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20  d %llu\n",.     
19ed0 20 20 20 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f         id->h, go
19ee0 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d  t+prior, offset-
19ef0 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41  prior, TIMER_ELA
19f00 50 53 45 44 29 29 3b 0a 20 20 72 65 74 75 72 6e  PSED));.  return
19f10 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f   got+prior;.}../
19f20 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
19f30 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
19f40 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
19f50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
19f60 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
19f70 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
19f80 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
19f90 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
19fa0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
19fb0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
19fc0 78 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33  xRead(.  sqlite3
19fd0 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f  _file *id, .  vo
19fe0 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
19ff0 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1a000 69 6e 74 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a  int64 offset.){.
1a010 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
1a020 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
1a030 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20  id;.  int got;. 
1a040 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1a050 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
1a060 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1a070 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1a080 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1a090 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1a0a0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1a0b0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1a0c0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1a0d0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1a0e0 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1a0f0 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1a100 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1a110 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1a120 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d  pFile->pUnused==
1a130 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  0.       || offs
1a140 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  et>=PENDING_BYTE
1a150 2b 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f  +512.       || o
1a160 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49  ffset+amt<=PENDI
1a170 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65  NG_BYTE .  );.#e
1a180 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
1a190 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
1a1a0 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20  .  /* Deal with 
1a1b0 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20  as much of this 
1a1c0 72 65 61 64 20 72 65 71 75 65 73 74 20 61 73 20  read request as 
1a1d0 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1a1e0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1a1f0 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1a200 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1a210 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1a220 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1a230 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1a240 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1a250 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1a260 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1a270 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38 20  cpy(pBuf, &((u8 
1a280 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65  *)(pFile->pMapRe
1a290 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20  gion))[offset], 
1a2a0 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1a2b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a2c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1a2d0 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1a2e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1a2f0 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1a300 79 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29  y(pBuf, &((u8 *)
1a310 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1a320 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43  on))[offset], nC
1a330 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1a340 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1a350 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1a360 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1a370 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1a380 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1a390 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65  ndif..  got = se
1a3a0 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
1a3b0 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1a3c0 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d  mt);.  if( got==
1a3d0 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
1a3e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1a3f0 65 6c 73 65 20 69 66 28 20 67 6f 74 3c 30 20 29  else if( got<0 )
1a400 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72  {.    /* lastErr
1a410 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1a420 64 52 65 61 64 20 2a 2f 0a 20 20 20 20 72 65 74  dRead */.    ret
1a430 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a440 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _READ;.  }else{.
1a450 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1a460 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20 20 20  no(pFile, 0);   
1a470 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1a480 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 2f 2a 20  error */.    /* 
1a490 55 6e 72 65 61 64 20 70 61 72 74 73 20 6f 66 20  Unread parts of 
1a4a0 74 68 65 20 62 75 66 66 65 72 20 6d 75 73 74 20  the buffer must 
1a4b0 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a  be zero-filled *
1a4c0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28  /.    memset(&((
1a4d0 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d  char*)pBuf)[got]
1a4e0 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20  , 0, amt-got);. 
1a4f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a500 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
1a510 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  D;.  }.}../*.** 
1a520 41 74 74 65 6d 70 74 20 74 6f 20 73 65 65 6b 20  Attempt to seek 
1a530 74 68 65 20 66 69 6c 65 2d 64 65 73 63 72 69 70  the file-descrip
1a540 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
1a550 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1a560 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75 74 65 20   to.** absolute 
1a570 6f 66 66 73 65 74 20 69 4f 66 66 2c 20 74 68 65  offset iOff, the
1a580 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69  n attempt to wri
1a590 74 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66  te nBuf bytes of
1a5a0 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a 20 70 42   data from.** pB
1a5b0 75 66 20 74 6f 20 69 74 2e 20 49 66 20 61 6e 20  uf to it. If an 
1a5c0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65  error occurs, re
1a5d0 74 75 72 6e 20 2d 31 20 61 6e 64 20 73 65 74 20  turn -1 and set 
1a5e0 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68 65 72 77  *piErrno. Otherw
1a5f0 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ise, .** return 
1a600 74 68 65 20 61 63 74 75 61 6c 20 6e 75 6d 62 65  the actual numbe
1a610 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
1a620 65 6e 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  en (which may be
1a630 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a 20 6e 42   less than.** nB
1a640 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  uf)..*/.static i
1a650 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  nt seekAndWriteF
1a660 64 28 0a 20 20 69 6e 74 20 66 64 2c 20 20 20 20  d(.  int fd,    
1a670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a680 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
1a690 63 72 69 70 74 6f 72 20 74 6f 20 77 72 69 74 65  criptor to write
1a6a0 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 69 4f 66   to */.  i64 iOf
1a6b0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a6c0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1a6d0 20 6f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   offset to begin
1a6e0 20 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 20   writing at */. 
1a6f0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75   const void *pBu
1a700 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
1a710 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72   /* Copy data fr
1a720 6f 6d 20 74 68 69 73 20 62 75 66 66 65 72 20 74  om this buffer t
1a730 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  o the file */.  
1a740 69 6e 74 20 6e 42 75 66 2c 20 20 20 20 20 20 20  int nBuf,       
1a750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a760 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
1a770 72 20 70 42 75 66 20 69 6e 20 62 79 74 65 73 20  r pBuf in bytes 
1a780 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45 72 72 6e  */.  int *piErrn
1a790 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o               
1a7a0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72       /* OUT: Err
1a7b0 6f 72 20 6e 75 6d 62 65 72 20 69 66 20 65 72 72  or number if err
1a7c0 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 29 7b 0a  or occurs */.){.
1a7d0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7f0 20 20 2f 2a 20 56 61 6c 75 65 20 72 65 74 75 72    /* Value retur
1a800 6e 65 64 20 62 79 20 73 79 73 74 65 6d 20 63 61  ned by system ca
1a810 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ll */..  assert(
1a820 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26 30 78 31   nBuf==(nBuf&0x1
1a830 66 66 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72  ffff) );.  asser
1a840 74 28 20 66 64 3e 32 20 29 3b 0a 20 20 6e 42 75  t( fd>2 );.  nBu
1a850 66 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  f &= 0x1ffff;.  
1a860 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69  TIMER_START;..#i
1a870 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1a880 45 41 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20  EAD).  do{ rc = 
1a890 28 69 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64  (int)osPwrite(fd
1a8a0 2c 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f  , pBuf, nBuf, iO
1a8b0 66 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  ff); }while( rc<
1a8c0 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
1a8d0 52 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  R );.#elif defin
1a8e0 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
1a8f0 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1a900 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70  osPwrite64(fd, p
1a910 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1a920 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26  ;}while( rc<0 &&
1a930 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
1a940 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
1a950 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65  i64 iSeek = lsee
1a960 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b  k(fd, iOff, SEEK
1a970 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
1a980 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65  ateIOError( iSee
1a990 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  k-- );..    if( 
1a9a0 69 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20  iSeek!=iOff ){. 
1a9b0 20 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f       if( piErrno
1a9c0 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69   ) *piErrno = (i
1a9d0 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f  Seek==-1 ? errno
1a9e0 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74   : 0);.      ret
1a9f0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
1aa00 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1aa10 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1aa20 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1aa30 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1aa40 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1aa50 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1aa60 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1aa70 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1aa80 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1aa90 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1aaa0 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  ;..  if( rc<0 &&
1aab0 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72   piErrno ) *piEr
1aac0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1aad0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1aae0 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1aaf0 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1ab00 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1ab10 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1ab20 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1ab30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1ab40 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1ab50 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1ab60 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1ab70 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1ab80 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1ab90 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1aba0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1abb0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1abc0 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1abd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1abe0 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1abf0 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1ac00 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1ac10 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1ac20 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1ac30 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1ac40 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1ac50 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1ac60 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1ac70 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1ac80 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1ac90 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1aca0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1acb0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1acc0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1acd0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1ace0 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1acf0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1ad00 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1ad10 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1ad20 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1ad30 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1ad40 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1ad50 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1ad60 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1ad70 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1ad80 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1ad90 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1ada0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1adb0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1adc0 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1add0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1ade0 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1adf0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1ae00 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1ae10 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1ae20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1ae30 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1ae40 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1ae50 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1ae60 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1ae70 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1ae80 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1ae90 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1aea0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1aeb0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1aec0 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1aed0 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1aee0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1aef0 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1af00 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1af10 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1af20 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1af30 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1af40 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1af50 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1af60 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1af70 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1af80 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1af90 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1afa0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1afb0 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1afc0 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1afd0 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1afe0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1aff0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1b000 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1b010 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1b020 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1b030 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1b040 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1b050 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1b060 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1b070 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1b080 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1b090 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1b0a0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1b0b0 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1b0c0 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1b0d0 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1b0e0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b0f0 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1b100 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1b110 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1b120 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1b130 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1b140 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1b150 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1b160 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1b170 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1b180 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1b190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b1a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1b1b0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1b1c0 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1b1d0 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1b1e0 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
1b1f0 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1b200 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1b210 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1b220 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1b230 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1b240 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1b250 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1b260 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1b270 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1b280 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1b290 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1b2a0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1b2b0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1b2c0 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
1b2d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1b2e0 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1b2f0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1b300 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1b310 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1b320 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1b330 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1b340 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1b350 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
1b360 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1b370 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1b380 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1b390 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1b3a0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1b3b0 20 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68   }.#endif. .  wh
1b3c0 69 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65  ile( (wrote = se
1b3d0 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65  ekAndWrite(pFile
1b3e0 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20  , offset, pBuf, 
1b3f0 61 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f  amt))<amt && wro
1b400 74 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  te>0 ){.    amt 
1b410 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
1b420 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
1b430 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
1b440 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
1b450 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
1b460 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
1b470 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
1b480 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
1b490 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
1b4a0 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69  , amt=1 ));..  i
1b4b0 66 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a  f( amt>wrote ){.
1b4c0 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20      if( wrote<0 
1b4d0 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  && pFile->lastEr
1b4e0 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20  rno!=ENOSPC ){. 
1b4f0 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e       /* lastErrn
1b500 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64  o set by seekAnd
1b510 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72  Write */.      r
1b520 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b530 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65  RR_WRITE;.    }e
1b540 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  lse{.      store
1b550 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1b560 20 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79   0); /* not a sy
1b570 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20  stem error */.  
1b580 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b590 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
1b5a0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1b5b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  TE_OK;.}..#ifdef
1b5c0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1b5d0 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d  ** Count the num
1b5e0 62 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73  ber of fullsyncs
1b5f0 20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63   and normal sync
1b600 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  s.  This is used
1b610 20 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74   to test.** that
1b620 20 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73   syncs and fulls
1b630 79 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69  yncs are occurri
1b640 6e 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20  ng at the right 
1b650 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  times..*/.int sq
1b660 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74  lite3_sync_count
1b670 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65   = 0;.int sqlite
1b680 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1b690 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
1b6a0 0a 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72  .** We do not tr
1b6b0 75 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70  ust systems to p
1b6c0 72 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67  rovide a working
1b6d0 20 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53   fdatasync().  S
1b6e0 6f 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72  ome do..** Other
1b6f0 73 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20  s do no.  To be 
1b700 73 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74  safe, we will st
1b710 69 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c  ick with the (sl
1b720 69 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a  ightly slower).*
1b730 2a 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f  * fsync(). If yo
1b740 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72  u know that your
1b750 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70   system does sup
1b760 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29  port fdatasync()
1b770 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74   correctly,.** t
1b780 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69  hen simply compi
1b790 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73  le with -Dfdatas
1b7a0 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72  ync=fdatasync or
1b7b0 20 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e   -DHAVE_FDATASYN
1b7c0 43 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  C.*/.#if !define
1b7d0 64 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20  d(fdatasync) && 
1b7e0 21 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  !HAVE_FDATASYNC.
1b7f0 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79  # define fdatasy
1b800 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a  nc fsync.#endif.
1b810 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41  ./*.** Define HA
1b820 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20  VE_FULLFSYNC to 
1b830 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67  0 or 1 depending
1b840 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
1b850 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c  ot.** the F_FULL
1b860 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64  FSYNC macro is d
1b870 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46  efined.  F_FULLF
1b880 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c  SYNC is currentl
1b890 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61  y.** only availa
1b8a0 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e  ble on Mac OS X.
1b8b0 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64    But that could
1b8c0 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64   change..*/.#ifd
1b8d0 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23  ef F_FULLFSYNC.#
1b8e0 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1b8f0 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23  LFSYNC 1.#else.#
1b900 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c   define HAVE_FUL
1b910 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a  LFSYNC 0.#endif.
1b920 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79 6e  ../*.** The fsyn
1b930 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  c() system call 
1b940 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61 73  does not work as
1b950 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20 6d   advertised on m
1b960 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73 74  any.** unix syst
1b970 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ems.  The follow
1b980 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69 73  ing procedure is
1b990 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 6d   an attempt to m
1b9a0 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20 62  ake.** it work b
1b9b0 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etter..**.** The
1b9c0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1b9d0 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20 61  macro disables a
1b9e0 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54 68  ll fsync()s.  Th
1b9f0 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a 20  is is useful.** 
1ba00 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65 6e  for testing when
1ba10 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e 20   we want to run 
1ba20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73 74  through the test
1ba30 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e 0a   suite quickly..
1ba40 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f 6e  ** You are stron
1ba50 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f 74  gly advised *not
1ba60 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74 68  * to deploy with
1ba70 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a   SQLITE_NO_SYNC.
1ba80 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77 65  ** enabled, howe
1ba90 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68 20  ver, since with 
1baa0 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65  SQLITE_NO_SYNC e
1bab0 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63 72  nabled, an OS cr
1bac0 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  ash.** or power 
1bad0 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69 6b  failure will lik
1bae0 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65 20  ely corrupt the 
1baf0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1bb00 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74 73  *.** SQLite sets
1bb10 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1bb20 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20 6f  ag if the size o
1bb30 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e  f the file is un
1bb40 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65 20  changed..** The 
1bb50 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74 61  idea behind data
1bb60 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74 20  Only is that it 
1bb70 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69 74  should only writ
1bb80 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 65  e the file conte
1bb90 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20 6e  nt.** to disk, n
1bba0 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 57  ot the inode.  W
1bbb0 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61 4f  e only set dataO
1bbc0 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65 20  nly if the file 
1bbd0 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63 68  size is .** unch
1bbe0 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20  anged since the 
1bbf0 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61 72  file size is par
1bc00 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e 20  t of the inode. 
1bc10 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54 65   However, .** Te
1bc20 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73 20  d Ts'o tells us 
1bc30 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28 29  that fdatasync()
1bc40 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74 65   will also write
1bc50 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74 68   the inode if th
1bc60 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20 68  e.** file size h
1bc70 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68 65  as changed.  The
1bc80 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66 65   only real diffe
1bc90 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66 64  rence between fd
1bca0 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e 64  atasync().** and
1bcb0 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74 65   fsync(), Ted te
1bcc0 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74 20  lls us, is that 
1bcd0 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c  fdatasync() will
1bce0 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a 2a   not flush the.*
1bcf0 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20 6d  * inode if the m
1bd00 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f 72  time or owner or
1bd10 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74 74   other inode att
1bd20 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68 61  ributes have cha
1bd30 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79  nged..** We only
1bd40 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65 20   care about the 
1bd50 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20 74  file size, not t
1bd60 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61 74  he other file at
1bd70 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a 20  tributes, so.** 
1bd80 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74 65  as far as SQLite
1bd90 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20 61   is concerned, a
1bda0 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 73  n fdatasync() is
1bdb0 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74 65   always adequate
1bdc0 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77 61  ..** So, we alwa
1bdd0 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e 63  ys use fdatasync
1bde0 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61 69  () if it is avai
1bdf0 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65 73  lable, regardles
1be00 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c 75  s of.** the valu
1be10 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e 6c  e of the dataOnl
1be20 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74 69  y flag..*/.stati
1be30 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63  c int full_fsync
1be40 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75 6c  (int fd, int ful
1be50 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61 4f  lSync, int dataO
1be60 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  nly){.  int rc;.
1be70 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  .  /* The follow
1be80 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66 2f  ing "ifdef/elif/
1be90 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61 73  else/" block has
1bea0 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63 74   the same struct
1beb0 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65 20  ure as.  ** the 
1bec0 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69 73  one below. It is
1bed0 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72 65   replicated here
1bee0 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69 64   solely to avoid
1bef0 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20 2a   cluttering .  *
1bf00 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63 6f  * up the real co
1bf10 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55 53  de with the UNUS
1bf20 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20 6d  ED_PARAMETER() m
1bf30 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  acros..  */.#ifd
1bf40 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  ef SQLITE_NO_SYN
1bf50 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  C.  UNUSED_PARAM
1bf60 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53  ETER(fd);.  UNUS
1bf70 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c  ED_PARAMETER(ful
1bf80 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44  lSync);.  UNUSED
1bf90 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f  _PARAMETER(dataO
1bfa0 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56 45  nly);.#elif HAVE
1bfb0 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e 55  _FULLFSYNC.  UNU
1bfc0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61  SED_PARAMETER(da
1bfd0 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a 20  taOnly);.#else. 
1bfe0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1bff0 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55  R(fullSync);.  U
1c000 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1c010 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69  dataOnly);.#endi
1c020 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20 74  f..  /* Record t
1c030 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69 6d  he number of tim
1c040 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61 20  es that we do a 
1c050 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20 61  normal fsync() a
1c060 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59 4e  nd .  ** FULLSYN
1c070 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  C.  This is used
1c080 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20   during testing 
1c090 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1c0a0 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20 20  his procedure.  
1c0b0 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77  ** gets called w
1c0c0 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
1c0d0 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  arguments..  */.
1c0e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1c0f0 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e  ST.  if( fullSyn
1c100 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  c ) sqlite3_full
1c110 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20  sync_count++;.  
1c120 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75  sqlite3_sync_cou
1c130 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nt++;.#endif..  
1c140 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c 65  /* If we compile
1c150 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
1c160 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c 20  E_NO_SYNC flag, 
1c170 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73 20  then syncing is 
1c180 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a  a.  ** no-op.  *
1c190 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1c1a0 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20 53  NO_SYNC.  rc = S
1c1b0 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20  QLITE_OK;.#elif 
1c1c0 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20  HAVE_FULLFSYNC. 
1c1d0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b   if( fullSync ){
1c1e0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74  .    rc = osFcnt
1c1f0 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e  l(fd, F_FULLFSYN
1c200 43 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  C, 0);.  }else{.
1c210 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a      rc = 1;.  }.
1c220 20 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c    /* If the FULL
1c230 46 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61  FSYNC failed, fa
1c240 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d  ll back to attem
1c250 70 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29  pting an fsync()
1c260 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64  ..  ** It should
1c270 6e 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20  n't be possible 
1c280 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f  for fullfsync to
1c290 20 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63   fail on the loc
1c2a0 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79  al .  ** file sy
1c2b0 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73  stem (on OSX), s
1c2c0 6f 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61  o failure indica
1c2d0 74 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59  tes that FULLFSY
1c2e0 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75  NC.  ** isn't su
1c2f0 70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73  pported for this
1c300 20 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f   file system. So
1c310 2c 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79  , attempt an fsy
1c320 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f  nc .  ** and (fo
1c330 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68  r now) ignore th
1c340 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20  e overhead of a 
1c350 73 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74  superfluous fcnt
1c360 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49  l call.  .  ** I
1c370 74 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f  t'd be better to
1c380 20 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e   detect fullfsyn
1c390 63 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61  c support once a
1c3a0 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74  nd avoid .  ** t
1c3b0 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76  he fcntl call ev
1c3c0 65 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73  ery time sync is
1c3d0 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20   called..  */.  
1c3e0 69 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73  if( rc ) rc = fs
1c3f0 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20  ync(fd);..#elif 
1c400 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1c410 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e  _).  /* fdatasyn
1c420 63 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73  c() on HFS+ does
1c430 6e 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68  n't yet flush th
1c440 65 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69  e file size if i
1c450 74 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63  t changed correc
1c460 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72  tly.  ** so curr
1c470 65 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74  ently we default
1c480 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68   to the macro th
1c490 61 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61  at redefines fda
1c4a0 74 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a  tasync to fsync.
1c4b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e    */.  rc = fsyn
1c4c0 63 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20  c(fd);.#else .  
1c4d0 72 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66  rc = fdatasync(f
1c4e0 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d);.#if OS_VXWOR
1c4f0 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20  KS.  if( rc==-1 
1c500 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55  && errno==ENOTSU
1c510 50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73  P ){.    rc = fs
1c520 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e  ync(fd);.  }.#en
1c530 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
1c540 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69  S */.#endif /* i
1c550 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1c560 59 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55  YNC elif HAVE_FU
1c570 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66  LLFSYNC */..  if
1c580 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20  ( OS_VXWORKS && 
1c590 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72  rc!= -1 ){.    r
1c5a0 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  c = 0;.  }.  ret
1c5b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c5c0 20 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   Open a file des
1c5d0 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64  criptor to the d
1c5e0 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e  irectory contain
1c5f0 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61  ing file zFilena
1c600 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  me..** If succes
1c610 73 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65  sful, *pFd is se
1c620 74 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20  t to the opened 
1c630 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1c640 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
1c650 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
1c660 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1c670 2c 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  , either SQLITE_
1c680 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49  NOMEM.** or SQLI
1c690 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72  TE_CANTOPEN is r
1c6a0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64  eturned and *pFd
1c6b0 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e   is set to an un
1c6c0 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65  defined.** value
1c6d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65  ..**.** The dire
1c6e0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
1c6f0 69 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  iptor is used fo
1c700 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67  r only one thing
1c710 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29   - to.** fsync()
1c720 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20   a directory to 
1c730 6d 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63  make sure file c
1c740 72 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65  reation and dele
1c750 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61  tion events.** a
1c760 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69  re flushed to di
1c770 73 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73  sk.  Such fsyncs
1c780 20 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20   are not needed 
1c790 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72  on newer.** jour
1c7a0 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65  naling filesyste
1c7b0 6d 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75  ms, but are requ
1c7c0 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69  ired on older fi
1c7d0 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  lesystems..**.**
1c7e0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61   This routine ca
1c7f0 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
1c800 75 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79  using the xSetSy
1c810 73 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e  sCall interface.
1c820 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20  .** The ability 
1c830 74 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73  to override this
1c840 20 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64   routine was add
1c850 65 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66  ed in support of
1c860 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d   the.** chromium
1c870 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69   sandbox.  Openi
1c880 6e 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69  ng a directory i
1c890 73 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73  s a security ris
1c8a0 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c  k (we are.** tol
1c8b0 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20  d) so making it 
1c8c0 6f 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c  overrideable all
1c8d0 6f 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d  ows the chromium
1c8e0 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72   sandbox to.** r
1c8f0 65 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74  eplace this rout
1c900 69 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c  ine with a harml
1c910 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d  ess no-op.  To m
1c920 61 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ake this routine
1c930 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70  .** a no-op, rep
1c940 6c 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73  lace it with a s
1c950 74 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73  tub that returns
1c960 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c   SQLITE_OK but l
1c970 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65  eaves.** *pFd se
1c980 74 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20  t to a negative 
1c990 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  number..**.** If
1c9a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1c9b0 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c  turned, the call
1c9c0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
1c9d0 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a  e for closing.**
1c9e0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c9f0 70 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20  ptor *pFd using 
1ca00 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  close()..*/.stat
1ca10 69 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63  ic int openDirec
1ca20 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20  tory(const char 
1ca30 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20  *zFilename, int 
1ca40 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b  *pFd){.  int ii;
1ca50 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
1ca60 20 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b    char zDirname[
1ca70 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b  MAX_PATHNAME+1];
1ca80 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ..  sqlite3_snpr
1ca90 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
1caa0 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73  E, zDirname, "%s
1cab0 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  ", zFilename);. 
1cac0 20 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72   for(ii=(int)str
1cad0 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69  len(zDirname); i
1cae0 69 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b  i>1 && zDirname[
1caf0 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b  ii]!='/'; ii--);
1cb00 0a 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20  .  if( ii>0 ){. 
1cb10 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20     zDirname[ii] 
1cb20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d  = '\0';.    fd =
1cb30 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69   robust_open(zDi
1cb40 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  rname, O_RDONLY|
1cb50 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20  O_BINARY, 0);.  
1cb60 20 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20    if( fd>=0 ){. 
1cb70 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f       OSTRACE(("O
1cb80 50 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e  PENDIR %-3d %s\n
1cb90 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29  ", fd, zDirname)
1cba0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
1cbb0 70 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75  pFd = fd;.  retu
1cbc0 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45  rn (fd>=0?SQLITE
1cbd0 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72  _OK:unixLogError
1cbe0 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
1cbf0 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
1cc00 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a  Dirname));.}../*
1cc10 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
1cc20 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
1cc30 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
1cc40 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
1cc50 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61  isk..**.** If da
1cc60 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62  taOnly==0 then b
1cc70 6f 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73  oth the file its
1cc80 65 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61  elf and its meta
1cc90 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69  data (file.** si
1cca0 7a 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c  ze, access time,
1ccb0 20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64   etc) are synced
1ccc0 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d  .  If dataOnly!=
1ccd0 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a  0 then only the.
1cce0 2a 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20  ** file data is 
1ccf0 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e  synced..**.** Un
1cd00 64 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d  der Unix, also m
1cd10 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1cd20 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1cd30 79 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a  y for the file.*
1cd40 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
1cd50 65 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20  ed by fsync-ing 
1cd60 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
1cd70 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
1cd80 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64  file..** If we d
1cd90 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e  o not do this an
1cda0 64 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61  d we encounter a
1cdb0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
1cdc0 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
1cdd0 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a   entry for the j
1cde0 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74  ournal might not
1cdf0 20 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20   exist after we 
1ce00 72 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78  reboot.  The nex
1ce10 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61  t.** SQLite to a
1ce20 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77  ccess the file w
1ce30 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61  ill not know tha
1ce40 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78  t the journal ex
1ce50 69 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a  ists (because.**
1ce60 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
1ce70 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75  ntry for the jou
1ce80 72 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63  rnal was never c
1ce90 72 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20  reated) and the 
1cea0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77  transaction.** w
1ceb0 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63  ill not roll bac
1cec0 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61  k - possibly lea
1ced0 64 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65  ding to database
1cee0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a   corruption..*/.
1cef0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1cf00 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ync(sqlite3_file
1cf10 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29   *id, int flags)
1cf20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
1cf30 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1cf40 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
1cf50 20 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79    int isDataOnly
1cf60 20 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45   = (flags&SQLITE
1cf70 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b  _SYNC_DATAONLY);
1cf80 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e  .  int isFullsyn
1cf90 63 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29  c = (flags&0x0F)
1cfa0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
1cfb0 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  LL;..  /* Check 
1cfc0 74 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49  that one of SQLI
1cfd0 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f  TE_SYNC_NORMAL o
1cfe0 72 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65  r FULL was passe
1cff0 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66  d */.  assert((f
1d000 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
1d010 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20  TE_SYNC_NORMAL. 
1d020 20 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30       || (flags&0
1d030 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  x0F)==SQLITE_SYN
1d040 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f  C_FULL.  );..  /
1d050 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62  * Unix cannot, b
1d060 75 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  ut some systems 
1d070 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
1d080 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65  E_FULL from here
1d090 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65  . This.  ** line
1d0a0 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74   is to test that
1d0b0 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e   doing so does n
1d0c0 6f 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f  ot cause any pro
1d0d0 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69  blems..  */.  Si
1d0e0 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72  mulateDiskfullEr
1d0f0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1d100 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73  TE_FULL );..  as
1d110 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1d120 20 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20   OSTRACE(("SYNC 
1d130 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
1d140 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66  e->h));.  rc = f
1d150 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
1d160 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20  >h, isFullsync, 
1d170 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53  isDataOnly);.  S
1d180 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
1d190 72 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63  rc=1 );.  if( rc
1d1a0 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
1d1b0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
1d1c0 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
1d1d0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
1d1e0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
1d1f0 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20  , "full_fsync", 
1d200 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
1d210 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73   }..  /* Also fs
1d220 79 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72  ync the director
1d230 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  y containing the
1d240 20 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52   file if the DIR
1d250 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69  SYNC flag.  ** i
1d260 73 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20  s set.  This is 
1d270 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72  a one-time occur
1d280 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73  rence.  Many sys
1d290 74 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20  tems (examples: 
1d2a0 41 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e  AIX).  ** are un
1d2b0 61 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20  able to fsync a 
1d2c0 64 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67  directory, so ig
1d2d0 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74  nore errors on t
1d2e0 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20  he fsync..  */. 
1d2f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
1d300 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
1d310 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20  _DIRSYNC ){.    
1d320 69 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f  int dirfd;.    O
1d330 53 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43  STRACE(("DIRSYNC
1d340 20 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73   %s (have_fullfs
1d350 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d  ync=%d fullsync=
1d360 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a  %d)\n", pFile->z
1d370 50 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20  Path,.          
1d380 20 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43    HAVE_FULLFSYNC
1d390 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a  , isFullsync));.
1d3a0 20 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44      rc = osOpenD
1d3b0 69 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e  irectory(pFile->
1d3c0 7a 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a  zPath, &dirfd);.
1d3d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1d3e0 54 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d  TE_OK && dirfd>=
1d3f0 30 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f  0 ){.      full_
1d400 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20  fsync(dirfd, 0, 
1d410 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73 74  0);.      robust
1d420 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69  _close(pFile, di
1d430 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  rfd, __LINE__);.
1d440 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
1d450 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  ==SQLITE_CANTOPE
1d460 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  N ){.      rc = 
1d470 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d480 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
1d490 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49  Flags &= ~UNIXFI
1d4a0 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 7d 0a  LE_DIRSYNC;.  }.
1d4b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d4c0 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
1d4d0 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61  n open file to a
1d4e0 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a   specified size.
1d4f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
1d500 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  ixTruncate(sqlit
1d510 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34  e3_file *id, i64
1d520 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46   nByte){.  unixF
1d530 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1d540 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69  ixFile *)id;.  i
1d550 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
1d560 20 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75   pFile );.  Simu
1d570 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74  lateIOError( ret
1d580 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1d590 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20  _TRUNCATE );..  
1d5a0 2f 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68  /* If the user h
1d5b0 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20  as configured a 
1d5c0 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74  chunk-size for t
1d5d0 68 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61  his file, trunca
1d5e0 74 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65  te the.  ** file
1d5f0 20 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73   so that it cons
1d600 69 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67  ists of an integ
1d610 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75  er number of chu
1d620 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20  nks (i.e. the.  
1d630 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73  ** actual file s
1d640 69 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70  ize after the op
1d650 65 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c  eration may be l
1d660 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72  arger than the r
1d670 65 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69  equested.  ** si
1d680 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ze)..  */.  if( 
1d690 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30  pFile->szChunk>0
1d6a0 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20   ){.    nByte = 
1d6b0 28 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d  ((nByte + pFile-
1d6c0 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46  >szChunk - 1)/pF
1d6d0 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20  ile->szChunk) * 
1d6e0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a  pFile->szChunk;.
1d6f0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75    }..  rc = robu
1d700 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
1d710 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20  le->h, nByte);. 
1d720 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
1d730 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1d740 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
1d750 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
1d760 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
1d770 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
1d780 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
1d790 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
1d7a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1d7b0 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77  EBUG.    /* If w
1d7c0 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
1d7d0 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
1d7e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
1d7f0 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20  s opposed to.   
1d800 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1d810 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1d820 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1d830 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1d840 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72  han a.    ** nor
1d850 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
1d860 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61  e) and we trunca
1d870 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
1d880 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20  ero length,.    
1d890 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76  ** that effectiv
1d8a0 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  ely updates the 
1d8b0 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
1d8c0 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
1d8d0 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72  en.    ** when r
1d8e0 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62  estoring a datab
1d8f0 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61  ase using the ba
1d900 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20  ckup API from a 
1d910 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20  zero-length.    
1d920 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a  ** source..    *
1d930 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  /.    if( pFile-
1d940 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26  >inNormalWrite &
1d950 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  & nByte==0 ){.  
1d960 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
1d970 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20  CntrChng = 1;.  
1d980 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
1d990 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1d9a0 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66  SIZE>0.    /* If
1d9b0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75   the file was ju
1d9c0 73 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  st truncated to 
1d9d0 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
1d9e0 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
1d9f0 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20  y.    ** mapped 
1da00 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74  region, reduce t
1da10 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70  he effective map
1da20 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c  ping size as wel
1da30 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20  l. SQLite will. 
1da40 20 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29     ** use read()
1da50 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20   and write() to 
1da60 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f  access data beyo
1da70 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72  nd this point fr
1da80 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20  om now on.  .   
1da90 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74   */.    if( nByt
1daa0 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e<pFile->mmapSiz
1dab0 65 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  e ){.      pFile
1dac0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79  ->mmapSize = nBy
1dad0 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  te;.    }.#endif
1dae0 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ..    return SQL
1daf0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
1db00 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
1db10 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
1db20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
1db30 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
1db40 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
1db50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1db60 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
1db70 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
1db80 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
1db90 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
1dba0 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46   osFstat(((unixF
1dbb0 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
1dbc0 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
1dbd0 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
1dbe0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1dbf0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
1dc00 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
1dc10 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
1dc20 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1dc30 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
1dc40 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
1dc50 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70  e;..  /* When op
1dc60 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a  ening a zero-siz
1dc70 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
1dc80 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
1dc90 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
1dca0 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
1dcb0 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
1dcc0 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
1dcd0 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
1dce0 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
1dcf0 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
1dd00 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
1dd10 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
1dd20 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
1dd30 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
1dd40 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
1dd50 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
1dd60 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
1dd70 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
1dd80 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
1dd90 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
1dda0 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
1ddb0 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
1ddc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
1ddd0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1dde0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
1ddf0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
1de00 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
1de10 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
1de20 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
1de30 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
1de40 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
1de50 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
1de60 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
1de70 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
1de80 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
1de90 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
1dea0 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  d*);.#endif../* 
1deb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1dec0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
1ded0 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45  andle the SQLITE
1dee0 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
1def0 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   .** file-contro
1df00 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e  l operation.  En
1df10 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61  large the databa
1df20 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20  se to nBytes in 
1df30 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64  size.** (rounded
1df40 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
1df50 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66  chunk-size).  If
1df60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
1df70 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74   already.** nByt
1df80 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68  es or larger, th
1df90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1dfa0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1dfb0 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69   int fcntlSizeHi
1dfc0 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  nt(unixFile *pFi
1dfd0 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  le, i64 nByte){.
1dfe0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
1dff0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36  hunk>0 ){.    i6
1e000 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
1e010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1e020 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
1e030 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
1e040 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
1e050 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
1e060 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
1e070 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
1e080 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f  */.   .    if( o
1e090 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
1e0a0 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20   &buf) ){.      
1e0b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e0c0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
1e0d0 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 28 28  ..    nSize = ((
1e0e0 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e 73 7a 43  nByte+pFile->szC
1e0f0 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69 6c 65 2d  hunk-1) / pFile-
1e100 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1e110 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 20 20  e->szChunk;.    
1e120 69 66 28 20 6e 53 69 7a 65 3e 28 69 36 34 29 62  if( nSize>(i64)b
1e130 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b 0a 0a 23  uf.st_size ){..#
1e140 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f  if defined(HAVE_
1e150 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29  POSIX_FALLOCATE)
1e160 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46   && HAVE_POSIX_F
1e170 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20 20 20 2f  ALLOCATE.      /
1e180 2a 20 54 68 65 20 63 6f 64 65 20 62 65 6c 6f 77  * The code below
1e190 20 69 73 20 68 61 6e 64 6c 69 6e 67 20 74 68 65   is handling the
1e1a0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
1e1b0 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 29 20 0a   osFallocate() .
1e1c0 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 65 63 74        ** correct
1e1d0 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ly. posix_falloc
1e1e0 61 74 65 28 29 20 69 73 20 64 65 66 69 6e 65 64  ate() is defined
1e1f0 20 74 6f 20 22 72 65 74 75 72 6e 73 20 7a 65 72   to "returns zer
1e200 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 0a 20  o on success, . 
1e210 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e 20 65 72       ** or an er
1e220 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e 20 20 66  ror number on  f
1e230 61 69 6c 75 72 65 22 2e 20 53 65 65 20 74 68 65  ailure". See the
1e240 20 6d 61 6e 70 61 67 65 20 66 6f 72 20 64 65 74   manpage for det
1e250 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20 20 20 69  ails. */.      i
1e260 6e 74 20 65 72 72 3b 0a 20 20 20 20 20 20 64 6f  nt err;.      do
1e270 7b 0a 20 20 20 20 20 20 20 20 65 72 72 20 3d 20  {.        err = 
1e280 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70 46 69 6c  osFallocate(pFil
1e290 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f 73 69 7a  e->h, buf.st_siz
1e2a0 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e 73 74 5f  e, nSize-buf.st_
1e2b0 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 77 68  size);.      }wh
1e2c0 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e 54 52 20  ile( err==EINTR 
1e2d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72  );.      if( err
1e2e0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1e2f0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 23 65  _IOERR_WRITE;.#e
1e300 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  lse.      /* If 
1e310 74 68 65 20 4f 53 20 64 6f 65 73 20 6e 6f 74 20  the OS does not 
1e320 68 61 76 65 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  have posix_fallo
1e330 63 61 74 65 28 29 2c 20 66 61 6b 65 20 69 74 2e  cate(), fake it.
1e340 20 57 72 69 74 65 20 61 20 0a 20 20 20 20 20 20   Write a .      
1e350 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74  ** single byte t
1e360 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
1e370 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b 20 74 68  in each block th
1e380 61 74 20 66 61 6c 6c 73 20 65 6e 74 69 72 65 6c  at falls entirel
1e390 79 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 69  y.      ** withi
1e3a0 6e 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  n the extended r
1e3b0 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20 69 66 20  egion. Then, if 
1e3c0 72 65 71 75 69 72 65 64 2c 20 61 20 73 69 6e 67  required, a sing
1e3d0 6c 65 20 62 79 74 65 0a 20 20 20 20 20 20 2a 2a  le byte.      **
1e3e0 20 61 74 20 6f 66 66 73 65 74 20 28 6e 53 69 7a   at offset (nSiz
1e3f0 65 2d 31 29 2c 20 74 6f 20 73 65 74 20 74 68 65  e-1), to set the
1e400 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1e410 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a 20 20 20  e correctly..   
1e420 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 61 20     ** This is a 
1e430 73 69 6d 69 6c 61 72 20 74 65 63 68 6e 69 71 75  similar techniqu
1e440 65 20 74 6f 20 74 68 61 74 20 75 73 65 64 20 62  e to that used b
1e450 79 20 67 6c 69 62 63 20 6f 6e 20 73 79 73 74 65  y glibc on syste
1e460 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ms.      ** that
1e470 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72   do not have a r
1e480 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20  eal fallocate() 
1e490 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  call..      */. 
1e4a0 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b 20 3d 20       int nBlk = 
1e4b0 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a 65 3b 20  buf.st_blksize; 
1e4c0 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74 65 6d 20   /* File-system 
1e4d0 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f 0a 20 20  block size */.  
1e4e0 20 20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d      int nWrite =
1e4f0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1e500 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1e510 65 73 20 77 72 69 74 74 65 6e 20 62 79 20 73 65  es written by se
1e520 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20 20  ekAndWrite */.  
1e530 20 20 20 20 69 36 34 20 69 57 72 69 74 65 3b 20      i64 iWrite; 
1e540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e550 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65 74 20 74  /* Next offset t
1e560 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 0a 20  o write to */.. 
1e570 20 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28       iWrite = ((
1e580 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a  buf.st_size + 2*
1e590 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a  nBlk - 1)/nBlk)*
1e5a0 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 61 73  nBlk-1;.      as
1e5b0 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75  sert( iWrite>=bu
1e5c0 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20  f.st_size );.   
1e5d0 20 20 20 61 73 73 65 72 74 28 20 28 69 57 72 69     assert( (iWri
1e5e0 74 65 2f 6e 42 6c 6b 29 3d 3d 28 28 62 75 66 2e  te/nBlk)==((buf.
1e5f0 73 74 5f 73 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f  st_size+nBlk-1)/
1e600 6e 42 6c 6b 29 20 29 3b 0a 20 20 20 20 20 20 61  nBlk) );.      a
1e610 73 73 65 72 74 28 20 28 28 69 57 72 69 74 65 2b  ssert( ((iWrite+
1e620 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20  1)%nBlk)==0 );. 
1e630 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70       for(/*no-op
1e640 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65  */; iWrite<nSize
1e650 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29  ; iWrite+=nBlk )
1e660 7b 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74 65  {.        nWrite
1e670 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28   = seekAndWrite(
1e680 70 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22  pFile, iWrite, "
1e690 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  ", 1);.        i
1e6a0 66 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72  f( nWrite!=1 ) r
1e6b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1e6c0 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20  RR_WRITE;.      
1e6d0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69  }.      if( nWri
1e6e0 74 65 3d 3d 30 20 7c 7c 20 28 6e 53 69 7a 65 25  te==0 || (nSize%
1e6f0 6e 42 6c 6b 29 20 29 7b 0a 20 20 20 20 20 20 20  nBlk) ){.       
1e700 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e   nWrite = seekAn
1e710 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6e 53  dWrite(pFile, nS
1e720 69 7a 65 2d 31 2c 20 22 22 2c 20 31 29 3b 0a 20  ize-1, "", 1);. 
1e730 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74         if( nWrit
1e740 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51  e!=1 ) return SQ
1e750 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45  LITE_IOERR_WRITE
1e760 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
1e770 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
1e780 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
1e790 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69  SIZE>0.  if( pFi
1e7a0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e  le->mmapSizeMax>
1e7b0 30 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65  0 && nByte>pFile
1e7c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1e7d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66    int rc;.    if
1e7e0 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1e7f0 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  <=0 ){.      if(
1e800 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74   robust_ftruncat
1e810 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74  e(pFile->h, nByt
1e820 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  e) ){.        st
1e830 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
1e840 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
1e850 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
1e860 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
1e870 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
1e880 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
1e890 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20  e->zPath);.     
1e8a0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63   }.    }..    rc
1e8b0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1e8c0 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b 0a 20 20  File, nByte);.  
1e8d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1e8e0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1e8f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1e900 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  /*.** If *pArg i
1e910 73 20 69 6e 69 74 69 61 6c 6c 79 20 6e 65 67 61  s initially nega
1e920 74 69 76 65 20 74 68 65 6e 20 74 68 69 73 20 69  tive then this i
1e930 73 20 61 20 71 75 65 72 79 2e 20 20 53 65 74 20  s a query.  Set 
1e940 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31 20 6f 72  *pArg to.** 1 or
1e950 20 30 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20   0 depending on 
1e960 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 62  whether or not b
1e970 69 74 20 6d 61 73 6b 20 6f 66 20 70 46 69 6c 65  it mask of pFile
1e980 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69 73 20 73  ->ctrlFlags is s
1e990 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41  et..**.** If *pA
1e9a0 72 67 20 69 73 20 30 20 6f 72 20 31 2c 20 74 68  rg is 0 or 1, th
1e9b0 65 6e 20 63 6c 65 61 72 20 6f 72 20 73 65 74 20  en clear or set 
1e9c0 74 68 65 20 6d 61 73 6b 20 62 69 74 20 6f 66 20  the mask bit of 
1e9d0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
1e9e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1e9f0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 75 6e 69   unixModeBit(uni
1ea00 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 6e  xFile *pFile, un
1ea10 73 69 67 6e 65 64 20 63 68 61 72 20 6d 61 73 6b  signed char mask
1ea20 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b 0a 20 20  , int *pArg){.  
1ea30 69 66 28 20 2a 70 41 72 67 3c 30 20 29 7b 0a 20  if( *pArg<0 ){. 
1ea40 20 20 20 2a 70 41 72 67 20 3d 20 28 70 46 69 6c     *pArg = (pFil
1ea50 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 6d  e->ctrlFlags & m
1ea60 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ask)!=0;.  }else
1ea70 20 69 66 28 20 28 2a 70 41 72 67 29 3d 3d 30 20   if( (*pArg)==0 
1ea80 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  ){.    pFile->ct
1ea90 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d 61 73 6b  rlFlags &= ~mask
1eaa0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1eab0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
1eac0 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a  |= mask;.  }.}..
1ead0 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
1eae0 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1eaf0 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
1eb00 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
1eb10 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a  har *zBuf);../*.
1eb20 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ** Information a
1eb30 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e  nd control of an
1eb40 20 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c   open file handl
1eb50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1eb60 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
1eb70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1eb80 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  d, int op, void 
1eb90 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69 78 46 69  *pArg){.  unixFi
1eba0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1ebb0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 77 69  xFile*)id;.  swi
1ebc0 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
1ebd0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1ebe0 5f 57 41 4c 5f 42 4c 4f 43 4b 3a 20 7b 0a 20 20  _WAL_BLOCK: {.  
1ebf0 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d 3e 63 74      /* pFile->ct
1ec00 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
1ec10 49 4c 45 5f 42 4c 4f 43 4b 3b 20 2f 2f 20 44 65  ILE_BLOCK; // De
1ec20 66 65 72 72 65 64 20 66 65 61 74 75 72 65 20 2a  ferred feature *
1ec30 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
1ec40 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1ec50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ec60 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a  FCNTL_LOCKSTATE:
1ec70 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29   {.      *(int*)
1ec80 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46  pArg = pFile->eF
1ec90 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72  ileLock;.      r
1eca0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ecb0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ecc0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53  SQLITE_FCNTL_LAS
1ecd0 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20  T_ERRNO: {.     
1ece0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70   *(int*)pArg = p
1ecf0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1ed00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1ed10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1ed20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1ed30 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a  CNTL_CHUNK_SIZE:
1ed40 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
1ed50 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20  szChunk = *(int 
1ed60 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65  *)pArg;.      re
1ed70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ed80 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
1ed90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
1eda0 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69  _HINT: {.      i
1edb0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d  nt rc;.      Sim
1edc0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1edd0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1ede0 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28  = fcntlSizeHint(
1edf0 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70  pFile, *(i64 *)p
1ee00 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  Arg);.      Simu
1ee10 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1ee20 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  n(0);.      retu
1ee30 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1ee40 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1ee50 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20  TL_PERSIST_WAL: 
1ee60 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65  {.      unixMode
1ee70 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46  Bit(pFile, UNIXF
1ee80 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c  ILE_PERSIST_WAL,
1ee90 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1eea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1eeb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1eec0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1eed0 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  L_POWERSAFE_OVER
1eee0 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75  WRITE: {.      u
1eef0 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
1ef00 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c  , UNIXFILE_PSOW,
1ef10 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20   (int*)pArg);.  
1ef20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ef30 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1ef40 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1ef50 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20  L_VFSNAME: {.   
1ef60 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67     *(char**)pArg
1ef70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1ef80 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e  tf("%s", pFile->
1ef90 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  pVfs->zName);.  
1efa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1efb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1efc0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1efd0 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20  L_TEMPFILENAME: 
1efe0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  {.      char *zT
1eff0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
1f000 61 6c 6c 6f 63 36 34 28 20 70 46 69 6c 65 2d 3e  alloc64( pFile->
1f010 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1f020 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54   );.      if( zT
1f030 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
1f040 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
1f050 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
1f060 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29  athname, zTFile)
1f070 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  ;.        *(char
1f080 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
1f090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f0a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f0b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1f0c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
1f0d0 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20  S_MOVED: {.     
1f0e0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66   *(int*)pArg = f
1f0f0 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c  ileHasMoved(pFil
1f100 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
1f110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f120 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
1f130 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
1f140 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1f150 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
1f160 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
1f170 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
1f180 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
1f190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f1a0 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
1f1b0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f1c0 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
1f1d0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
1f1e0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1f1f0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
1f200 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
1f210 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
1f220 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
1f230 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
1f240 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
1f250 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
1f260 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
1f270 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
1f280 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
1f290 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
1f2a0 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
1f2b0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
1f2c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e   ){.          un
1f2d0 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  ixUnmapfile(pFil
1f2e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
1f2f0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
1f300 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
1f310 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f320 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f330 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
1f340 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
1f350 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
1f360 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f  calls this metho
1f370 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74  d to signal that
1f380 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20   it has done.   
1f390 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61   ** a rollback a
1f3a0 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
1f3b0 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72  base is therefor
1f3c0 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
1f3d0 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20      ** it hence 
1f3e0 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65  it is OK for the
1f3f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61   transaction cha
1f400 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62  nge counter to b
1f410 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67  e.    ** unchang
1f420 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ed..    */.    c
1f430 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1f440 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b  _DB_UNCHANGED: {
1f450 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
1f460 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65  e*)id)->dbUpdate
1f470 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
1f480 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f490 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
1f4a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f4b0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
1f4c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f4d0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1f4e0 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50  _FCNTL_SET_LOCKP
1f4f0 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
1f500 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
1f510 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
1f520 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
1f530 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
1f540 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
1f550 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f560 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1f570 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
1f580 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1f590 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ) */.  }.  retur
1f5a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  n SQLITE_NOTFOUN
1f5b0 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  D;.}../*.** Retu
1f5c0 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  rn the sector si
1f5d0 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74  ze in bytes of t
1f5e0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c  he underlying bl
1f5f0 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a  ock device for.*
1f600 2a 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  * the specified 
1f610 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c  file. This is al
1f620 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20  most always 512 
1f630 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62  bytes, but may b
1f640 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20  e.** larger for 
1f650 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a  some devices..**
1f660 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20  .** SQLite code 
1f670 61 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e  assumes this fun
1f680 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69  ction cannot fai
1f690 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d  l. It also assum
1f6a0 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77  es that.** if tw
1f6b0 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  o files are crea
1f6c0 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ted in the same 
1f6d0 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65  file-system dire
1f6e0 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61  ctory (i.e..** a
1f6f0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74   database and it
1f700 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20  s journal file) 
1f710 74 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20  that the sector 
1f720 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65  size will be the
1f730 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74  .** same for bot
1f740 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  h..*/.#ifndef __
1f750 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63  QNXNTO__ .static
1f760 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53   int unixSectorS
1f770 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
1f780 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e   *NotUsed){.  UN
1f790 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
1f7a0 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72  otUsed);.  retur
1f7b0 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
1f7c0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
1f7d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1f7e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73  e following vers
1f7f0 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f  ion of unixSecto
1f800 72 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d  rSize() is optim
1f810 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f  ized for QNX..*/
1f820 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
1f830 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  __.#include <sys
1f840 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e  /dcmd_blk.h>.#in
1f850 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76  clude <sys/statv
1f860 66 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74  fs.h>.static int
1f870 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1f880 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1f890 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1f8a0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1f8b0 2a 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c  *)id;.  if( pFil
1f8c0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d  e->sectorSize ==
1f8d0 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   0 ){.    struct
1f8e0 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b   statvfs fsInfo;
1f8f0 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  .       .    /* 
1f900 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72  Set defaults for
1f910 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66   non-supported f
1f920 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ilesystems */.  
1f930 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1f940 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1f950 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1f960 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  ;.    pFile->dev
1f970 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
1f980 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  cs = 0;.    if( 
1f990 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e  fstatvfs(pFile->
1f9a0 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
1f9b0 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  1 ) {.      retu
1f9c0 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
1f9d0 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Size;.    }..   
1f9e0 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
1f9f0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
1fa00 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20  "tmp") ) {.     
1fa10 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
1fa20 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
1fa30 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
1fa40 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1fa50 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1fa60 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1fa70 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20  TOMIC4K |       
1fa80 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73  /* All ram files
1fa90 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
1faa0 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
1fab0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fac0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
1fad0 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
1fae0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
1faf0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
1fb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
1fb30 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
1fb40 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
1fb50 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
1fb60 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
1fb70 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
1fb80 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
1fb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
1fbb0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
1fbc0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
1fbd0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
1fbe0 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
1fbf0 61 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29  asetype, "etfs")
1fc00 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
1fc10 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
1fc20 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
1fc30 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
1fc40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fc50 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74   =.        /* et
1fc60 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20  fs cluster size 
1fc70 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
1fc80 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46  c */.        (pF
1fc90 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1fca0 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
1fcb0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
1fcc0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1fcd0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
1fce0 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
1fcf0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
1fd00 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
1fd10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd30 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
1fd40 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
1fd50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1fd60 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
1fd70 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
1fd80 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
1fd90 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
1fda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fdc0 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
1fdd0 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
1fde0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
1fdf0 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
1fe00 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
1fe10 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20   "qnx6") ){.    
1fe20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fe30 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
1fe40 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
1fe50 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fe60 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
1fe70 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1fe80 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20  ATOMIC |        
1fe90 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74   /* All filesyst
1fea0 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
1feb0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1fec0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1fed0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1fee0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1fef0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1ff00 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1ff10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1ff30 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1ff40 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
1ff50 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
1ff60 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
1ff70 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
1ff80 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
1ff90 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ffb0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
1ffc0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
1ffd0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
1ffe0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
1fff0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
20000 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29  etype, "qnx4") )
20010 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
20020 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
20030 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
20040 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
20050 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
20060 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
20070 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
20080 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
20090 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
200a0 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
200b0 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
200c0 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
200d0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
200e0 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
200f0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
20100 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
20110 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
20120 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
20130 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
20140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20160 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
20170 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
20180 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
20190 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
201a0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
201b0 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  dos") ){.      p
201c0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
201d0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
201e0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
201f0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
20200 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
20210 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
20220 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
20230 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
20240 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
20250 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
20260 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
20270 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
20280 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
20290 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
202a0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
202b0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
202c0 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
202d0 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
202e0 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
202f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20300 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
20310 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
20320 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
20330 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20340 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
20350 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
20360 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
20370 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20  AP_ATOMIC512 |  
20380 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72      /* blocks ar
20390 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
203a0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
203b0 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
203c0 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
203d0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
203e0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
203f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20410 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
20420 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
20430 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    0;.    }.  }. 
20440 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20   /* Last chance 
20450 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49  verification.  I
20460 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  f the sector siz
20470 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70  e isn't a multip
20480 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74  le of 512.  ** t
20490 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c  hen it isn't val
204a0 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  id.*/.  if( pFil
204b0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20  e->sectorSize % 
204c0 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20  512 != 0 ){.    
204d0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
204e0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
204f0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  ;.    pFile->sec
20500 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
20510 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
20520 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75  SIZE;.  }.  retu
20530 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
20540 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  Size;.}.#endif /
20550 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a  * __QNXNTO__ */.
20560 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
20570 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
20580 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65  eristics for the
20590 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   file..**.** Thi
205a0 73 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20  s VFS is set up 
205b0 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  to return SQLITE
205c0 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45  _IOCAP_POWERSAFE
205d0 5f 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65  _OVERWRITE by de
205e0 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65  fault..** Howeve
205f0 72 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69  r, that choice i
20600 73 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20  s controversial 
20610 73 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c  since technicall
20620 79 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  y the underlying
20630 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20  .** file system 
20640 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20  does not always 
20650 70 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66  provide powersaf
20660 65 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28  e overwrites.  (
20670 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
20680 73 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72  s, after a power
20690 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72  -loss event, par
206a0 74 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  ts of the file t
206b0 68 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a  hat were never.*
206c0 2a 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20  * written might 
206d0 65 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74  end up being alt
206e0 65 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c  ered.)  However,
206f0 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69   non-PSOW behavi
20700 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76  or is very,.** v
20710 65 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61  ery rare.  And a
20720 73 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61  sserting PSOW ma
20730 6b 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75  kes a large redu
20740 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f  ction in the amo
20750 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72  unt.** of requir
20760 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e  ed I/O for journ
20770 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c  aling, since a l
20780 6f 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73  ot of padding is
20790 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20   eliminated..** 
207a0 20 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f   Hence, while PO
207b0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
207c0 45 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  E is on by defau
207d0 6c 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66  lt, there is a f
207e0 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61  ile-control.** a
207f0 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
20800 20 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20   it off and URI 
20810 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
20820 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72  available to tur
20830 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  n it off..*/.sta
20840 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69  tic int unixDevi
20850 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
20860 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  s(sqlite3_file *
20870 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  id){.  unixFile 
20880 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  *p = (unixFile*)
20890 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  id;.  int rc = 0
208a0 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54  ;.#ifdef __QNXNT
208b0 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63  O__.  if( p->sec
208c0 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69  torSize==0 ) uni
208d0 78 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b  xSectorSize(id);
208e0 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63  .  rc = p->devic
208f0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
20900 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70  ;.#endif.  if( p
20910 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
20920 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20  IXFILE_PSOW ){. 
20930 20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f     rc |= SQLITE_
20940 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
20950 4f 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20  OVERWRITE;.  }. 
20960 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
20970 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
20980 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20  TE_OMIT_WAL) || 
20990 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
209a0 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65  SIZE>0../*.** Re
209b0 74 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20  turn the system 
209c0 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
209d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
209e0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c  hould not be cal
209f0 6c 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  led directly by 
20a00 6f 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68  other code in th
20a10 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73  is file. .** Ins
20a20 74 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20  tead, it should 
20a30 62 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61  be called via ma
20a40 63 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a  cro osGetpagesiz
20a50 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
20a60 6e 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69  nt unixGetpagesi
20a70 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53  ze(void){.#if OS
20a80 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72  _VXWORKS.  retur
20a90 6e 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65  n 1024;.#elif de
20aa0 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43  fined(_BSD_SOURC
20ab0 45 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70  E).  return getp
20ac0 61 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65  agesize();.#else
20ad0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73  .  return (int)s
20ae0 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53  ysconf(_SC_PAGES
20af0 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  IZE);.#endif.}..
20b00 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
20b10 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
20b20 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
20b30 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f  X_MMAP_SIZE>0 */
20b40 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
20b50 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a  _OMIT_WAL../*.**
20b60 20 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20   Object used to 
20b70 72 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61  represent an sha
20b80 72 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65  red memory buffe
20b90 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  r.  .**.** When 
20ba0 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
20bb0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74   all reference t
20bc0 68 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65  he same wal-inde
20bd0 78 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a  x, each thread.*
20be0 2a 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e  * has its own un
20bf0 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75  ixShm object, bu
20c00 74 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74  t they all point
20c10 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73   to a single ins
20c20 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73  tance.** of this
20c30 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20c40 65 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  ect.  In other w
20c50 6f 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69  ords, each wal-i
20c60 6e 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a  ndex is opened.*
20c70 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20  * only once per 
20c80 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45  process..**.** E
20c90 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ach unixShmNode 
20ca0 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63  object is connec
20cb0 74 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  ted to a single 
20cc0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
20cd0 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c  ject..** We coul
20ce0 64 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20  d coalesce this 
20cf0 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78  object into unix
20d00 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74  InodeInfo, but t
20d10 68 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a  hat would mean.*
20d20 2a 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c  * every open fil
20d30 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
20d40 75 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  use shared memor
20d50 79 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64  y (in other word
20d60 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20  s, most.** open 
20d70 66 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76  files) would hav
20d80 65 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e  e to carry aroun
20d90 64 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66  d this extra inf
20da0 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a  ormation.  So.**
20db0 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
20dc0 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69  fo object contai
20dd0 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
20de0 74 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65  this unixShmNode
20df0 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74   object.** and t
20e00 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
20e10 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64  bject is created
20e20 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65   only when neede
20e30 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74  d..**.** unixMut
20e40 65 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65  exHeld() must be
20e50 20 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74   true when creat
20e60 69 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e  ing or destroyin
20e70 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74  g.** this object
20e80 20 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e   or while readin
20e90 67 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65  g or writing the
20ea0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
20eb0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52  s:.**.**      nR
20ec0 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  ef.**.** The fol
20ed0 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72  lowing fields ar
20ee0 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65  e read-only afte
20ef0 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  r the object is 
20f00 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20  created:.** .** 
20f10 20 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20       fid.**     
20f20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a   zFilename.**.**
20f30 20 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e   Either unixShmN
20f40 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62  ode.mutex must b
20f50 65 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68  e held or unixSh
20f60 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e  mNode.nRef==0 an
20f70 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  d.** unixMutexHe
20f80 6c 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65  ld() is true whe
20f90 6e 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  n reading or wri
20fa0 74 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66  ting any other f
20fb0 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  ield.** in this 
20fc0 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
20fd0 72 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ruct unixShmNode
20fe0 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e   {.  unixInodeIn
20ff0 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20  fo *pInode;     
21000 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  /* unixInodeInfo
21010 20 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20   that owns this 
21020 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71  SHM node */.  sq
21030 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
21040 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65  ex;      /* Mute
21050 78 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73  x to access this
21060 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61   object */.  cha
21070 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20  r *zFilename;   
21080 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
21090 6f 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66  of the mmapped f
210a0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20  ile */.  int h; 
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
210c0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
210d0 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20   descriptor */. 
210e0 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20   int szRegion;  
210f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21100 69 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65  ize of shared-me
21110 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
21120 20 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20    u16 nRegion;  
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21140 53 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70  Size of array ap
21150 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69  Region */.  u8 i
21160 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20  sReadonly;      
21170 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21180 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  f read-only */. 
21190 20 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e   char **apRegion
211a0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
211b0 72 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73  rray of mapped s
211c0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
211d0 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ions */.  int nR
211e0 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
211f0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
21200 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  f unixShm object
21210 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
21220 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  is */.  unixShm 
21230 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20  *pFirst;        
21240 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68     /* All unixSh
21250 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
21260 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69  ng to this */.#i
21270 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21280 47 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b  G.  u8 exclMask;
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
212a0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
212b0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
212c0 2f 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73  /.  u8 sharedMas
212d0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  k;             /
212e0 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64  * Mask of shared
212f0 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20   locks held */. 
21300 20 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20   u8 nextShmId;  
21310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21320 65 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e  ext available un
21330 69 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a  ixShm.id value *
21340 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
21350 2a 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65  ** Structure use
21360 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20  d internally by 
21370 74 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f  this VFS to reco
21380 72 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  rd the state of 
21390 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65  an.** open share
213a0 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74  d memory connect
213b0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
213c0 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
213d0 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  are initialized 
213e0 77 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74  when this object
213f0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a   is created and.
21400 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79  ** are read-only
21410 20 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a   thereafter:.**.
21420 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46  **    unixShm.pF
21430 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68  ile.**    unixSh
21440 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f  m.id.**.** All o
21450 74 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20  ther fields are 
21460 72 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65  read/write.  The
21470 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e   unixShm.pFile->
21480 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
21490 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65  ld.** while acce
214a0 73 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77  ssing any read/w
214b0 72 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a  rite fields..*/.
214c0 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b  struct unixShm {
214d0 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
214e0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a  pShmNode;     /*
214f0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
21500 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
21510 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ct */.  unixShm 
21520 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
21530 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53     /* Next unixS
21540 68 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  hm with the same
21550 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
21560 20 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20    u8 hasMutex;  
21570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21580 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20  True if holding 
21590 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
215a0 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64  mutex */.  u8 id
215b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
215c0 20 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74        /* Id of t
215d0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  his connection w
215e0 69 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68  ithin its unixSh
215f0 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73  mNode */.  u16 s
21600 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
21610 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
21620 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
21630 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c  ld */.  u16 excl
21640 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
21650 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
21660 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
21670 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ld */.};../*.** 
21680 43 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66  Constants used f
21690 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64  or locking.*/.#d
216a0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42  efine UNIX_SHM_B
216b0 41 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54  ASE   ((22+SQLIT
216c0 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20  E_SHM_NLOCK)*4) 
216d0 20 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74          /* first
216e0 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64   lock byte */.#d
216f0 65 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44  efine UNIX_SHM_D
21700 4d 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f  MS    (UNIX_SHM_
21710 42 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  BASE+SQLITE_SHM_
21720 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d  NLOCK)  /* deadm
21730 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a  an switch */../*
21740 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20  .** Apply posix 
21750 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66  advisory locks f
21760 6f 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f  or all bytes fro
21770 6d 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f  m ofst through o
21780 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c  fst+n-1..**.** L
21790 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68  ocks block if th
217a0 65 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c  e mask is exactl
217b0 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64  y UNIX_SHM_C and
217c0 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e   are non-blockin
217d0 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  g.** otherwise..
217e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
217f0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
21800 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
21810 6c 65 2c 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  le,       /* Ope
21820 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  n connection to 
21830 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
21840 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20    int lockType, 
21850 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e           /* F_UN
21860 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72  LCK, F_RDLCK, or
21870 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e   F_WRLCK */.  in
21880 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20  t ofst,         
21890 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79       /* First by
218a0 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e  te of the lockin
218b0 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74  g range */.  int
218c0 20 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20   n              
218d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
218e0 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a   bytes to lock *
218f0 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  /.){.  unixShmNo
21900 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a  de *pShmNode; /*
21910 20 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20   Apply locks to 
21920 74 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64  this open shared
21930 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20  -memory segment 
21940 2a 2f 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  */.  struct floc
21950 6b 20 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  k f;        /* T
21960 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72  he posix advisor
21970 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  y locking struct
21980 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ure */.  int rc 
21990 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
219a0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66  /* Result code f
219b0 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a  orm fcntl() */..
219c0 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74    /* Access to t
219d0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  he unixShmNode o
219e0 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c 69  bject is seriali
219f0 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  zed by the calle
21a00 72 20 2a 2f 0a 20 20 70 53 68 6d 4e 6f 64 65 20  r */.  pShmNode 
21a10 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
21a20 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
21a30 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21a40 65 78 5f 68 65 6c 64 28 70 53 68 6d 4e 6f 64 65  ex_held(pShmNode
21a50 2d 3e 6d 75 74 65 78 29 20 7c 7c 20 70 53 68 6d  ->mutex) || pShm
21a60 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  Node->nRef==0 );
21a70 0a 0a 20 20 2f 2a 20 53 68 61 72 65 64 20 6c 6f  ..  /* Shared lo
21a80 63 6b 73 20 6e 65 76 65 72 20 73 70 61 6e 20 6d  cks never span m
21a90 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 62 79 74  ore than one byt
21aa0 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e  e */.  assert( n
21ab0 3d 3d 31 20 7c 7c 20 6c 6f 63 6b 54 79 70 65 21  ==1 || lockType!
21ac0 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f  =F_RDLCK );..  /
21ad0 2a 20 4c 6f 63 6b 73 20 61 72 65 20 77 69 74 68  * Locks are with
21ae0 69 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 61 73  in range */.  as
21af0 73 65 72 74 28 20 6e 3e 3d 31 20 26 26 20 6e 3c  sert( n>=1 && n<
21b00 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
21b10 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d 4e   );..  if( pShmN
21b20 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
21b30 20 69 6e 74 20 6c 6b 54 79 70 65 3b 0a 20 20 20   int lkType;.   
21b40 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
21b50 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 72 61 6d  he locking param
21b60 65 74 65 72 73 20 2a 2f 0a 20 20 20 20 6d 65 6d  eters */.    mem
21b70 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a 65 6f  set(&f, 0, sizeo
21b80 66 28 66 29 29 3b 0a 20 20 20 20 66 2e 6c 5f 74  f(f));.    f.l_t
21b90 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
21ba0 20 20 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d      f.l_whence =
21bb0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 66   SEEK_SET;.    f
21bc0 2e 6c 5f 73 74 61 72 74 20 3d 20 6f 66 73 74 3b  .l_start = ofst;
21bd0 0a 20 20 20 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e  .    f.l_len = n
21be0 3b 0a 0a 20 20 20 20 6c 6b 54 79 70 65 20 3d 20  ;..    lkType = 
21bf0 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
21c00 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f  s & UNIXFILE_BLO
21c10 43 4b 29 21 3d 30 20 3f 20 46 5f 53 45 54 4c 4b  CK)!=0 ? F_SETLK
21c20 57 20 3a 20 46 5f 53 45 54 4c 4b 3b 0a 20 20 20  W : F_SETLK;.   
21c30 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53   rc = osFcntl(pS
21c40 68 6d 4e 6f 64 65 2d 3e 68 2c 20 6c 6b 54 79 70  hmNode->h, lkTyp
21c50 65 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d  e, &f);.    rc =
21c60 20 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51   (rc!=(-1)) ? SQ
21c70 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
21c80 5f 42 55 53 59 3b 0a 20 20 20 20 70 46 69 6c 65  _BUSY;.    pFile
21c90 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
21ca0 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 3b 0a  UNIXFILE_BLOCK;.
21cb0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
21cc0 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b   the global lock
21cd0 20 73 74 61 74 65 20 61 6e 64 20 64 6f 20 64 65   state and do de
21ce0 62 75 67 20 74 72 61 63 69 6e 67 20 2a 2f 0a 23  bug tracing */.#
21cf0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
21d00 55 47 0a 20 20 7b 20 75 31 36 20 6d 61 73 6b 3b  UG.  { u16 mask;
21d10 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
21d20 2d 4c 4f 43 4b 20 22 29 29 3b 0a 20 20 6d 61 73  -LOCK "));.  mas
21d30 6b 20 3d 20 6f 66 73 74 3e 33 31 20 3f 20 30 78  k = ofst>31 ? 0x
21d40 66 66 66 66 20 3a 20 28 31 3c 3c 28 6f 66 73 74  ffff : (1<<(ofst
21d50 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29  +n)) - (1<<ofst)
21d60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
21d70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
21d80 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c   lockType==F_UNL
21d90 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
21da0 41 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20  ACE(("unlock %d 
21db0 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ok", ofst));.   
21dc0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63     pShmNode->exc
21dd0 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  lMask &= ~mask;.
21de0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
21df0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
21e00 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ask;.    }else i
21e10 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52  f( lockType==F_R
21e20 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53  DLCK ){.      OS
21e30 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63  TRACE(("read-loc
21e40 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
21e50 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21e60 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d  ->exclMask &= ~m
21e70 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  ask;.      pShmN
21e80 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  ode->sharedMask 
21e90 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 65 6c  |= mask;.    }el
21ea0 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
21eb0 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52  ( lockType==F_WR
21ec0 4c 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54  LCK );.      OST
21ed0 52 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63  RACE(("write-loc
21ee0 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29 29  k %d ok", ofst))
21ef0 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  ;.      pShmNode
21f00 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61  ->exclMask |= ma
21f10 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  sk;.      pShmNo
21f20 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  de->sharedMask &
21f30 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  = ~mask;.    }. 
21f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
21f50 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
21f60 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
21f70 43 45 28 28 22 75 6e 6c 6f 63 6b 20 25 64 20 66  CE(("unlock %d f
21f80 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a  ailed", ofst));.
21f90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f      }else if( lo
21fa0 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20  ckType==F_RDLCK 
21fb0 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  ){.      OSTRACE
21fc0 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 66 61 69  (("read-lock fai
21fd0 6c 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73  led"));.    }els
21fe0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
21ff0 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c   lockType==F_WRL
22000 43 4b 20 29 3b 0a 20 20 20 20 20 20 4f 53 54 52  CK );.      OSTR
22010 41 43 45 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b  ACE(("write-lock
22020 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66 73   %d failed", ofs
22030 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  t));.    }.  }. 
22040 20 4f 53 54 52 41 43 45 28 28 22 20 2d 20 61 66   OSTRACE((" - af
22050 74 65 72 77 61 72 64 73 20 25 30 33 78 2c 25 30  terwards %03x,%0
22060 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
22070 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
22080 65 64 4d 61 73 6b 2c 20 70 53 68 6d 4e 6f 64 65  edMask, pShmNode
22090 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
220a0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
220b0 72 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d  rn rc;        .}
220c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
220d0 68 65 20 6d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65  he minimum numbe
220e0 72 20 6f 66 20 33 32 4b 42 20 73 68 6d 20 72 65  r of 32KB shm re
220f0 67 69 6f 6e 73 20 74 68 61 74 20 73 68 6f 75 6c  gions that shoul
22100 64 20 62 65 20 6d 61 70 70 65 64 20 61 74 0a 2a  d be mapped at.*
22110 2a 20 61 20 74 69 6d 65 2c 20 61 73 73 75 6d 69  * a time, assumi
22120 6e 67 20 74 68 61 74 20 65 61 63 68 20 6d 61 70  ng that each map
22130 70 69 6e 67 20 6d 75 73 74 20 62 65 20 61 6e 20  ping must be an 
22140 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c 65  integer multiple
22150 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   of the.** curre
22160 6e 74 20 73 79 73 74 65 6d 20 70 61 67 65 2d 73  nt system page-s
22170 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c  ize..**.** Usual
22180 6c 79 2c 20 74 68 69 73 20 69 73 20 31 2e 20 54  ly, this is 1. T
22190 68 65 20 65 78 63 65 70 74 69 6f 6e 20 73 65 65  he exception see
221a0 6d 73 20 74 6f 20 62 65 20 73 79 73 74 65 6d 73  ms to be systems
221b0 20 74 68 61 74 20 61 72 65 20 63 6f 6e 66 69 67   that are config
221c0 75 72 65 64 0a 2a 2a 20 74 6f 20 75 73 65 20 36  ured.** to use 6
221d0 34 4b 42 20 70 61 67 65 73 20 2d 20 69 6e 20 74  4KB pages - in t
221e0 68 69 73 20 63 61 73 65 20 65 61 63 68 20 6d 61  his case each ma
221f0 70 70 69 6e 67 20 6d 75 73 74 20 63 6f 76 65 72  pping must cover
22200 20 61 74 20 6c 65 61 73 74 20 74 77 6f 0a 2a 2a   at least two.**
22210 20 73 68 6d 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f   shm regions..*/
22220 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
22230 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
22240 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 73 68 6d  void){.  int shm
22250 73 7a 20 3d 20 33 32 2a 31 30 32 34 3b 20 20 20  sz = 32*1024;   
22260 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 4d 20           /* SHM 
22270 72 65 67 69 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20  region size */. 
22280 20 69 6e 74 20 70 67 73 7a 20 3d 20 6f 73 47 65   int pgsz = osGe
22290 74 70 61 67 65 73 69 7a 65 28 29 3b 20 20 20 2f  tpagesize();   /
222a0 2a 20 53 79 73 74 65 6d 20 70 61 67 65 20 73 69  * System page si
222b0 7a 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ze */.  assert( 
222c0 28 28 70 67 73 7a 2d 31 29 26 70 67 73 7a 29 3d  ((pgsz-1)&pgsz)=
222d0 3d 30 20 29 3b 20 20 20 2f 2a 20 50 61 67 65 20  =0 );   /* Page 
222e0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70  size must be a p
222f0 6f 77 65 72 20 6f 66 20 32 20 2a 2f 0a 20 20 69  ower of 2 */.  i
22300 66 28 20 70 67 73 7a 3c 73 68 6d 73 7a 20 29 20  f( pgsz<shmsz ) 
22310 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
22320 72 6e 20 70 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d  rn pgsz/shmsz;.}
22330 0a 0a 2f 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68  ../*.** Purge th
22340 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 4c 69 73  e unixShmNodeLis
22350 74 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e  t list of all en
22360 74 72 69 65 73 20 77 69 74 68 20 75 6e 69 78 53  tries with unixS
22370 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a  hmNode.nRef==0..
22380 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f  **.** This is no
22390 74 20 61 20 56 46 53 20 73 68 61 72 65 64 2d 6d  t a VFS shared-m
223a0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 3b 20 69 74  emory method; it
223b0 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66 75   is a utility fu
223c0 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a  nction called.**
223d0 20 62 79 20 56 46 53 20 73 68 61 72 65 64 2d 6d   by VFS shared-m
223e0 65 6d 6f 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a  emory methods..*
223f0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
22400 69 78 53 68 6d 50 75 72 67 65 28 75 6e 69 78 46  ixShmPurge(unixF
22410 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 75 6e 69  ile *pFd){.  uni
22420 78 53 68 6d 4e 6f 64 65 20 2a 70 20 3d 20 70 46  xShmNode *p = pF
22430 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
22440 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
22450 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
22460 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
22470 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 69  nRef==0 ){.    i
22480 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20  nt nShmPerMap = 
22490 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
224a0 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74 20 69  Map();.    int i
224b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
224c0 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e 70 49  >pInode==pFd->pI
224d0 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71 6c 69  node );.    sqli
224e0 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
224f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 66 6f  ->mutex);.    fo
22500 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52 65 67  r(i=0; i<p->nReg
22510 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65 72 4d  ion; i+=nShmPerM
22520 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ap){.      if( p
22530 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
22540 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e 61 70    osMunmap(p->ap
22550 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a  Region[i], p->sz
22560 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
22570 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
22580 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
22590 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20  Region[i]);.    
225a0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
225b0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 70  lite3_free(p->ap
225c0 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69 66 28  Region);.    if(
225d0 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
225e0 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
225f0 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  Fd, p->h, __LINE
22600 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e 68 20  __);.      p->h 
22610 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  = -1;.    }.    
22620 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  p->pInode->pShmN
22630 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ode = 0;.    sql
22640 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
22650 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  }.}../*.** Open 
22660 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
22670 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
22680 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61  with open databa
22690 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20  se file pDbFd.  
226a0 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75  .** This particu
226b0 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
226c0 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20  on uses mmapped 
226d0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
226e0 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d   file used to im
226f0 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d  plement shared-m
22700 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20  emory is in the 
22710 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a  same directory.*
22720 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  * as the open da
22730 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
22740 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
22750 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  e as the open da
22760 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
22770 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73  ith the "-shm" s
22780 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f  uffix added.  Fo
22790 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
227a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
227b0 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65  ** is "/home/use
227c0 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68  r1/config.db" th
227d0 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  en the file that
227e0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
227f0 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73  mmapped.** for s
22800 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
22810 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f  l be called "/ho
22820 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
22830 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a  db-shm".  .**.**
22840 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63   Another approac
22850 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66  h to is to use f
22860 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d  iles in /dev/shm
22870 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20   or /dev/tmp or 
22880 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  an.** some other
22890 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75   tmpfs mount. Bu
228a0 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61  t if a file in a
228b0 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63   different direc
228c0 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  tory.** from the
228d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
228e0 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66  s used, then dif
228f0 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65  fering access pe
22900 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20  rmissions.** or 
22910 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74  a chroot() might
22920 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65   cause two diffe
22930 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f  rent processes o
22940 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61  n the same.** da
22950 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
22960 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
22970 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65   files for share
22980 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d  d memory - .** m
22990 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
229a0 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
229b0 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
229c0 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a  red - resulting.
229d0 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  ** in database c
229e0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65  orruption.  Neve
229f0 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74  rtheless, this t
22a00 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a  mpfs file usage.
22a10 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65  ** can be enable
22a20 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
22a30 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
22a40 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22  _SHM_DIRECTORY="
22a50 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20  /dev/shm".** or 
22a60 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  the equivalent. 
22a70 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   The use of the 
22a80 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
22a90 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
22aa0 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75  e.** option resu
22ab0 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  lts in an incomp
22ac0 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  atible build of 
22ad0 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20  SQLite;  builds 
22ae0 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61  of SQLite.** tha
22af0 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67  t with differing
22b00 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
22b10 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61  CTORY settings a
22b20 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
22b30 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61  e.** same databa
22b40 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
22b50 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61  ame time, databa
22b60 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  se corruption wi
22b70 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
22b80 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f  ult. The SQLITE_
22b90 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
22ba0 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
22bb0 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  n is considered.
22bc0 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22  ** "unsupported"
22bd0 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79   and may go away
22be0 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c   in a future SQL
22bf0 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a  ite release..**.
22c00 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
22c10 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
22c20 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
22c30 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
22c40 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
22c50 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
22c60 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
22c70 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
22c80 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
22c90 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
22ca0 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
22cb0 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
22cc0 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
22cd0 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  cleared..**.** I
22ce0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
22cf0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44  atabase file (pD
22d00 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68  bFd) is using th
22d10 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46  e "unix-excl" VF
22d20 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  S.** that means 
22d30 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76  that an exclusiv
22d40 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
22d50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22d60 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20  ile and.** that 
22d70 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
22d80 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  es are able to r
22d90 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
22da0 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a   database.  In.*
22db0 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20  * that case, we 
22dc0 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65  do not really ne
22dd0 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ed shared memory
22de0 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d  .  No shared mem
22df0 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63  ory.** file is c
22e00 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61  reated.  The sha
22e10 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
22e20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74  be simulated wit
22e30 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a  h heap memory..*
22e40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22e50 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
22e60 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
22e70 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
22e80 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
22e90 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
22ea0 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
22eb0 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
22ec0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
22ed0 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
22ee0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
22ef0 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
22f00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22f20 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
22f30 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
22f40 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
22f50 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
22f60 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
22f70 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  zShmFilename;   
22f80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
22f90 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73  e of the file us
22fa0 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20  ed for SHM */.  
22fb0 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  int nShmFilename
22fc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
22fd0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53  /* Size of the S
22fe0 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62  HM filename in b
22ff0 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
23000 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
23010 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d   the new unixShm
23020 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20   object. */.  p 
23030 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
23040 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  64( sizeof(*p) )
23050 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
23060 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
23070 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
23080 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
23090 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
230a0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
230b0 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
230c0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
230d0 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
230e0 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
230f0 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
23100 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
23110 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
23120 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
23130 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
23140 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
23150 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
23160 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
23170 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
23180 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
23190 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
231a0 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
231b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
231c0 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
231d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
231e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53  #ifndef SQLITE_S
231f0 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20  HM_DIRECTORY.   
23200 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61   const char *zBa
23210 73 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e  sePath = pDbFd->
23220 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20  zPath;.#endif.. 
23230 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74     /* Call fstat
23240 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  () to figure out
23250 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
23260 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
23270 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a   file. If.    **
23280 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c   a new *-shm fil
23290 65 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e  e is created, an
232a0 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65   attempt will be
232b0 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20   made to create 
232c0 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74  it.    ** with t
232d0 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69  he same permissi
232e0 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
232f0 69 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46  if( osFstat(pDbF
23300 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26  d->h, &sStat) &&
23310 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
23320 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
23330 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
23340 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
23350 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
23360 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  rr;.    }..#ifde
23370 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  f SQLITE_SHM_DIR
23380 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46  ECTORY.    nShmF
23390 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66  ilename = sizeof
233a0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45  (SQLITE_SHM_DIRE
233b0 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c  CTORY) + 31;.#el
233c0 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  se.    nShmFilen
233d0 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73  ame = 6 + (int)s
233e0 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29  trlen(zBasePath)
233f0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68  ;.#endif.    pSh
23400 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  mNode = sqlite3_
23410 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
23420 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53  (*pShmNode) + nS
23430 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20  hmFilename );.  
23440 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d    if( pShmNode==
23450 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23460 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23470 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
23480 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20  n_err;.    }.   
23490 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65   memset(pShmNode
234a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68  , 0, sizeof(*pSh
234b0 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e  mNode)+nShmFilen
234c0 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69  ame);.    zShmFi
234d0 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64  lename = pShmNod
234e0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
234f0 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
23500 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
23510 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
23520 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
23530 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
23540 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  e, zShmFilename,
23550 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
23560 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48         SQLITE_SH
23570 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71  M_DIRECTORY "/sq
23580 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c  lite-shm-%x-%x",
23590 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
235a0 20 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74        (u32)sStat
235b0 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53  .st_ino, (u32)sS
235c0 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c  tat.st_dev);.#el
235d0 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  se.    sqlite3_s
235e0 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65  nprintf(nShmFile
235f0 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  name, zShmFilena
23600 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42  me, "%s-shm", zB
23610 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71  asePath);.    sq
23620 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
23630 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a  (pDbFd->zPath, z
23640 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65  ShmFilename);.#e
23650 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
23660 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70  e->h = -1;.    p
23670 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
23680 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64  hmNode = pShmNod
23690 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
236a0 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d  >pInode = pDbFd-
236b0 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68  >pInode;.    pSh
236c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73  mNode->mutex = s
236d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
236e0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
236f0 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70  FAST);.    if( p
23700 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d  ShmNode->mutex==
23710 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
23720 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
23730 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
23740 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  n_err;.    }..  
23750 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
23760 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
23770 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46  .      int openF
23780 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20  lags = O_RDWR | 
23790 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69  O_CREAT;.      i
237a0 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62  f( sqlite3_uri_b
237b0 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50  oolean(pDbFd->zP
237c0 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73  ath, "readonly_s
237d0 68 6d 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  hm", 0) ){.     
237e0 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
237f0 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
23800 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
23810 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
23820 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
23830 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70  e->h = robust_op
23840 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
23850 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74   openFlags, (sSt
23860 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
23870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
23880 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
23890 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
238a0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
238b0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
238c0 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
238d0 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
238e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
238f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
23900 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
23910 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
23920 72 6f 6f 74 2c 20 6d 61 6b 65 20 73 75 72 65 20  root, make sure 
23930 74 68 61 74 20 74 68 65 20 53 48 4d 20 66 69 6c  that the SHM fil
23940 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6f 77  e.      ** is ow
23950 6e 65 64 20 62 79 20 74 68 65 20 73 61 6d 65 20  ned by the same 
23960 75 73 65 72 20 74 68 61 74 20 6f 77 6e 73 20 74  user that owns t
23970 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
23980 62 61 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65  base.  Otherwise
23990 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f  ,.      ** the o
239a0 72 69 67 69 6e 61 6c 20 6f 77 6e 65 72 20 77 69  riginal owner wi
239b0 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20 74  ll not be able t
239c0 6f 20 63 6f 6e 6e 65 63 74 2e 0a 20 20 20 20 20  o connect..     
239d0 20 2a 2f 0a 20 20 20 20 20 20 6f 73 46 63 68 6f   */.      osFcho
239e0 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
239f0 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
23a00 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
23a10 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
23a20 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
23a30 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
23a40 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
23a50 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
23a60 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
23a70 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
23a80 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
23a90 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23aa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23ab0 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
23ac0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
23ad0 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
23ae0 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
23af0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
23b00 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
23b10 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
23b20 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
23b30 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
23b40 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
23b50 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
23b60 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
23b70 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
23b80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23b90 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23ba0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
23bb0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
23bc0 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
23bd0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
23be0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23bf0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
23c00 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
23c10 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
23c20 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
23c30 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
23c40 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
23c50 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
23c60 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
23c70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
23c80 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
23c90 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
23ca0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
23cb0 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
23cc0 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
23cd0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23ce0 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
23cf0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
23d00 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
23d10 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
23d20 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
23d30 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
23d40 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
23d50 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
23d60 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
23d70 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
23d80 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
23d90 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
23da0 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
23db0 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
23dc0 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
23dd0 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
23de0 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
23df0 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
23e00 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
23e10 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
23e20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
23e30 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
23e40 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
23e50 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
23e60 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
23e70 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23e80 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23e90 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
23ea0 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
23eb0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
23ec0 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
23ed0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23ee0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
23ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23f00 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
23f10 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
23f20 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
23f30 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
23f40 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
23f50 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
23f60 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
23f70 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
23f80 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
23f90 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
23fa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23fb0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23fc0 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
23fd0 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23fe0 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
23ff0 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
24000 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
24010 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
24020 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
24030 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
24040 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
24050 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
24060 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
24070 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
24080 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
24090 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
240a0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
240b0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
240c0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
240d0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
240e0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
240f0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
24100 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
24110 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
24120 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
24130 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
24140 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
24150 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
24160 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
24170 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
24180 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
24190 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
241a0 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
241b0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
241c0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
241d0 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
241e0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
241f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
24200 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
24210 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
24220 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
24230 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
24240 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
24250 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
24260 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
24270 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
24280 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
24290 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
242a0 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
242b0 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
242c0 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
242d0 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
242e0 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
242f0 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
24300 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
24310 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
24320 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
24330 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
24340 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
24350 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
24360 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
24370 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
24380 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
24390 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
243a0 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
243b0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
243c0 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
243d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
243e0 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
243f0 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
24400 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
24410 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
24420 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
24430 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
24440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24450 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
24460 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
24470 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
24480 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
24490 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
244a0 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
244b0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
244c0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
244d0 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
244e0 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
244f0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
24500 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
24510 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
24520 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
24530 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
24540 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
24550 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
24560 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
24570 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
24580 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
24590 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
245a0 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
245b0 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
245c0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
245d0 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
245e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
245f0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
24600 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
24610 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
24620 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
24630 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
24640 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
24650 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
24660 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
24670 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
24680 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
24690 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
246a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
246b0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
246c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
246d0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
246e0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
246f0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
24700 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
24710 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
24720 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
24730 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
24740 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
24750 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
24760 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
24770 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
24780 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
24790 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
247a0 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
247b0 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
247c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
247d0 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
247e0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
247f0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
24800 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
24810 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
24820 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
24830 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
24840 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
24850 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
24860 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
24870 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
24880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24890 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
248a0 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
248b0 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
248c0 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
248d0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
248e0 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
248f0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
24900 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
24910 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
24920 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
24930 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
24940 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
24950 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
24960 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
24970 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
24980 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
24990 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
249a0 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
249b0 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
249c0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
249d0 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
249e0 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
249f0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24a00 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
24a10 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
24a20 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
24a30 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
24a40 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
24a50 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
24a60 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
24a70 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
24a80 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
24a90 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
24aa0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
24ab0 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
24ac0 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
24ad0 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
24ae0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24af0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24b00 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
24b10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
24b20 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
24b30 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
24b40 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
24b50 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
24b60 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
24b70 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
24b80 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
24b90 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
24ba0 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
24bb0 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
24bc0 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
24bd0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
24be0 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
24bf0 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
24c00 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
24c10 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
24c20 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
24c30 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
24c40 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
24c50 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
24c60 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
24c70 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
24c80 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
24c90 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
24ca0 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
24cb0 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
24cc0 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
24cd0 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
24ce0 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
24cf0 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
24d00 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
24d10 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
24d20 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
24d30 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
24d40 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
24d50 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
24d60 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
24d70 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
24d80 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
24d90 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
24da0 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
24db0 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
24dc0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
24dd0 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
24de0 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
24df0 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
24e00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
24e10 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64  ( seekAndWriteFd
24e20 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50  (pShmNode->h, iP
24e30 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c  g*pgsz + pgsz-1,
24e40 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b   "", 1, 0)!=1 ){
24e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
24e60 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
24e70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
24e80 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  lename;.        
24e90 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24ea0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
24eb0 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77  OERR_SHMSIZE, "w
24ec0 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  rite", zFile);. 
24ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74               got
24ee0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
24ef0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
24f00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24f10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
24f20 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65  ..    /* Map the
24f30 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72   requested memor
24f40 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68  y region into th
24f50 69 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64  is processes add
24f60 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20  ress space. */. 
24f70 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72     apNew = (char
24f80 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c   **)sqlite3_real
24f90 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68  loc(.        pSh
24fa0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c  mNode->apRegion,
24fb0 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65   nReqRegion*size
24fc0 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29  of(char *).    )
24fd0 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77  ;.    if( !apNew
24fe0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
24ff0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
25000 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  M;.      goto sh
25010 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  mpage_out;.    }
25020 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61  .    pShmNode->a
25030 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b  pRegion = apNew;
25040 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d  .    while( pShm
25050 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
25060 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
25070 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52    int nMap = szR
25080 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70  egion*nShmPerMap
25090 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
250a0 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b       void *pMem;
250b0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
250c0 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
250d0 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d       pMem = osMm
250e0 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20  ap(0, nMap,.    
250f0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
25100 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50  ->isReadonly ? P
25110 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f  ROT_READ : PROT_
25120 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c  READ|PROT_WRITE,
25130 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41   .            MA
25140 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f  P_SHARED, pShmNo
25150 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a  de->h, szRegion*
25160 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e  (i64)pShmNode->n
25170 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29  Region.        )
25180 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d  ;.        if( pM
25190 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  em==MAP_FAILED )
251a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
251b0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
251c0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41  LITE_IOERR_SHMMA
251d0 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e  P, "mmap", pShmN
251e0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
251f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
25200 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
25210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
25220 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d  se{.        pMem
25230 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
25240 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20  c64(szRegion);. 
25250 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d         if( pMem=
25260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
25270 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
25280 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  M;.          got
25290 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
252a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
252b0 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c   memset(pMem, 0,
252c0 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20   szRegion);.    
252d0 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 69    }..      for(i
252e0 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70  =0; i<nShmPerMap
252f0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
25300 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
25310 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  on[pShmNode->nRe
25320 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61  gion+i] = &((cha
25330 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f  r*)pMem)[szRegio
25340 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n*i];.      }.  
25350 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52      pShmNode->nR
25360 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72  egion += nShmPer
25370 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Map;.    }.  }..
25380 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69  shmpage_out:.  i
25390 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
253a0 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a  gion>iRegion ){.
253b0 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f      *pp = pShmNo
253c0 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65  de->apRegion[iRe
253d0 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gion];.  }else{.
253e0 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d      *pp = 0;.  }
253f0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
25400 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20 72  >isReadonly && r
25410 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
25420 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
25430 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  NLY;.  sqlite3_m
25440 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
25450 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
25460 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25470 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 6f  ** Change the lo
25480 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20 73  ck state for a s
25490 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67  hared-memory seg
254a0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ment..**.** Note
254b0 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74 69   that the relati
254c0 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 53  onship between S
254d0 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55 53  HAREd and EXCLUS
254e0 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c  IVE locks is a l
254f0 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65  ittle.** differe
25500 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e 20  nt here than in 
25510 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c  posix.  In xShmL
25520 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67  ock(), one can g
25530 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a  o from unlocked.
25540 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e 64  ** to shared and
25550 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e   back or from un
25560 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75 73  locked to exclus
25570 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20 42  ive and back.  B
25580 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f  ut one may.** no
25590 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65 64  t go from shared
255a0 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f 72   to exclusive or
255b0 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65 20   from exclusive 
255c0 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74  to shared..*/.st
255d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
255e0 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f  Lock(.  sqlite3_
255f0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
25600 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
25610 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20  ile holding the 
25620 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
25630 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20 20  .  int ofst,    
25640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25650 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61   First lock to a
25660 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73  cquire or releas
25670 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20  e */.  int n,   
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
256a0 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65 20  ocks to acquire 
256b0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
256c0 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
256d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68             /* Wh
256e0 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74 68  at to do with th
256f0 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  e lock */.){.  u
25700 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
25710 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20   (unixFile*)fd; 
25720 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
25730 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72 65  on holding share
25740 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e  d memory */.  un
25750 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
25760 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20 20  ->pShm;         
25770 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72 65      /* The share
25780 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c  d memory being l
25790 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53  ocked */.  unixS
257a0 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20 20  hm *pX;         
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
257d0 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67  over all sibling
257e0 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  s */.  unixShmNo
257f0 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
25800 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20  ->pShmNode;  /* 
25810 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 66  The underlying f
25820 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69  ile iNode */.  i
25830 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
25840 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
25850 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
25860 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73  ode */.  u16 mas
25870 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25890 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
258a0 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65 61  to take or relea
258b0 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
258c0 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
258d0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
258e0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
258f0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
25900 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
25910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 73  );.  assert( ofs
25920 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d  t>=0 && ofst+n<=
25930 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
25940 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   );.  assert( n>
25950 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
25960 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
25970 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
25980 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
25990 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
259a0 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c  QLITE_SHM_LOCK |
259b0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c   SQLITE_SHM_EXCL
259c0 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c 7c  USIVE).       ||
259d0 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
259e0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c  SHM_UNLOCK | SQL
259f0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a  ITE_SHM_SHARED).
25a00 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
25a10 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
25a20 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
25a30 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a 20  _EXCLUSIVE) );. 
25a40 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
25a50 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
25a60 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 21  _SHM_EXCLUSIVE)!
25a70 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
25a80 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
25a90 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
25aa0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
25ab0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
25ac0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
25ad0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
25ae0 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
25af0 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28  ..  mask = (1<<(
25b00 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f  ofst+n)) - (1<<o
25b10 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28 20  fst);.  assert( 
25b20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c  n>1 || mask==(1<
25b30 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c 69  <ofst) );.  sqli
25b40 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
25b50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
25b60 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
25b70 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
25b80 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  K ){.    u16 all
25b90 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73  Mask = 0; /* Mas
25ba0 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  k of locks held 
25bb0 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a  by siblings */..
25bc0 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61 6e      /* See if an
25bd0 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20  y siblings hold 
25be0 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a  this same lock *
25bf0 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
25c00 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
25c10 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
25c20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d 3d  {.      if( pX==
25c30 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  p ) continue;.  
25c40 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58 2d      assert( (pX-
25c50 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e  >exclMask & (p->
25c60 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72  exclMask|p->shar
25c70 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20  edMask))==0 );. 
25c80 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20       allMask |= 
25c90 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a  pX->sharedMask;.
25ca0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
25cb0 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d  lock the system-
25cc0 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  level locks */. 
25cd0 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20 61     if( (mask & a
25ce0 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  llMask)==0 ){.  
25cf0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
25d00 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
25d10 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b  , F_UNLCK, ofst+
25d20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
25d30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
25d40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
25d50 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
25d60 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c  * Undo the local
25d70 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
25d80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
25d90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78 63 6c  ){.      p->excl
25da0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
25db0 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d 61       p->sharedMa
25dc0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
25dd0 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   } .  }else if( 
25de0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25df0 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  HM_SHARED ){.   
25e00 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64 20 3d   u16 allShared =
25e10 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66   0;  /* Union of
25e20 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63   locks held by c
25e30 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72  onnections other
25e40 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20   than "p" */..  
25e50 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20 77 68    /* Find out wh
25e60 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  ich shared locks
25e70 20 61 72 65 20 61 6c 72 65 61 64 79 20 68 65 6c   are already hel
25e80 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e  d by sibling con
25e90 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a  nections..    **
25ea0 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 20   If any sibling 
25eb0 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 6e  already holds an
25ec0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c   exclusive lock,
25ed0 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 72 65   go ahead and re
25ee0 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49  turn.    ** SQLI
25ef0 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a  TE_BUSY..    */.
25f00 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e      for(pX=pShmN
25f10 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b  ode->pFirst; pX;
25f20 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a   pX=pX->pNext){.
25f30 20 20 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65        if( (pX->e
25f40 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21  xclMask & mask)!
25f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
25f60 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
25f70 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
25f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c       }.      all
25f90 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68  Shared |= pX->sh
25fa0 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a  aredMask;.    }.
25fb0 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68 61 72  .    /* Get shar
25fc0 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20  ed locks at the 
25fd0 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66  system level, if
25fe0 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20   necessary */.  
25ff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
26000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
26010 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20 6d 61   (allShared & ma
26020 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)==0 ){.      
26030 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
26040 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20  stemLock(pDbFd, 
26050 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e  F_RDLCK, ofst+UN
26060 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b  IX_SHM_BASE, n);
26070 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26080 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
26090 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
260a0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
260b0 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64  the local shared
260c0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66   locks */.    if
260d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
260e0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  ){.      p->shar
260f0 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
26100 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
26110 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
26120 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65  no sibling conne
26130 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b  ctions hold lock
26140 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63  s that will bloc
26150 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f  k this.    ** lo
26160 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20  ck.  If any do, 
26170 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
26180 53 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20  SY right away.. 
26190 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58     */.    for(pX
261a0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
261b0 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
261c0 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
261d0 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
261e0 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d  mask)!=0 || (pX-
261f0 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
26200 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
26210 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
26220 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
26230 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
26240 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74  .  .    /* Get t
26250 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  he exclusive loc
26260 6b 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d  ks at the system
26270 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66   level.  Then if
26280 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20   successful.    
26290 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65  ** also mark the
262a0 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f   local connectio
262b0 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65  n as being locke
262c0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
262d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
262e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
262f0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
26300 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20  pDbFd, F_WRLCK, 
26310 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
26320 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 69 66  SE, n);.      if
26330 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
26340 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
26350 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d 61 73  t( (p->sharedMas
26360 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a  k & mask)==0 );.
26370 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d          p->exclM
26380 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
26390 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
263a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
263b0 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
263c0 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41 43 45  utex);.  OSTRACE
263d0 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69  (("SHM-LOCK shmi
263e0 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67 6f 74  d-%d, pid-%d got
263f0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
26400 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c            p->id,
26410 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20 70 2d   osGetpid(0), p-
26420 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e  >sharedMask, p->
26430 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65  exclMask));.  re
26440 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
26450 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65  * Implement a me
26460 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20  mory barrier or 
26470 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20  memory fence on 
26480 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20  shared memory.  
26490 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73  .**.** All loads
264a0 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75   and stores begu
264b0 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72  n before the bar
264c0 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65  rier must comple
264d0 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79  te before.** any
264e0 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62   load or store b
264f0 65 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62  egun after the b
26500 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  arrier..*/.stati
26510 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61  c void unixShmBa
26520 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33  rrier(.  sqlite3
26530 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20  _file *fd       
26540 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
26550 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e  base file holdin
26560 67 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d  g the shared mem
26570 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53  ory */.){.  UNUS
26580 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29  ED_PARAMETER(fd)
26590 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d 6f 72  ;.  sqlite3Memor
265a0 79 42 61 72 72 69 65 72 28 29 3b 20 20 20 20 20  yBarrier();     
265b0 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65 72 2d      /* compiler-
265c0 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79 20 62  defined memory b
265d0 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e 69 78  arrier */.  unix
265e0 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 20 20  EnterMutex();   
265f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
26600 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72 20 72  lso mutex, for r
26610 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20 20 75  edundancy */.  u
26620 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
26630 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
26640 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
26650 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
26660 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
26670 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
26680 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
26690 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
266a0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
266b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
266c0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
266d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
266e0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
266f0 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
26700 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
26710 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
26720 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
26730 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
26740 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
26750 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
26760 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
26770 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
26780 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
26790 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
267a0 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
267b0 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
267d0 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
267e0 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
267f0 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
26800 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
26810 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
26820 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
26830 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
26840 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
26850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26860 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
26870 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
26880 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
26890 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
268a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
268b0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
268c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
268d0 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
268e0 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
268f0 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
26900 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
26910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
26920 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
26930 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
26940 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
26950 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
26960 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
26970 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
26980 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
26990 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
269a0 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
269b0 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
269c0 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
269d0 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
269e0 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
269f0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
26a00 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
26a10 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
26a20 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
26a30 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
26a40 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
26a50 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
26a60 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
26a70 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
26a80 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
26a90 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
26aa0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
26ab0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
26ac0 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
26ad0 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
26ae0 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
26af0 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
26b00 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
26b10 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
26b20 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
26b30 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
26b40 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
26b50 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
26b60 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
26b70 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
26b80 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
26b90 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
26ba0 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
26bb0 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c  0 ){.      osUnl
26bc0 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46  ink(pShmNode->zF
26bd0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
26be0 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
26bf0 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
26c00 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
26c10 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
26c20 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
26c30 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
26c40 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
26c50 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
26c60 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
26c70 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
26c80 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
26c90 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
26ca0 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
26cb0 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
26cc0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
26cd0 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20 49  P_SIZE>0./*.** I
26ce0 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
26cf0 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64 2c  y memory mapped,
26d00 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64 2e   unmap file pFd.
26d10 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
26d20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e  unixUnmapfile(un
26d30 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20  ixFile *pFd){.  
26d40 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
26d50 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69  tchOut==0 );.  i
26d60 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  f( pFd->pMapRegi
26d70 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e 6d  on ){.    osMunm
26d80 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67 69  ap(pFd->pMapRegi
26d90 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  on, pFd->mmapSiz
26da0 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70 46  eActual);.    pF
26db0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
26dc0 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70  0;.    pFd->mmap
26dd0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 46  Size = 0;.    pF
26de0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
26df0 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  l = 0;.  }.}../*
26e00 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
26e10 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
26e20 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e  he memory mappin
26e30 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79 20  g maintained by 
26e40 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
26e50 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77 20  tor pFd to nNew 
26e60 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73 74  bytes. Any exist
26e70 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 64  ing mapping is d
26e80 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  iscarded..**.** 
26e90 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
26ea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
26eb0 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
26ec0 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a  variables:.**.**
26ed0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
26ee0 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20 20  pMapRegion.**   
26ef0 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
26f00 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 75  pSize.**       u
26f10 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65  nixFile.mmapSize
26f20 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66 20  Actual.**.** If 
26f30 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e  unsuccessful, an
26f40 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
26f50 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71 6c  s logged via sql
26f60 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a 2a  ite3_log() and.*
26f70 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72 69  * the three vari
26f80 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65 20  ables above are 
26f90 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73 20  zeroed. In this 
26fa0 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f 75  case SQLite shou
26fb0 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20 61  ld.** continue a
26fc0 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61 74  ccessing the dat
26fd0 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65 20  abase using the 
26fe0 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72 69  xRead() and xWri
26ff0 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73 2e  te().** methods.
27000 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
27010 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a 20  unixRemapfile(. 
27020 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20   unixFile *pFd, 
27030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27040 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
27050 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  tor object */.  
27060 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20 20  i64 nNew        
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27080 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70 70  /* Required mapp
27090 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a 20  ing size */.){. 
270a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
270b0 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69 6e  r = "mmap";.  in
270c0 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20 20  t h = pFd->h;   
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
270f0 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64 62  iptor open on db
27100 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 70   file */.  u8 *p
27110 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46 64  Orig = (u8 *)pFd
27120 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20  ->pMapRegion;   
27130 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75  /* Pointer to cu
27140 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70 69  rrent file mappi
27150 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72 69  ng */.  i64 nOri
27160 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  g = pFd->mmapSiz
27170 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a 20  eActual;     /* 
27180 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72 65  Size of pOrig re
27190 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  gion in bytes */
271a0 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30 3b  .  u8 *pNew = 0;
271b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
271c0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 74          /* Locat
271d0 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70 69  ion of new mappi
271e0 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ng */.  int flag
271f0 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20 20  s = PROT_READ;  
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27210 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
27220 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61 73   mmap() */..  as
27230 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
27240 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73  hOut==0 );.  ass
27250 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e 6d  ert( nNew>pFd->m
27260 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
27270 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d 3e  ert( nNew<=pFd->
27280 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a 20  mmapSizeMax );. 
27290 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
272a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  );.  assert( pFd
272b0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
272c0 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  >=pFd->mmapSize 
272d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41 50  );.  assert( MAP
272e0 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a 20  _FAILED!=0 );.. 
272f0 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
27300 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
27310 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
27320 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
27330 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20 29  ;..  if( pOrig )
27340 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  {.#if HAVE_MREMA
27350 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73 65  P.    i64 nReuse
27360 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65   = pFd->mmapSize
27370 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e 73  ;.#else.    cons
27380 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65 20  t int szSyspage 
27390 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
273a0 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  );.    i64 nReus
273b0 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53 69  e = (pFd->mmapSi
273c0 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67 65  ze & ~(szSyspage
273d0 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  -1));.#endif.   
273e0 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f 72   u8 *pReq = &pOr
273f0 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20 20  ig[nReuse];..   
27400 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70 61   /* Unmap any pa
27410 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73 74  ges of the exist
27420 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61 74  ing mapping that
27430 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73 65   cannot be reuse
27440 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52  d. */.    if( nR
27450 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a 20  euse!=nOrig ){. 
27460 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 52       osMunmap(pR
27470 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73 65  eq, nOrig-nReuse
27480 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48 41  );.    }..#if HA
27490 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70 4e  VE_MREMAP.    pN
274a0 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70 4f  ew = osMremap(pO
274b0 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e 65  rig, nReuse, nNe
274c0 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f 56  w, MREMAP_MAYMOV
274d0 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 22  E);.    zErr = "
274e0 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a 20  mremap";.#else. 
274f0 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
27500 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65 75  (pReq, nNew-nReu
27510 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  se, flags, MAP_S
27520 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73 65  HARED, h, nReuse
27530 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 21  );.    if( pNew!
27540 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20  =MAP_FAILED ){. 
27550 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d 70       if( pNew!=p
27560 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 6f  Req ){.        o
27570 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e 4e  sMunmap(pNew, nN
27580 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20 20  ew - nReuse);.  
27590 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a        pNew = 0;.
275a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
275b0 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72 69       pNew = pOri
275c0 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  g;.      }.    }
275d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
275e0 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 65  The attempt to e
275f0 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74 69  xtend the existi
27600 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c 65  ng mapping faile
27610 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a 20  d. Free it. */. 
27620 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50     if( pNew==MAP
27630 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77 3d  _FAILED || pNew=
27640 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  =0 ){.      osMu
27650 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  nmap(pOrig, nReu
27660 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  se);.    }.  }..
27670 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73 20    /* If pNew is 
27680 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79 20  still NULL, try 
27690 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e 74  to create an ent
276a0 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69 6e  irely new mappin
276b0 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65 77  g. */.  if( pNew
276c0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  ==0 ){.    pNew 
276d0 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65 77  = osMmap(0, nNew
276e0 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41  , flags, MAP_SHA
276f0 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d 0a  RED, h, 0);.  }.
27700 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41 50  .  if( pNew==MAP
27710 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 70  _FAILED ){.    p
27720 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e 65  New = 0;.    nNe
27730 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78 4c  w = 0;.    unixL
27740 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 4f  ogError(SQLITE_O
27750 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a 50  K, zErr, pFd->zP
27760 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ath);..    /* If
27770 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f 76   the mmap() abov
27780 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d 65  e failed, assume
27790 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
277a0 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c 6c  uent mmap() call
277b0 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70 72  s.    ** will pr
277c0 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f 2e  obably fail too.
277d0 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75 73   Fall back to us
277e0 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74 65  ing xRead/xWrite
277f0 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20 20   exclusively.   
27800 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65   ** in this case
27810 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e 6d  .  */.    pFd->m
27820 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b 0a  mapSizeMax = 0;.
27830 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70 52    }.  pFd->pMapR
27840 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a 29  egion = (void *)
27850 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61  pNew;.  pFd->mma
27860 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  pSize = pFd->mma
27870 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e 4e  pSizeActual = nN
27880 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d  ew;.}../*.** Mem
27890 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61 70  ory map or remap
278a0 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64   the file opened
278b0 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69 70   by file-descrip
278c0 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65 20  tor pFd (if the 
278d0 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65 61  file.** is alrea
278e0 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20 65  dy mapped, the e
278f0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
27900 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 74  is replaced by t
27910 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66 20  he new). Or, if 
27920 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61 64  .** there alread
27930 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70 69  y exists a mappi
27940 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65  ng for this file
27950 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
27960 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74 61  still .** outsta
27970 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20 72  nding xFetch() r
27980 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74 2c  eferences to it,
27990 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
279a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
279b0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 42   If parameter nB
279c0 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74  yte is non-negat
279d0 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ive, then it is 
279e0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
279f0 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d 61  ze of .** the ma
27a00 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65 2e  pping to create.
27a10 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e   Otherwise, if n
27a20 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68 61  Byte is less tha
27a30 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
27a40 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20 73   .** requested s
27a50 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65 20  ize is the size 
27a60 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  of the file on d
27a70 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c 20  isk. The actual 
27a80 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63  size of the.** c
27a90 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20 69  reated mapping i
27aa0 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65 71  s either the req
27ab0 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20 74  uested size or t
27ac0 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75  he value configu
27ad0 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53 51  red .** using SQ
27ae0 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f  LITE_FCNTL_MMAP_
27af0 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65 72  LIMIT, whichever
27b00 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a   is smaller..**.
27b10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
27b20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65  returned if no e
27b30 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76 65  rror occurs (eve
27b40 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e 67  n if the mapping
27b50 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72 65   is not.** recre
27b60 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c 74  ated as a result
27b70 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
27b80 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20 61  references) or a
27b90 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
27ba0 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  * code otherwise
27bb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27bc0 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69 78  unixMapfile(unix
27bd0 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20 6e  File *pFd, i64 n
27be0 42 79 74 65 29 7b 0a 20 20 69 36 34 20 6e 4d 61  Byte){.  i64 nMa
27bf0 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e 74  p = nByte;.  int
27c00 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
27c10 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e  nMap>=0 || pFd->
27c20 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
27c30 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74 63    if( pFd->nFetc
27c40 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e 20  hOut>0 ) return 
27c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
27c60 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20 20  ( nMap<0 ){.    
27c70 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74  struct stat stat
27c80 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  buf;          /*
27c90 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
27ca0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
27cb0 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
27cc0 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75 66  pFd->h, &statbuf
27cd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27d00 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
27d10 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74   }.    nMap = st
27d20 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20  atbuf.st_size;. 
27d30 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46   }.  if( nMap>pF
27d40 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
27d50 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64  {.    nMap = pFd
27d60 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20  ->mmapSizeMax;. 
27d70 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d   }..  if( nMap!=
27d80 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  pFd->mmapSize ){
27d90 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e 30 20  .    if( nMap>0 
27da0 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52 65 6d  ){.      unixRem
27db0 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61 70  apfile(pFd, nMap
27dc0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27dd0 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c      unixUnmapfil
27de0 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20 20  e(pFd);.    }.  
27df0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
27e00 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
27e10 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
27e20 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
27e30 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
27e40 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
27e50 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
27e60 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
27e70 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
27e80 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
27e90 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
27ea0 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
27eb0 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
27ec0 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
27ed0 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
27ee0 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
27ef0 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
27f00 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
27f10 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
27f20 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
27f30 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
27f40 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
27f50 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
27f60 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
27f70 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
27f80 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
27f90 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
27fa0 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
27fb0 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
27fc0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
27fd0 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
27fe0 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
27ff0 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
28000 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
28010 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20  lly .** release 
28020 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
28030 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66   calling unixUnf
28040 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
28050 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28  c int unixFetch(
28060 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
28070 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
28080 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
28090 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
280a0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
280b0 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
280c0 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
280d0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
280e0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
280f0 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
28100 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54   = 0;..#if SQLIT
28110 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
28120 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  0.  if( pFd->mma
28130 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20  pSizeMax>0 ){.  
28140 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
28150 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  egion==0 ){.    
28160 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d    int rc = unixM
28170 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
28180 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
28190 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
281a0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
281b0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
281c0 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
281d0 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
281e0 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
281f0 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
28200 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
28210 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
28220 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
28230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
28240 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
28250 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
28260 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
28270 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
28280 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e  es a .** referen
28290 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
282a0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
282b0 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54  o unixFetch(). T
282c0 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
282d0 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
282e0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
282f0 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
28300 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
28310 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
28320 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
28330 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68  to the unixFetch
28340 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a  () invocation. .
28350 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
28360 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
28370 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
28380 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
28390 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  eing called .** 
283a0 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
283b0 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
283c0 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
283d0 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
283e0 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e  apping .** may n
283f0 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
28400 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
28410 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
28420 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28  int unixUnfetch(
28430 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
28440 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64  , i64 iOff, void
28450 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
28460 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
28470 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
28480 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
28490 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
284a0 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
284b0 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44  file */.  UNUSED
284c0 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
284d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  ;..  /* If p==0 
284e0 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
284f0 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
28500 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
28510 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
28520 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
28530 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
28540 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
28550 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
28560 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
28570 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
28580 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
28590 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
285a0 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
285b0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
285c0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
285d0 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
285e0 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
285f0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
28600 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
28610 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
28620 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28  [iOff] );..  if(
28630 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
28640 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
28650 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
28660 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
28670 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
28680 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
28690 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
286a0 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
286b0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
286c0 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
286d0 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
286e0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
286f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
28700 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
28710 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28720 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
28730 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
28740 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
28750 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
28760 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
28770 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
28780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28790 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
287a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
287d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
287e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
287f0 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
28800 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
28810 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28820 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
28830 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
28840 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
28850 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
28860 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
28870 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
28880 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
28890 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
288a0 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
288b0 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
288c0 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
288d0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
288e0 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
288f0 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
28900 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
28910 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
28920 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
28930 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
28940 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
28950 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
28960 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
28970 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
28980 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
28990 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
289a0 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
289b0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
289c0 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
289d0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
289e0 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
289f0 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
28a00 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
28a10 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
28a20 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
28a30 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
28a40 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
28a50 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
28a60 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
28a70 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
28a80 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
28a90 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  nction F, two ob
28aa0 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
28ab0 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
28ac0 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
28ad0 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
28ae0 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
28af0 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
28b00 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
28b10 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
28b20 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
28b30 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
28b40 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
28b50 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
28b60 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
28b70 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
28b80 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
28b90 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
28ba0 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
28bb0 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
28bc0 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
28bd0 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
28be0 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
28bf0 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
28c00 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
28c10 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
28c20 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
28c30 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
28c40 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
28c50 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
28c60 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
28c70 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
28c80 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
28c90 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
28ca0 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
28cb0 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
28cc0 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
28cd0 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
28ce0 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
28cf0 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
28d00 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
28d10 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
28d20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
28d30 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
28d40 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
28d50 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
28d60 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
28d70 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f  ODS(FINDER,METHO
28d80 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c  D,VERSION,CLOSE,
28d90 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f  LOCK,UNLOCK,CKLO
28da0 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c  CK,SHMMAP)     \
28db0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
28dc0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28dd0 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28e00 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
28e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e20 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
28e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
28e50 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
28e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e70 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
28e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e90 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28ea0 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
28eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ec0 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
28ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ee0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28ef0 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
28f00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28f10 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
28f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f30 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
28f40 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
28f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
28f60 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
28f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f80 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28f90 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
28fa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
28fb0 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
28fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fd0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28fe0 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
28ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
29000 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
29010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29020 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
29030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29040 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
29050 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
29080 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
29090 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
290a0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
290b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290c0 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
290d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
290e0 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
290f0 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
29100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29110 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
29120 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
29130 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
29140 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
29170 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
29180 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
29190 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
291a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291b0 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
291c0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
291d0 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
291e0 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
291f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29200 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20   \.   SHMMAP,   
29210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29220 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
29230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29250 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
29260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29270 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
29280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
292a0 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
292b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
292c0 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
292d0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
292e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
292f0 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c     unixShmUnmap,
29300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29310 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
29320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
29340 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20    unixFetch,    
29350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29360 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20   xFetch */      
29370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29380 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
29390 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20   unixUnfetch,   
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
293b0 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20  xUnfetch */     
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
293e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29420 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
29430 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
29440 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
29450 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
29460 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
29470 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
29480 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
29490 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
294a0 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
294b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294c0 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
294d0 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
29520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29560 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
29570 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
29580 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
29590 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
295a0 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
295b0 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
295c0 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
295d0 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
295e0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
295f0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
29600 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
29610 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
29620 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
29630 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
29640 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
29650 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
29660 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
29670 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
29680 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
29690 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
296a0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
296b0 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
296c0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
296d0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
296e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
296f0 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29720 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
29730 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
29740 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29750 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29760 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
29770 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29780 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29790 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
297a0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
297b0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
297c0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
297d0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
297e0 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
297f0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29800 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61  d */.  unixShmMa
29810 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
29820 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29830 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
29840 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
29850 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
29860 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
29870 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
29880 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
29890 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
298a0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
298b0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298d0 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
298e0 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62   memory is disab
298f0 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  led */.  nolockC
29900 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29910 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
29920 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c  hod */.  nolockL
29930 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29940 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
29950 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  od */.  nolockUn
29960 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29970 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
29980 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  hod */.  nolockC
29990 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
299a0 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  ,  /* xCheckRese
299b0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
299c0 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
299d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
299e0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
299f0 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
29a00 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
29a10 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
29a20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29a30 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
29a40 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
29a50 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
29a60 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
29a70 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a90 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29aa0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29ab0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
29ac0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29ad0 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29ae0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
29af0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
29b00 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
29b10 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
29b20 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29b30 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
29b40 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
29b50 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
29b60 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
29b70 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29b80 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
29b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29ba0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
29bb0 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
29bc0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29bd0 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
29be0 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29c00 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
29c10 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
29c20 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29c30 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
29c40 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
29c50 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
29c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c70 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
29c80 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
29c90 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
29ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29cb0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
29cc0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
29cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ce0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
29cf0 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
29d00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
29d10 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
29d20 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
29d30 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
29d40 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
29d50 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
29d60 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
29d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29d80 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
29d90 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
29da0 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
29db0 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
29dc0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
29dd0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
29de0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
29df0 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
29e00 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
29e10 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
29e20 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
29e30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29e40 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
29e50 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
29e60 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43  abled */.  semXC
29e70 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
29e80 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29e90 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c  ethod */.  semXL
29ea0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29eb0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
29ec0 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e  thod */.  semXUn
29ed0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29ee0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
29ef0 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43  ethod */.  semXC
29f00 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
29f10 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
29f20 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
29f30 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
29f60 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
29f70 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
29f80 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29f90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29fa0 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
29fb0 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
29fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29fd0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
29fe0 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
29ff0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
2a000 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
2a010 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
2a020 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
2a030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a040 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
2a050 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
2a060 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
2a070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a080 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
2a090 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
2a0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0b0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
2a0c0 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
2a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0e0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
2a0f0 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
2a100 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
2a110 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
2a120 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
2a130 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a150 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
2a160 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.).#endif../*.*
2a170 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
2a180 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20  ing method is a 
2a190 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69  "super-method" i
2a1a0 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
2a1b0 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63   it.** opens sec
2a1c0 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63  ondary file desc
2a1d0 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20  riptors for the 
2a1e0 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66  conch and lock f
2a1f0 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75  iles and.** it u
2a200 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66  ses proxy, dot-f
2a210 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c  ile, AFP, and fl
2a220 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65  ock() locking me
2a230 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a  thods on those.*
2a240 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  * secondary file
2a250 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  s.  For this rea
2a260 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
2a270 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
2a280 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s.** proxy locki
2a290 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75  ng is located mu
2a2a0 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20  ch further down 
2a2b0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75  in the file.  Bu
2a2c0 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  t we need.** to 
2a2d0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66  go ahead and def
2a2e0 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ine the sqlite3_
2a2f0 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66  io_methods and f
2a300 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a  inder function.*
2a310 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  * for proxy lock
2a320 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65  ing here.  So we
2a330 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65   forward declare
2a340 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
2a350 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
2a360 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2a370 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2a380 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69  KING_STYLE.stati
2a390 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
2a3a0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
2a3b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2a3c0 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
2a3d0 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
2a3e0 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
2a3f0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
2a400 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
2a410 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
2a420 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
2a430 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49  _file*, int*);.I
2a440 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78  OMETHODS(.  prox
2a450 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  yIoFinder,      
2a460 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
2a470 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
2a480 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  .  proxyIoMethod
2a490 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
2a4a0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2a4b0 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
2a4c0 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
2a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a4e0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
2a4f0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
2a500 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20  proxyClose,     
2a510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
2a520 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
2a530 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20  proxyLock,      
2a540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2a550 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
2a560 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  roxyUnlock,     
2a570 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
2a580 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
2a590 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76  proxyCheckReserv
2a5a0 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68  edLock,   /* xCh
2a5b0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
2a5c0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
2a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a5e0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
2a5f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
2a600 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b  dif../* nfs lock
2a610 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64  d on OSX 10.3+ d
2a620 6f 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69  oesn't clear wri
2a630 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20  te locks when a 
2a640 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
2a650 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
2a660 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
2a670 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2a680 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
2a690 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64  ODS(.  nfsIoFind
2a6a0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
2a6b0 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
2a6c0 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e  tion name */.  n
2a6d0 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  fsIoMethods,    
2a6e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
2a6f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a700 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
2a710 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
2a720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
2a730 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
2a740 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e  disabled */.  un
2a750 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ixClose,        
2a760 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
2a770 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  se method */.  u
2a780 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  nixLock,        
2a790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
2a7a0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
2a7b0 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  fsUnlock,       
2a7c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
2a7d0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
2a7e0 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
2a7f0 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
2a800 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
2a810 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a830 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
2a840 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
2a850 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
2a860 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
2a870 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
2a880 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
2a890 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65   .** This "finde
2a8a0 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  r" function atte
2a8b0 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e  mpts to determin
2a8c0 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69  e the best locki
2a8d0 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20  ng strategy .** 
2a8e0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2a8f0 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22   file "filePath"
2a900 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72  .  It then retur
2a910 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ns the sqlite3_i
2a920 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a  o_methods.** obj
2a930 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ect that impleme
2a940 6e 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67  nts that strateg
2a950 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  y..**.** This is
2a960 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79   for MacOSX only
2a970 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2a980 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2a990 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f  hods *autolockIo
2a9a0 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f  FinderImpl(.  co
2a9b0 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61  nst char *filePa
2a9c0 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f  th,    /* name o
2a9d0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2a9e0 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ile */.  unixFil
2a9f0 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20  e *pNew         
2aa00 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f    /* open file o
2aa10 62 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61  bject for the da
2aa20 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29  tabase file */.)
2aa30 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
2aa40 20 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20   struct Mapping 
2aa50 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2aa60 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20   *zFilesystem;  
2aa70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2aa80 69 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e  ilesystem type n
2aa90 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ame */.    const
2aaa0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
2aab0 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20  ods *pMethods;  
2aac0 20 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20   /* Appropriate 
2aad0 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a  locking method *
2aae0 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b  /.  } aMap[] = {
2aaf0 0a 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20  .    { "hfs",   
2ab00 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73   &posixIoMethods
2ab10 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c   },.    { "ufs",
2ab20 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
2ab30 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66  ods },.    { "af
2ab40 70 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  pfs",  &afpIoMet
2ab50 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73  hods },.    { "s
2ab60 6d 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65  mbfs",  &afpIoMe
2ab70 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
2ab80 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b  webdav", &nolock
2ab90 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
2aba0 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20   { 0, 0 }.  };. 
2abb0 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
2abc0 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a   statfs fsInfo;.
2abd0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
2abe0 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20  ockInfo;..  if( 
2abf0 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20  !filePath ){.   
2ac00 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d   /* If filePath=
2ac10 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73  =NULL that means
2ac20 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2ac30 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74  with a transient
2ac40 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61   file.    ** tha
2ac50 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  t does not need 
2ac60 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f  to be locked. */
2ac70 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c  .    return &nol
2ac80 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
2ac90 7d 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66  }.  if( statfs(f
2aca0 69 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f  ilePath, &fsInfo
2acb0 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69  ) != -1 ){.    i
2acc0 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67  f( fsInfo.f_flag
2acd0 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29  s & MNT_RDONLY )
2ace0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2acf0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2ad00 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
2ad10 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  =0; aMap[i].zFil
2ad20 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20  esystem; i++){. 
2ad30 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2ad40 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e  fsInfo.f_fstypen
2ad50 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69  ame, aMap[i].zFi
2ad60 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a  lesystem)==0 ){.
2ad70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
2ad80 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b  Map[i].pMethods;
2ad90 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2ada0 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74   }..  /* Default
2adb0 20 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20   case. Handles, 
2adc0 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20  amongst others, 
2add0 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74  "nfs"..  ** Test
2ade0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
2adf0 20 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20   using fcntl(). 
2ae00 49 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63  If the call succ
2ae10 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75  eeds, .  ** assu
2ae20 6d 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  me that the file
2ae30 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73  -system supports
2ae40 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63   POSIX style loc
2ae50 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b  ks. .  */.  lock
2ae60 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  Info.l_len = 1;.
2ae70 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61    lockInfo.l_sta
2ae80 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e  rt = 0;.  lockIn
2ae90 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  fo.l_whence = SE
2aea0 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e  EK_SET;.  lockIn
2aeb0 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44  fo.l_type = F_RD
2aec0 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e  LCK;.  if( osFcn
2aed0 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45  tl(pNew->h, F_GE
2aee0 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21  TLK, &lockInfo)!
2aef0 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20  =-1 ) {.    if( 
2af00 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
2af10 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73  fstypename, "nfs
2af20 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ")==0 ){.      r
2af30 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68  eturn &nfsIoMeth
2af40 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ods;.    } else 
2af50 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26  {.      return &
2af60 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
2af70 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2af80 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f     return &dotlo
2af90 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2afa0 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
2afb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2afc0 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61  ds .  *(*const a
2afd0 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29  utolockIoFinder)
2afe0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
2aff0 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f  xFile*) = autolo
2b000 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a  ckIoFinderImpl;.
2b010 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
2b020 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
2b030 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2b040 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a  OCKING_STYLE */.
2b050 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2b060 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64  /*.** This "find
2b070 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72  er" function for
2b080 20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20   VxWorks checks 
2b090 74 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78 20  to see if posix 
2b0a0 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b  advisory.** lock
2b0b0 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69  ing works.  If i
2b0c0 74 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61  t does, then tha
2b0d0 74 20 69 73 20 77 68 61 74 20 69 73 20 75 73 65  t is what is use
2b0e0 64 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e  d.  If it does n
2b0f0 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e  ot.** work, then
2b100 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d   fallback to nam
2b110 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
2b120 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
2b130 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
2b140 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b  _methods *vxwork
2b150 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  sIoFinderImpl(. 
2b160 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
2b170 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
2b180 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2b190 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
2b1a0 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
2b1b0 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
2b1c0 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
2b1d0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
2b1e0 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
2b1f0 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
2b200 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
2b210 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
2b220 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
2b230 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
2b240 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
2b250 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
2b260 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
2b270 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
2b280 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
2b290 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
2b2a0 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
2b2b0 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
2b2c0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
2b2d0 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
2b2e0 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
2b2f0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
2b300 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
2b310 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
2b320 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
2b330 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
2b340 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
2b350 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
2b360 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
2b370 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
2b380 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
2b390 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
2b3a0 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
2b3b0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
2b3c0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
2b3d0 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73  e{.    return &s
2b3e0 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  emIoMethods;.  }
2b3f0 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .}.static const 
2b400 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
2b410 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76  ds .  *(*const v
2b420 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28  xworksIoFinder)(
2b430 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
2b440 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73  File*) = vxworks
2b450 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
2b460 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
2b470 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e  RKS */../*.** An
2b480 20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66   abstract type f
2b490 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  or a pointer to 
2b4a0 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e  an IO method fin
2b4b0 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f  der function:.*/
2b4c0 0a 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73  .typedef const s
2b4d0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
2b4e0 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65  s *(*finder_type
2b4f0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
2b500 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a  ixFile*);.../***
2b510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b550 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
2b560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b570 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  ****** sqlite3_v
2b580 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  fs methods *****
2b590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2b5a0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
2b5b0 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  is division cont
2b5c0 61 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  ains the impleme
2b5d0 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f  ntation of metho
2b5e0 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c  ds on the.** sql
2b5f0 69 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e  ite3_vfs object.
2b600 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  .*/../*.** Initi
2b610 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e  alize the conten
2b620 74 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69  ts of the unixFi
2b630 6c 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  le structure poi
2b640 6e 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a  nted to by pId..
2b650 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
2b660 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20  llInUnixFile(.  
2b670 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
2b680 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74  s,      /* Point
2b690 65 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74  er to vfs object
2b6a0 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
2b6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b6c0 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
2b6d0 69 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65  iptor of file be
2b6e0 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20  ing opened */.  
2b6f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49  sqlite3_file *pI
2b700 64 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  d,      /* Write
2b710 20 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65   to the unixFile
2b720 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
2b730 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2b740 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
2b750 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
2b760 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
2b770 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73  .  int ctrlFlags
2b780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65             /* Ze
2b790 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46  ro or more UNIXF
2b7a0 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a  ILE_* values */.
2b7b0 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  ){.  const sqlit
2b7c0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
2b7d0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
2b7e0 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d  unixFile *pNew =
2b7f0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64   (unixFile *)pId
2b800 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2b810 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
2b820 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d  t( pNew->pInode=
2b830 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55  =NULL );..  /* U
2b840 73 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20  sually the path 
2b850 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64  zFilename should
2b860 20 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69   not be a relati
2b870 76 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65  ve pathname. The
2b880 0a 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20  .  ** exception 
2b890 69 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20  is when opening 
2b8a0 74 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68  the proxy "conch
2b8b0 22 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73  " file in builds
2b8c0 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75   that.  ** inclu
2b8d0 64 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41  de the special A
2b8e0 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79  pple locking sty
2b8f0 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65  les..  */.#if de
2b900 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
2b910 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
2b920 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2b930 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2b940 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
2b950 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20  ame[0]=='/' .   
2b960 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61   || pVfs->pAppDa
2b970 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f  ta==(void*)&auto
2b980 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a  lockIoFinder );.
2b990 23 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20  #else.  assert( 
2b9a0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
2b9b0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
2b9c0 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ' );.#endif..  /
2b9d0 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63  * No locking occ
2b9e0 75 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79  urs in temporary
2b9f0 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65   files */.  asse
2ba00 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
2ba10 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26   || (ctrlFlags &
2ba20 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2ba30 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41  )!=0 );..  OSTRA
2ba40 43 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33  CE(("OPEN    %-3
2ba50 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c  d %s\n", h, zFil
2ba60 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d  ename));.  pNew-
2ba70 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e  >h = h;.  pNew->
2ba80 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
2ba90 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69  New->zPath = zFi
2baa0 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e  lename;.  pNew->
2bab0 63 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29  ctrlFlags = (u8)
2bac0 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53  ctrlFlags;.#if S
2bad0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
2bae0 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d  IZE>0.  pNew->mm
2baf0 61 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69  apSizeMax = sqli
2bb00 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2bb10 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20  szMmap;.#endif. 
2bb20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
2bb30 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46  _boolean(((ctrlF
2bb40 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
2bb50 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65  URI) ? zFilename
2bb60 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20   : 0),.         
2bb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bb80 20 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45    "psow", SQLITE
2bb90 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
2bba0 52 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65  RITE) ){.    pNe
2bbb0 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
2bbc0 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20  UNIXFILE_PSOW;. 
2bbd0 20 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28   }.  if( strcmp(
2bbe0 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69  pVfs->zName,"uni
2bbf0 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20  x-excl")==0 ){. 
2bc00 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
2bc10 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45  gs |= UNIXFILE_E
2bc20 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  XCL;.  }..#if OS
2bc30 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d  _VXWORKS.  pNew-
2bc40 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69  >pId = vxworksFi
2bc50 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61  ndFileId(zFilena
2bc60 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d  me);.  if( pNew-
2bc70 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63  >pId==0 ){.    c
2bc80 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2bc90 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20  FILE_NOLOCK;.   
2bca0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2bcb0 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  EM;.  }.#endif..
2bcc0 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20    if( ctrlFlags 
2bcd0 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  & UNIXFILE_NOLOC
2bce0 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  K ){.    pLockin
2bcf0 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
2bd00 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
2bd10 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
2bd20 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
2bd30 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
2bd40 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
2bd50 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
2bd60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2bd70 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
2bd80 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
2bd90 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
2bda0 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
2bdb0 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
2bdc0 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
2bdd0 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
2bde0 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
2bdf0 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
2be00 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
2be10 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
2be20 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
2be30 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
2be40 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
2be50 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
2be60 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
2be70 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
2be80 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
2be90 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
2bea0 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
2beb0 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
2bec0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2bed0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2bee0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
2bef0 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
2bf00 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
2bf10 73 0a 23 65 6e 64 69 66 0a 20 20 29 7b 0a 20 20  s.#endif.  ){.  
2bf20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2bf30 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
2bf40 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
2bf50 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
2bf60 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2bf70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2bf80 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
2bf90 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49  ccurred in findI
2bfa0 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73  nodeInfo(), clos
2bfb0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
2bfc0 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  iptor.      ** i
2bfd0 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f  mmediately, befo
2bfe0 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  re releasing the
2bff0 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64   mutex. findInod
2c000 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c  eInfo() may fail
2c010 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f  .      ** in two
2c020 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20   scenarios:.    
2c030 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
2c040 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73  (a) A call to fs
2c050 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20  tat() failed..  
2c060 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d      **   (b) A m
2c070 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20  alloc failed..  
2c080 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2c090 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79  Scenario (b) may
2c0a0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74   only occur if t
2c0b0 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  he process is ho
2c0c0 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20  lding no other. 
2c0d0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73       ** file des
2c0e0 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e  criptors open on
2c0f0 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20   the same file. 
2c100 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74  If there were ot
2c110 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  her file.      *
2c120 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e  * descriptors on
2c130 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e   this file, then
2c140 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64   no malloc would
2c150 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a   be required by.
2c160 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f        ** findIno
2c170 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  deInfo(). If thi
2c180 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
2c190 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
2c1a0 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
2c1b0 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
2c1c0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2c1d0 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
2c1e0 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
2c1f0 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
2c200 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
2c210 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
2c220 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
2c230 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
2c240 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
2c250 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
2c260 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
2c270 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
2c280 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
2c290 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
2c2a0 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
2c2b0 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
2c2c0 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
2c2d0 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
2c2e0 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
2c2f0 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
2c300 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
2c310 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
2c320 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  );.      h = -1;
2c330 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
2c340 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
2c350 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
2c360 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2c370 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
2c380 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
2c390 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2c3a0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
2c3b0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
2c3c0 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
2c3d0 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
2c3e0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
2c3f0 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
2c400 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
2c410 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
2c420 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
2c430 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
2c440 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2c450 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
2c460 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73  ite3_malloc64( s
2c470 69 7a 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a  izeof(*pCtx) );.
2c480 20 20 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20      if( pCtx==0 
2c490 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2c4a0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2c4b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
2c4c0 4e 42 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78  NB: zFilename ex
2c4d0 69 73 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73  ists and remains
2c4e0 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65   valid until the
2c4f0 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a   file is closed.
2c500 20 20 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69        ** accordi
2c510 6e 67 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e  ng to requiremen
2c520 74 20 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65  t F11141.  So we
2c530 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20   do not need to 
2c540 6d 61 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  make a.      ** 
2c550 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65  copy of the file
2c560 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70  name. */.      p
2c570 43 74 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46  Ctx->dbPath = zF
2c580 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70  ilename;.      p
2c590 43 74 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  Ctx->reserved = 
2c5a0 30 3b 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d  0;.      srandom
2c5b0 64 65 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69  dev();.      uni
2c5c0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2c5d0 20 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e       rc = findIn
2c5e0 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
2c5f0 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
2c600 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2c620 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2c630 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
2c640 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62  xt);.        rob
2c650 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20  ust_close(pNew, 
2c660 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  h, __LINE__);.  
2c670 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
2c680 20 20 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78      }.      unix
2c690 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20  LeaveMutex();   
2c6a0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
2c6b0 23 65 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69  #endif..  else i
2c6c0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
2c6d0 20 3d 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65   == &dotlockIoMe
2c6e0 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20  thods ){.    /* 
2c6f0 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  Dotfile locking 
2c700 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61  uses the file pa
2c710 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74  th so it needs t
2c720 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e  o be included in
2c730 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c  .    ** the dotl
2c740 6f 63 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  ockLockingContex
2c750 74 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  t .    */.    ch
2c760 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20  ar *zLockFile;. 
2c770 20 20 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65     int nFilename
2c780 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 46  ;.    assert( zF
2c790 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  ilename!=0 );.  
2c7a0 20 20 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69    nFilename = (i
2c7b0 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e  nt)strlen(zFilen
2c7c0 61 6d 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c  ame) + 6;.    zL
2c7d0 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20  ockFile = (char 
2c7e0 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
2c7f0 36 34 28 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  64(nFilename);. 
2c800 20 20 20 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65     if( zLockFile
2c810 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2c820 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2c830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c840 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2c850 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f  f(nFilename, zLo
2c860 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f 54  ckFile, "%s" DOT
2c870 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69  LOCK_SUFFIX, zFi
2c880 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  lename);.    }. 
2c890 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67     pNew->locking
2c8a0 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46  Context = zLockF
2c8b0 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53  ile;.  }..#if OS
2c8c0 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20  _VXWORKS.  else 
2c8d0 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
2c8e0 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f  e == &semIoMetho
2c8f0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d  ds ){.    /* Nam
2c900 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
2c910 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
2c920 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
2c930 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
2c940 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65   included in the
2c950 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   semLockingConte
2c960 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  xt.    */.    un
2c970 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2c980 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2c990 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2c9a0 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2c9b0 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45   if( (rc==SQLITE
2c9c0 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e 70  _OK) && (pNew->p
2c9d0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c  Inode->pSem==NUL
2c9e0 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72  L) ){.      char
2c9f0 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65   *zSemName = pNe
2ca00 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
2ca10 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ame;.      int n
2ca20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2ca30 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54  snprintf(MAX_PAT
2ca40 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c  HNAME, zSemName,
2ca50 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20   "/%s.sem",.    
2ca60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca70 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43     pNew->pId->zC
2ca80 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20  anonicalName);. 
2ca90 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a       for( n=1; z
2caa0 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20  SemName[n]; n++ 
2cab0 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53  ).        if( zS
2cac0 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29  emName[n]=='/' )
2cad0 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27   zSemName[n] = '
2cae0 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  _';.      pNew->
2caf0 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73  pInode->pSem = s
2cb00 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65  em_open(zSemName
2cb10 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36 2c  , O_CREAT, 0666,
2cb20 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
2cb30 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
2cb40 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20  m == SEM_FAILED 
2cb50 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2cb60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2cb70 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2cb80 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20  de->aSemName[0] 
2cb90 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a  = '\0';.      }.
2cba0 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
2cbb0 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
2cbc0 23 65 6e 64 69 66 0a 20 20 0a 20 20 73 74 6f 72  #endif.  .  stor
2cbd0 65 4c 61 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c  eLastErrno(pNew,
2cbe0 20 30 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f   0);.#if OS_VXWO
2cbf0 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d 53 51  RKS.  if( rc!=SQ
2cc00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
2cc10 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74  f( h>=0 ) robust
2cc20 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
2cc30 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68  __LINE__);.    h
2cc40 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c   = -1;.    osUnl
2cc50 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
2cc60 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c      pNew->ctrlFl
2cc70 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
2cc80 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64  DELETE;.  }.#end
2cc90 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  if.  if( rc!=SQL
2cca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
2ccb0 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f  ( h>=0 ) robust_
2ccc0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2ccd0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73  _LINE__);.  }els
2cce0 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65  e{.    pNew->pMe
2ccf0 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53  thod = pLockingS
2cd00 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f  tyle;.    OpenCo
2cd10 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20 20 76  unter(+1);.    v
2cd20 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e 65 77  erifyDbFile(pNew
2cd30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2cd40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
2cd50 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
2cd60 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e 20 77  a directory in w
2cd70 68 69 63 68 20 74 6f 20 70 75 74 20 74 65 6d 70  hich to put temp
2cd80 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20  orary files..** 
2cd90 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65 20 74  If no suitable t
2cda0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 64 69  emporary file di
2cdb0 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65 20 66  rectory can be f
2cdc0 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c  ound, return NUL
2cdd0 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  L..*/.static con
2cde0 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2cdf0 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a  pFileDir(void){.
2ce00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
2ce10 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20  har *azDirs[] = 
2ce20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  {.     0,.     0
2ce30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22  ,.     0,.     "
2ce40 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20  /var/tmp",.     
2ce50 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/usr/tmp",.    
2ce60 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 30 20   "/tmp",.     0 
2ce70 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 74         /* List t
2ce80 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d  erminator */.  }
2ce90 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
2cea0 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2ceb0 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63  t buf;.  const c
2cec0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a  har *zDir = 0;..
2ced0 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71    azDirs[0] = sq
2cee0 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2cef0 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61 7a 44  tory;.  if( !azD
2cf00 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2cf10 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 53 51 4c  1] = getenv("SQL
2cf20 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20  ITE_TMPDIR");.  
2cf30 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d 20 29  if( !azDirs[2] )
2cf40 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67 65 74   azDirs[2] = get
2cf50 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b 0a 20  env("TMPDIR");. 
2cf60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2cf70 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
2cf80 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44  f(azDirs[0]); zD
2cf90 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b  ir=azDirs[i++]){
2cfa0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
2cfb0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2cfc0 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44 69 72   if( osStat(zDir
2cfd0 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e  , &buf) ) contin
2cfe0 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49  ue;.    if( !S_I
2cff0 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65  SDIR(buf.st_mode
2d000 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
2d010 20 20 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a    if( osAccess(z
2d020 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e 74 69  Dir, 07) ) conti
2d030 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  nue;.    break;.
2d040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 44 69    }.  return zDi
2d050 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  r;.}../*.** Crea
2d060 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  te a temporary f
2d070 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66  ile name in zBuf
2d080 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20  .  zBuf must be 
2d090 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20  allocated.** by 
2d0a0 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63  the calling proc
2d0b0 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ess and must be 
2d0c0 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  big enough to ho
2d0d0 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70  ld at least.** p
2d0e0 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20  Vfs->mxPathname 
2d0f0 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
2d100 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65 6d 70   int unixGetTemp
2d110 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c 20 63  name(int nBuf, c
2d120 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74  har *zBuf){.  st
2d130 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
2d140 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72 73 5b  ned char zChars[
2d150 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
2d160 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
2d170 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
2d180 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
2d190 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
2d1a0 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e  56789";.  unsign
2d1b0 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  ed int i, j;.  c
2d1c0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2d1d0 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64 64 20  ..  /* It's odd 
2d1e0 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e 20 69  to simulate an i
2d1f0 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20 62 75  o-error here, bu
2d200 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20 69 73  t really this is
2d210 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67   just.  ** using
2d220 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e   the io-error in
2d230 66 72 61 73 74 72 75 63 74 75 72 65 20 74 6f 20  frastructure to 
2d240 74 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65  test that SQLite
2d250 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a 20 20   handles this.  
2d260 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c  ** function fail
2d270 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d  ing. .  */.  Sim
2d280 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
2d290 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2d2a0 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75  R );..  zDir = u
2d2b0 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 29  nixTempFileDir()
2d2c0 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20  ;.  if( zDir==0 
2d2d0 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20  ) zDir = ".";.. 
2d2e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
2d2f0 68 65 20 6f 75 74 70 75 74 20 62 75 66 66 65 72  he output buffer
2d300 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
2d310 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f 72 61   for the tempora
2d320 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61  ry file .  ** na
2d330 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 74  me. If it is not
2d340 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2d350 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66  ERROR..  */.  if
2d360 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72 29 20  ( (strlen(zDir) 
2d370 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f  + strlen(SQLITE_
2d380 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
2d390 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69 7a 65  ) + 18) >= (size
2d3a0 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20 20 72  _t)nBuf ){.    r
2d3b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2d3c0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20  OR;.  }..  do{. 
2d3d0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d3e0 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75  ntf(nBuf-18, zBu
2d3f0 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45 5f 54  f, "%s/"SQLITE_T
2d400 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
2d410 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
2d420 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42 75 66  (int)strlen(zBuf
2d430 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2d440 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
2d450 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
2d460 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
2d470 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
2d480 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
2d490 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
2d4a0 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
2d4b0 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
2d4c0 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
2d4d0 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a  uf[j] = 0;.    z
2d4e0 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20  Buf[j+1] = 0;.  
2d4f0 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65 73 73  }while( osAccess
2d500 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20  (zBuf,0)==0 );. 
2d510 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2d520 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2d530 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2d540 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64  STYLE && defined
2d550 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a  (__APPLE__)./*.*
2d560 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74 72 61  * Routine to tra
2d570 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c  nsform a unixFil
2d580 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c  e into a proxy-l
2d590 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e  ocking unixFile.
2d5a0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
2d5b0 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78 79 2d  on in the proxy-
2d5c0 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62  lock division, b
2d5d0 75 74 20 75 73 65 64 20 62 79 20 75 6e 69 78 4f  ut used by unixO
2d5e0 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49  pen().** if SQLI
2d5f0 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
2d600 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66 69 6e  LOCKING is defin
2d610 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2d620 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d  t proxyTransform
2d630 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46 69 6c  UnixFile(unixFil
2d640 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29  e*, const char*)
2d650 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
2d660 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e  Search for an un
2d670 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
2d680 70 74 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  ptor that was op
2d690 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61  ened on the data
2d6a0 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e  base .** file (n
2d6b0 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  ot a journal or 
2d6c0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
2d6d0 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65 64 20  ile) identified 
2d6e0 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a  by pathname.** z
2d6f0 50 61 74 68 20 77 69 74 68 20 53 51 4c 49 54 45  Path with SQLITE
2d700 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20  _OPEN_XXX flags 
2d710 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65 20 70  matching those p
2d720 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2d730 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
2d740 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
2d750 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66  ..**.** Such a f
2d760 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
2d770 61 79 20 65 78 69 73 74 20 69 66 20 61 20 64 61  ay exist if a da
2d780 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2d790 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20  n was closed.** 
2d7a0 62 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  but the associat
2d7b0 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
2d7c0 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  or could not be 
2d7d0 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65 20 73  closed because s
2d7e0 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c  ome.** other fil
2d7f0 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65  e descriptor ope
2d800 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66 69  n on the same fi
2d810 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 20  le is holding a 
2d820 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65  file-lock..** Re
2d830 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20  fer to comments 
2d840 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f 73 65  in the unixClose
2d850 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  () function and 
2d860 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d  the lengthy comm
2d870 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e  ent.** describin
2d880 67 20 22 50 6f 73 69 78 20 41 64 76 69 73 6f 72  g "Posix Advisor
2d890 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20 74 68  y Locking" at th
2d8a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 69 73 20  e start of this 
2d8b0 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72  file for .** fur
2d8c0 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20 41 6c  ther details. Al
2d8d0 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30 31 38  so, ticket #4018
2d8e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69  ..**.** If a sui
2d8f0 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  table file descr
2d900 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20  iptor is found, 
2d910 74 68 65 6e 20 69 74 20 69 73 20 72 65 74 75 72  then it is retur
2d920 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75  ned. If no.** su
2d930 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ch file descript
2d940 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d  or is located, -
2d950 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  1 is returned..*
2d960 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55 6e 75  /.static UnixUnu
2d970 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75 73 61  sedFd *findReusa
2d980 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68 61 72  bleFd(const char
2d990 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66 6c 61   *zPath, int fla
2d9a0 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65  gs){.  UnixUnuse
2d9b0 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 30  dFd *pUnused = 0
2d9c0 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73  ;..  /* Do not s
2d9d0 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75  earch for an unu
2d9e0 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70  sed file descrip
2d9f0 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20  tor on vxworks. 
2da00 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  Not because.  **
2da10 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e   vxworks would n
2da20 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f 6d 20  ot benefit from 
2da30 74 68 65 20 63 68 61 6e 67 65 20 28 69 74 20 6d  the change (it m
2da40 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f 74 20  ight, we're not 
2da50 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20  sure),.  ** but 
2da60 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79 20 74  because no way t
2da70 6f 20 74 65 73 74 20 69 74 20 69 73 20 63 75 72  o test it is cur
2da80 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62 6c 65  rently available
2da90 2e 20 49 74 20 69 73 20 62 65 74 74 65 72 20 0a  . It is better .
2daa0 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b    ** not to risk
2dab0 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b   breaking vxwork
2dac0 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 74 68  s support for th
2dad0 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68 20 61  e sake of such a
2dae0 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a 2a 20  n obscure .  ** 
2daf0 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66  feature.  */.#if
2db00 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73   !OS_VXWORKS.  s
2db10 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2db20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2db30 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f      /* Results o
2db40 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f  f stat() call */
2db50 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28 29 20  ..  /* A stat() 
2db60 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f  call may fail fo
2db70 72 20 76 61 72 69 6f 75 73 20 72 65 61 73 6f 6e  r various reason
2db80 73 2e 20 49 66 20 74 68 69 73 20 68 61 70 70 65  s. If this happe
2db90 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 61  ns, it is.  ** a
2dba0 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20 74 68  lmost certain th
2dbb0 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c  at an open() cal
2dbc0 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61  l on the same pa
2dbd0 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69  th will also fai
2dbe0 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68 69 73  l..  ** For this
2dbf0 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65   reason, if an e
2dc00 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20 74  rror occurs in t
2dc10 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c 20 68  he stat() call h
2dc20 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20  ere, it is.  ** 
2dc30 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31 20 69  ignored and -1 i
2dc40 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  s returned. The 
2dc50 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72 79 20  caller will try 
2dc60 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
2dc70 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69 70 74  le.  ** descript
2dc80 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 70  or on the same p
2dc90 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72  ath, fail, and r
2dca0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 74  eturn an error t
2dcb0 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20  o SQLite..  **. 
2dcc0 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20 73 75   ** Even if a su
2dcd0 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28 29 20  bsequent open() 
2dce0 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63 65 65  call does succee
2dcf0 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75 65 6e  d, the consequen
2dd00 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20  ces of.  ** not 
2dd10 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20 61 20  searching for a 
2dd20 72 65 75 73 61 62 6c 65 20 66 69 6c 65 20 64 65  reusable file de
2dd30 73 63 72 69 70 74 6f 72 20 61 72 65 20 6e 6f 74  scriptor are not
2dd40 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28   dire.  */.  if(
2dd50 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68   0==osStat(zPath
2dd60 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20  , &sStat) ){.   
2dd70 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
2dd80 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69  pInode;..    uni
2dd90 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
2dda0 20 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64     pInode = inod
2ddb0 65 4c 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65  eList;.    while
2ddc0 28 20 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e  ( pInode && (pIn
2ddd0 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21  ode->fileId.dev!
2dde0 3d 73 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20  =sStat.st_dev.  
2ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de00 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69     || pInode->fi
2de10 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e  leId.ino!=sStat.
2de20 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20  st_ino) ){.     
2de30 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64    pInode = pInod
2de40 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  e->pNext;.    }.
2de50 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29      if( pInode )
2de60 7b 0a 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73  {.      UnixUnus
2de70 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20  edFd **pp;.     
2de80 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d   for(pp=&pInode-
2de90 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26  >pUnused; *pp &&
2dea0 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66   (*pp)->flags!=f
2deb0 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29  lags; pp=&((*pp)
2dec0 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20  ->pNext));.     
2ded0 20 70 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a   pUnused = *pp;.
2dee0 20 20 20 20 20 20 69 66 28 20 70 55 6e 75 73 65        if( pUnuse
2def0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70  d ){.        *pp
2df00 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78   = pUnused->pNex
2df10 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
2df20 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
2df30 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  tex();.  }.#endi
2df40 66 20 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56  f    /* if !OS_V
2df50 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75  XWORKS */.  retu
2df60 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f  rn pUnused;.}../
2df70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2df80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20  on is called by 
2df90 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f 20 64 65  unixOpen() to de
2dfa0 74 65 72 6d 69 6e 65 20 74 68 65 20 75 6e 69 78  termine the unix
2dfb0 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20   permissions.** 
2dfc0 74 6f 20 63 72 65 61 74 65 20 6e 65 77 20 66 69  to create new fi
2dfd0 6c 65 73 20 77 69 74 68 2e 20 49 66 20 6e 6f 20  les with. If no 
2dfe0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
2dff0 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
2e000 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20  returned.** and 
2e010 61 20 76 61 6c 75 65 20 73 75 69 74 61 62 6c 65  a value suitable
2e020 20 66 6f 72 20 70 61 73 73 69 6e 67 20 61 73 20   for passing as 
2e030 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  the third argume
2e040 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29 20 69 73  nt to open(2) is
2e050 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 2a  .** written to *
2e060 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20 49 4f 20  pMode. If an IO 
2e070 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
2e080 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
2e090 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
2e0a0 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
2e0b0 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f   of *pMode is no
2e0c0 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a  t modified..**.*
2e0d0 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c  * In most cases,
2e0e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   this routine se
2e0f0 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20  ts *pMode to 0, 
2e100 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d  which will becom
2e110 65 0a 2a 2a 20 61 6e 20 69 6e 64 69 63 61 74 69  e.** an indicati
2e120 6f 6e 20 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65  on to robust_ope
2e130 6e 28 29 20 74 6f 20 63 72 65 61 74 65 20 74 68  n() to create th
2e140 65 20 66 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20  e file using.** 
2e150 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
2e160 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
2e170 61 64 6a 75 73 74 65 64 20 62 79 20 74 68 65 20  adjusted by the 
2e180 75 6d 61 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66  umask..** But if
2e190 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20   the file being 
2e1a0 6f 70 65 6e 65 64 20 69 73 20 61 20 57 41 4c 20  opened is a WAL 
2e1b0 6f 72 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e  or regular journ
2e1c0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a  al file, then .*
2e1d0 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
2e1e0 71 75 65 72 69 65 73 20 74 68 65 20 66 69 6c 65  queries the file
2e1f0 2d 73 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20  -system for the 
2e200 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74  permissions on t
2e210 68 65 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  he .** correspon
2e220 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2e230 6c 65 20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f  le and sets *pMo
2e240 64 65 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65  de to this value
2e250 2e 20 57 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70  . Whenever .** p
2e260 6f 73 73 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64  ossible, WAL and
2e270 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61   journal files a
2e280 72 65 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  re created using
2e290 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
2e2a0 73 69 6f 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65  sions .** as the
2e2b0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
2e2c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
2e2d0 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f 45   If the SQLITE_E
2e2e0 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20  NABLE_8_3_NAMES 
2e2f0 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65  option is enable
2e300 64 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f  d, then the.** o
2e310 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  riginal filename
2e320 20 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e   is unavailable.
2e330 20 20 42 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20    But 8_3_NAMES 
2e340 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  is only used for
2e350 0a 2a 2a 20 46 41 54 20 66 69 6c 65 73 79 73 74  .** FAT filesyst
2e360 65 6d 73 20 61 6e 64 20 70 65 72 6d 69 73 73 69  ems and permissi
2e370 6f 6e 73 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65  ons do not matte
2e380 72 20 74 68 65 72 65 2c 20 73 6f 20 6a 75 73 74  r there, so just
2e390 20 75 73 65 0a 2a 2a 20 74 68 65 20 64 65 66 61   use.** the defa
2e3a0 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ult permissions.
2e3b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
2e3c0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
2e3d0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
2e3e0 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2e3f0 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66 20       /* Path of 
2e400 66 69 6c 65 20 28 70 6f 73 73 69 62 6c 79 29 20  file (possibly) 
2e410 62 65 69 6e 67 20 63 72 65 61 74 65 64 20 2a 2f  being created */
2e420 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
2e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e440 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
2e450 65 64 20 61 73 20 34 74 68 20 61 72 67 75 6d 65  ed as 4th argume
2e460 6e 74 20 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f  nt to xOpen() */
2e470 0a 20 20 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65  .  mode_t *pMode
2e480 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2e490 20 20 20 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69     /* OUT: Permi
2e4a0 73 73 69 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66  ssions to open f
2e4b0 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69  ile with */.  ui
2e4c0 64 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20  d_t *pUid,      
2e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e4e0 20 4f 55 54 3a 20 75 69 64 20 74 6f 20 73 65 74   OUT: uid to set
2e4f0 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a   on the file */.
2e500 20 20 67 69 64 5f 74 20 2a 70 47 69 64 20 20 20    gid_t *pGid   
2e510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e520 20 20 2f 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f    /* OUT: gid to
2e530 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c 65   set on the file
2e540 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
2e550 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2e560 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e570 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d  rn Code */.  *pM
2e580 6f 64 65 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64  ode = 0;.  *pUid
2e590 20 3d 20 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20   = 0;.  *pGid = 
2e5a0 30 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  0;.  if( flags &
2e5b0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
2e5c0 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
2e5d0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
2e5e0 20 20 20 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f     char zDb[MAX_
2e5f0 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20  PATHNAME+1];    
2e600 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
2e610 65 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e  e path */.    in
2e620 74 20 6e 44 62 3b 20 20 20 20 20 20 20 20 20 20  t nDb;          
2e630 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2e640 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 62  umber of valid b
2e650 79 74 65 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20  ytes in zDb */. 
2e660 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
2e670 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stat;           
2e680 20 2f 2a 20 4f 75 74 70 75 74 20 6f 66 20 73 74   /* Output of st
2e690 61 74 28 29 20 6f 6e 20 64 61 74 61 62 61 73 65  at() on database
2e6a0 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a   file */..    /*
2e6b0 20 7a 50 61 74 68 20 69 73 20 61 20 70 61 74 68   zPath is a path
2e6c0 20 74 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75   to a WAL or jou
2e6d0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66  rnal file. The f
2e6e0 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64  ollowing block d
2e6f0 65 72 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68  erives.    ** th
2e700 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 61 73  e path to the as
2e710 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
2e720 65 20 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74  e file from zPat
2e730 68 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61  h. This block ha
2e740 6e 64 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65  ndles.    ** the
2e750 20 66 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e   following namin
2e760 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20  g conventions:. 
2e770 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22     **.    **   "
2e780 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75  <path to db>-jou
2e790 72 6e 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22  rnal".    **   "
2e7a0 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c  <path to db>-wal
2e7b0 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
2e7c0 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c  h to db>-journal
2e7d0 4e 4e 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  NN".    **   "<p
2e7e0 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e  ath to db>-walNN
2e7f0 22 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ".    **.    ** 
2e800 77 68 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65  where NN is a de
2e810 63 69 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68  cimal number. Th
2e820 65 20 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65  e NN naming sche
2e830 6d 65 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20  mes are .    ** 
2e840 75 73 65 64 20 62 79 20 74 68 65 20 74 65 73 74  used by the test
2e850 5f 6d 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64  _multiplex.c mod
2e860 75 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ule..    */.    
2e870 6e 44 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72  nDb = sqlite3Str
2e880 6c 65 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31  len30(zPath) - 1
2e890 3b 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ; .#ifdef SQLITE
2e8a0 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45  _ENABLE_8_3_NAME
2e8b0 53 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 44 62  S.    while( nDb
2e8c0 3e 30 20 26 26 20 73 71 6c 69 74 65 33 49 73 61  >0 && sqlite3Isa
2e8d0 6c 6e 75 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29  lnum(zPath[nDb])
2e8e0 20 29 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66   ) nDb--;.    if
2e8f0 28 20 6e 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74  ( nDb==0 || zPat
2e900 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 20 72 65  h[nDb]!='-' ) re
2e910 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2e920 23 65 6c 73 65 0a 20 20 20 20 77 68 69 6c 65 28  #else.    while(
2e930 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
2e940 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2e950 28 20 6e 44 62 3e 30 20 29 3b 0a 20 20 20 20 20  ( nDb>0 );.     
2e960 20 61 73 73 65 72 74 28 20 7a 50 61 74 68 5b 6e   assert( zPath[n
2e970 44 62 5d 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20  Db]!='\n' );.   
2e980 20 20 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a     nDb--;.    }.
2e990 23 65 6e 64 69 66 0a 20 20 20 20 6d 65 6d 63 70  #endif.    memcp
2e9a0 79 28 7a 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44  y(zDb, zPath, nD
2e9b0 62 29 3b 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d  b);.    zDb[nDb]
2e9c0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66   = '\0';..    if
2e9d0 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c  ( 0==osStat(zDb,
2e9e0 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20   &sStat) ){.    
2e9f0 20 20 2a 70 4d 6f 64 65 20 3d 20 73 53 74 61 74    *pMode = sStat
2ea00 2e 73 74 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b  .st_mode & 0777;
2ea10 0a 20 20 20 20 20 20 2a 70 55 69 64 20 3d 20 73  .      *pUid = s
2ea20 53 74 61 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20  Stat.st_uid;.   
2ea30 20 20 20 2a 70 47 69 64 20 3d 20 73 53 74 61 74     *pGid = sStat
2ea40 2e 73 74 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c  .st_gid;.    }el
2ea50 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
2ea60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
2ea70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  T;.    }.  }else
2ea80 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2ea90 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
2eaa0 4e 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70  NCLOSE ){.    *p
2eab0 4d 6f 64 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d  Mode = 0600;.  }
2eac0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2ead0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
2eae0 66 69 6c 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a  file zPath..** .
2eaf0 2a 2a 20 50 72 65 76 69 6f 75 73 6c 79 2c 20 74  ** Previously, t
2eb00 68 65 20 53 51 4c 69 74 65 20 4f 53 20 6c 61 79  he SQLite OS lay
2eb10 65 72 20 75 73 65 64 20 74 68 72 65 65 20 66 75  er used three fu
2eb20 6e 63 74 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65  nctions in place
2eb30 20 6f 66 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a   of this.** one:
2eb40 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74  .**.**     sqlit
2eb50 65 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74  e3OsOpenReadWrit
2eb60 65 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  e();.**     sqli
2eb70 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
2eb80 79 28 29 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69  y();.**     sqli
2eb90 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
2eba0 76 65 28 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73  ve();.**.** Thes
2ebb0 65 20 63 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f  e calls correspo
2ebc0 6e 64 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  nd to the follow
2ebd0 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
2ebe0 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a   of flags:.**.**
2ebf0 20 20 20 20 20 52 65 61 64 57 72 69 74 65 28 29       ReadWrite()
2ec00 20 2d 3e 20 20 20 20 20 28 52 45 41 44 57 52 49   ->     (READWRI
2ec10 54 45 20 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20  TE | CREATE).** 
2ec20 20 20 20 20 52 65 61 64 4f 6e 6c 79 28 29 20 20      ReadOnly()  
2ec30 2d 3e 20 20 20 20 20 28 52 45 41 44 4f 4e 4c 59  ->     (READONLY
2ec40 29 20 0a 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78  ) .**     OpenEx
2ec50 63 6c 75 73 69 76 65 28 29 20 2d 3e 20 28 52 45  clusive() -> (RE
2ec60 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
2ec70 20 7c 20 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a   | EXCLUSIVE).**
2ec80 0a 2a 2a 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e  .** The old Open
2ec90 45 78 63 6c 75 73 69 76 65 28 29 20 61 63 63 65  Exclusive() acce
2eca0 70 74 65 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61  pted a boolean a
2ecb0 72 67 75 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c  rgument - "delFl
2ecc0 61 67 22 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c  ag". If.** true,
2ecd0 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 63 6f   the file was co
2ece0 6e 66 69 67 75 72 65 64 20 74 6f 20 62 65 20 61  nfigured to be a
2ecf0 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2ed00 65 74 65 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a  eted when the.**
2ed10 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f   file handle clo
2ed20 73 65 64 2e 20 54 6f 20 61 63 68 69 65 76 65 20  sed. To achieve 
2ed30 74 68 65 20 73 61 6d 65 20 65 66 66 65 63 74 20  the same effect 
2ed40 75 73 69 6e 67 20 74 68 69 73 20 6e 65 77 20 0a  using this new .
2ed50 2a 2a 20 69 6e 74 65 72 66 61 63 65 2c 20 61 64  ** interface, ad
2ed60 64 20 74 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c  d the DELETEONCL
2ed70 4f 53 45 20 66 6c 61 67 20 74 6f 20 74 68 6f 73  OSE flag to thos
2ed80 65 20 73 70 65 63 69 66 69 65 64 20 61 62 6f 76  e specified abov
2ed90 65 20 66 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78  e for .** OpenEx
2eda0 63 6c 75 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74  clusive()..*/.st
2edb0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
2edc0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
2edd0 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
2ede0 20 20 2f 2a 20 54 68 65 20 56 46 53 20 66 6f 72    /* The VFS for
2edf0 20 77 68 69 63 68 20 74 68 69 73 20 69 73 20 74   which this is t
2ee00 68 65 20 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20  he xOpen method 
2ee10 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2ee20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
2ee30 20 20 2f 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66    /* Pathname of
2ee40 20 66 69 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e   file to be open
2ee50 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
2ee60 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  file *pFile,    
2ee70 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
2ee80 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 62   descriptor to b
2ee90 65 20 66 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20  e filled in */. 
2eea0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
2eeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2eec0 20 49 6e 70 75 74 20 66 6c 61 67 73 20 74 6f 20   Input flags to 
2eed0 63 6f 6e 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e  control the open
2eee0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ing */.  int *pO
2eef0 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
2ef00 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
2ef10 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64 20 74  flags returned t
2ef20 6f 20 53 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f  o SQLite core */
2ef30 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
2ef40 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  p = (unixFile *)
2ef50 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20  pFile;.  int fd 
2ef60 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20 20  = -1;           
2ef70 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2ef80 64 65 73 63 72 69 70 74 6f 72 20 72 65 74 75 72  descriptor retur
2ef90 6e 65 64 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f  ned by open() */
2efa0 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
2efb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2efc0 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
2efd0 73 73 20 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a  ss to open() */.
2efe0 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c    int eType = fl
2eff0 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b 20  ags&0xFFFFFF00; 
2f000 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65   /* Type of file
2f010 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
2f020 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
2f030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f040 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
2f050 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
2f060 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
2f070 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2f080 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
2f090 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
2f0a0 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
2f0b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2f0c0 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
2f0d0 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
2f0e0 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
2f0f0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f100 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
2f110 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
2f120 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
2f130 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
2f140 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
2f150 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
2f160 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2f170 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
2f180 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
2f190 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
2f1a0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
2f1b0 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
2f1c0 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
2f1d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
2f1e0 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
2f1f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
2f200 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
2f210 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
2f220 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
2f230 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
2f240 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
2f250 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
2f260 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2f270 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
2f280 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
2f290 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
2f2a0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
2f2b0 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
2f2c0 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
2f2d0 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
2f2e0 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
2f2f0 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
2f300 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
2f310 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
2f320 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
2f330 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
2f340 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
2f350 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
2f360 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
2f370 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
2f380 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
2f390 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
2f3a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2f3b0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
2f3c0 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
2f3d0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2f3e0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
2f3f0 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
2f400 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
2f410 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
2f420 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
2f430 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
2f440 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
2f450 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
2f460 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
2f470 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
2f480 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
2f490 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
2f4a0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
2f4b0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
2f4c0 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+2];.  const c
2f4d0 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
2f4e0 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
2f4f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2f500 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
2f510 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
2f520 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
2f530 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
2f540 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
2f550 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
2f560 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
2f570 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
2f580 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
2f590 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
2f5a0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
2f5b0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
2f5c0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
2f5d0 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
2f5e0 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
2f5f0 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
2f600 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
2f610 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
2f620 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
2f630 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
2f640 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
2f650 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
2f660 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
2f670 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
2f680 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
2f690 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
2f6a0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
2f6b0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
2f6c0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
2f6d0 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
2f6e0 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
2f6f0 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
2f700 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
2f710 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
2f720 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
2f730 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
2f740 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
2f750 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
2f760 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
2f770 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
2f780 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f790 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f7a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
2f7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
2f7c0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
2f7d0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
2f7e0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2f7f0 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
2f800 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
2f810 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
2f820 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f830 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
2f840 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
2f850 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
2f860 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2f870 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
2f880 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
2f890 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
2f8a0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
2f8b0 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
2f8c0 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
2f8d0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
2f8e0 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
2f8f0 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2f900 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
2f910 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
2f920 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2f930 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
2f940 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
2f950 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
2f960 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f970 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
2f980 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
2f990 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
2f9a0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
2f9b0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
2f9c0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
2f9d0 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
2f9e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
2f9f0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  .  );..  /* Dete
2fa00 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20  ct a pid change 
2fa10 61 6e 64 20 72 65 73 65 74 20 74 68 65 20 50 52  and reset the PR
2fa20 4e 47 2e 20 20 54 68 65 72 65 20 69 73 20 61 20  NG.  There is a 
2fa30 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 0a 20  race condition. 
2fa40 20 2a 2a 20 68 65 72 65 20 73 75 63 68 20 74 68   ** here such th
2fa50 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 74  at two or more t
2fa60 68 72 65 61 64 73 20 61 6c 6c 20 74 72 79 69 6e  hreads all tryin
2fa70 67 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  g to open databa
2fa80 73 65 73 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ses at.  ** the 
2fa90 73 61 6d 65 20 69 6e 73 74 61 6e 74 20 6d 69 67  same instant mig
2faa0 68 74 20 61 6c 6c 20 72 65 73 65 74 20 74 68 65  ht all reset the
2fab0 20 50 52 4e 47 2e 20 20 42 75 74 20 6d 75 6c 74   PRNG.  But mult
2fac0 69 70 6c 65 20 72 65 73 65 74 73 0a 20 20 2a 2a  iple resets.  **
2fad0 20 61 72 65 20 68 61 72 6d 6c 65 73 73 2e 0a 20   are harmless.. 
2fae0 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e 64 6f 6d   */.  if( random
2faf0 6e 65 73 73 50 69 64 21 3d 6f 73 47 65 74 70 69  nessPid!=osGetpi
2fb00 64 28 30 29 20 29 7b 0a 20 20 20 20 72 61 6e 64  d(0) ){.    rand
2fb10 6f 6d 6e 65 73 73 50 69 64 20 3d 20 6f 73 47 65  omnessPid = osGe
2fb20 74 70 69 64 28 30 29 3b 0a 20 20 20 20 73 71 6c  tpid(0);.    sql
2fb30 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2fb40 30 2c 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d  0,0);.  }..  mem
2fb50 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
2fb60 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20  (unixFile));..  
2fb70 69 66 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  if( eType==SQLIT
2fb80 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
2fb90 7b 0a 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64  {.    UnixUnused
2fba0 46 64 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20  Fd *pUnused;.   
2fbb0 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52   pUnused = findR
2fbc0 65 75 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c  eusableFd(zName,
2fbd0 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28   flags);.    if(
2fbe0 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20   pUnused ){.    
2fbf0 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
2fc00 66 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  fd;.    }else{. 
2fc10 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73       pUnused = s
2fc20 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
2fc30 73 69 7a 65 6f 66 28 2a 70 55 6e 75 73 65 64 29  sizeof(*pUnused)
2fc40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 55  );.      if( !pU
2fc50 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20  nused ){.       
2fc60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2fc70 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
2fc80 20 20 7d 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73    }.    p->pUnus
2fc90 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 0a 20  ed = pUnused;.. 
2fca0 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66     /* Database f
2fcb0 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 64 6f 75  ilenames are dou
2fcc0 62 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61  ble-zero termina
2fcd0 74 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20  ted if they are 
2fce0 6e 6f 74 0a 20 20 20 20 2a 2a 20 55 52 49 73 20  not.    ** URIs 
2fcf0 77 69 74 68 20 70 61 72 61 6d 65 74 65 72 73 2e  with parameters.
2fd00 20 20 48 65 6e 63 65 2c 20 74 68 65 79 20 63 61    Hence, they ca
2fd10 6e 20 61 6c 77 61 79 73 20 62 65 20 70 61 73 73  n always be pass
2fd20 65 64 20 69 6e 74 6f 0a 20 20 20 20 2a 2a 20 73  ed into.    ** s
2fd30 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
2fd40 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20 20 61  eter(). */.    a
2fd50 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
2fd60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29  SQLITE_OPEN_URI)
2fd70 20 7c 7c 20 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e   || zName[strlen
2fd80 28 7a 4e 61 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b  (zName)+1]==0 );
2fd90 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 7a  ..  }else if( !z
2fda0 4e 61 6d 65 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Name ){.    /* I
2fdb0 66 20 7a 4e 61 6d 65 20 69 73 20 4e 55 4c 4c 2c  f zName is NULL,
2fdc0 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
2fdd0 20 69 73 20 72 65 71 75 65 73 74 69 6e 67 20 61   is requesting a
2fde0 20 74 65 6d 70 20 66 69 6c 65 2e 20 2a 2f 0a 20   temp file. */. 
2fdf0 20 20 20 61 73 73 65 72 74 28 69 73 44 65 6c 65     assert(isDele
2fe00 74 65 20 26 26 20 21 73 79 6e 63 44 69 72 29 3b  te && !syncDir);
2fe10 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 47 65  .    rc = unixGe
2fe20 74 54 65 6d 70 6e 61 6d 65 28 4d 41 58 5f 50 41  tTempname(MAX_PA
2fe30 54 48 4e 41 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61  THNAME+2, zTmpna
2fe40 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  me);.    if( rc!
2fe50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2fe60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fe70 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20 3d     }.    zName =
2fe80 20 7a 54 6d 70 6e 61 6d 65 3b 0a 0a 20 20 20 20   zTmpname;..    
2fe90 2f 2a 20 47 65 6e 65 72 61 74 65 64 20 74 65 6d  /* Generated tem
2fea0 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 73  porary filenames
2feb0 20 61 72 65 20 61 6c 77 61 79 73 20 64 6f 75 62   are always doub
2fec0 6c 65 2d 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74  le-zero terminat
2fed0 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 75 73  ed.    ** for us
2fee0 65 20 62 79 20 73 71 6c 69 74 65 33 5f 75 72 69  e by sqlite3_uri
2fef0 5f 70 61 72 61 6d 65 74 65 72 28 29 2e 20 2a 2f  _parameter(). */
2ff00 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a 4e 61  .    assert( zNa
2ff10 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65 29  me[strlen(zName)
2ff20 2b 31 5d 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20  +1]==0 );.  }.. 
2ff30 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
2ff40 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
2ff50 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20 70  lags parameter p
2ff60 61 73 73 65 64 20 74 6f 20 50 4f 53 49 58 20 66  assed to POSIX f
2ff70 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65  unction.  ** ope
2ff80 6e 28 29 2e 20 54 68 65 73 65 20 6d 75 73 74 20  n(). These must 
2ff90 62 65 20 63 61 6c 63 75 6c 61 74 65 64 20 65 76  be calculated ev
2ffa0 65 6e 20 69 66 20 6f 70 65 6e 28 29 20 69 73 20  en if open() is 
2ffb0 6e 6f 74 20 63 61 6c 6c 65 64 2c 20 61 73 0a 20  not called, as. 
2ffc0 20 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20   ** they may be 
2ffd0 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20 6f  stored as part o
2ffe0 66 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c  f the file handl
2fff0 65 20 61 6e 64 20 75 73 65 64 20 62 79 20 74 68  e and used by th
30000 65 20 0a 20 20 2a 2a 20 27 63 6f 6e 63 68 20 66  e .  ** 'conch f
30010 69 6c 65 27 20 6c 6f 63 6b 69 6e 67 20 66 75 6e  ile' locking fun
30020 63 74 69 6f 6e 73 20 6c 61 74 65 72 20 6f 6e 2e  ctions later on.
30030 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 52 65 61    */.  if( isRea
30040 64 6f 6e 6c 79 20 29 20 20 6f 70 65 6e 46 6c 61  donly )  openFla
30050 67 73 20 7c 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a  gs |= O_RDONLY;.
30060 20 20 69 66 28 20 69 73 52 65 61 64 57 72 69 74    if( isReadWrit
30070 65 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d  e ) openFlags |=
30080 20 4f 5f 52 44 57 52 3b 0a 20 20 69 66 28 20 69   O_RDWR;.  if( i
30090 73 43 72 65 61 74 65 20 29 20 20 20 20 6f 70 65  sCreate )    ope
300a0 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 43 52 45 41  nFlags |= O_CREA
300b0 54 3b 0a 20 20 69 66 28 20 69 73 45 78 63 6c 75  T;.  if( isExclu
300c0 73 69 76 65 20 29 20 6f 70 65 6e 46 6c 61 67 73  sive ) openFlags
300d0 20 7c 3d 20 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f   |= (O_EXCL|O_NO
300e0 46 4f 4c 4c 4f 57 29 3b 0a 20 20 6f 70 65 6e 46  FOLLOW);.  openF
300f0 6c 61 67 73 20 7c 3d 20 28 4f 5f 4c 41 52 47 45  lags |= (O_LARGE
30100 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a  FILE|O_BINARY);.
30110 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
30120 20 20 20 6d 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f     mode_t openMo
30130 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
30140 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20   /* Permissions 
30150 74 6f 20 63 72 65 61 74 65 20 66 69 6c 65 20 77  to create file w
30160 69 74 68 20 2a 2f 0a 20 20 20 20 75 69 64 5f 74  ith */.    uid_t
30170 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   uid;           
30180 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 72           /* User
30190 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20  id for the file 
301a0 2a 2f 0a 20 20 20 20 67 69 64 5f 74 20 67 69 64  */.    gid_t gid
301b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
301c0 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20       /* Groupid 
301d0 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a  for the file */.
301e0 20 20 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65      rc = findCre
301f0 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d  ateFileMode(zNam
30200 65 2c 20 66 6c 61 67 73 2c 20 26 6f 70 65 6e 4d  e, flags, &openM
30210 6f 64 65 2c 20 26 75 69 64 2c 20 26 67 69 64 29  ode, &uid, &gid)
30220 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
30230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
30240 20 61 73 73 65 72 74 28 20 21 70 2d 3e 70 55 6e   assert( !p->pUn
30250 75 73 65 64 20 29 3b 0a 20 20 20 20 20 20 61 73  used );.      as
30260 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c  sert( eType==SQL
30270 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20  ITE_OPEN_WAL || 
30280 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
30290 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
302a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
302b0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 64  rc;.    }.    fd
302c0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
302d0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
302e0 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
302f0 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
30300 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
30310 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
30320 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  nFlags));.    if
30330 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
30340 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
30350 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
30360 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
30370 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
30380 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
30390 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
303a0 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
303b0 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
303c0 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
303d0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
303e0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
303f0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
30400 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
30410 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
30420 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
30430 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
30440 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
30450 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 69 73  RDONLY;.      is
30460 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
30470 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f      fd = robust_
30480 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e  open(zName, open
30490 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29  Flags, openMode)
304a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
304b0 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  fd<0 ){.      rc
304c0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
304d0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
304e0 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 4e  BKPT, "open", zN
304f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ame);.      goto
30500 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
30510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
30520 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
30530 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
30540 20 61 6e 64 20 69 66 20 63 72 65 61 74 69 6e 67   and if creating
30550 20 61 20 6e 65 77 20 72 6f 6c 6c 62 61 63 6b 0a   a new rollback.
30560 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6f      ** journal o
30570 72 20 57 41 4c 20 66 69 6c 65 2c 20 73 65 74 20  r WAL file, set 
30580 74 68 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66  the ownership of
30590 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20   the journal or 
305a0 57 41 4c 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  WAL to be.    **
305b0 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65   the same as the
305c0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
305d0 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
305e0 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
305f0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
30600 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
30610 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 6f  RNAL) ){.      o
30620 73 46 63 68 6f 77 6e 28 66 64 2c 20 75 69 64 2c  sFchown(fd, uid,
30630 20 67 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   gid);.    }.  }
30640 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30  .  assert( fd>=0
30650 20 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c   );.  if( pOutFl
30660 61 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74  ags ){.    *pOut
30670 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
30680 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e   }..  if( p->pUn
30690 75 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70  used ){.    p->p
306a0 55 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b  Unused->fd = fd;
306b0 0a 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d  .    p->pUnused-
306c0 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  >flags = flags;.
306d0 20 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c    }..  if( isDel
306e0 65 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58  ete ){.#if OS_VX
306f0 57 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20  WORKS.    zPath 
30700 3d 20 7a 4e 61 6d 65 3b 0a 23 65 6c 69 66 20 64  = zName;.#elif d
30710 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e  efined(SQLITE_UN
30720 4c 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45  LINK_AFTER_CLOSE
30730 29 0a 20 20 20 20 7a 50 61 74 68 20 3d 20 73 71  ).    zPath = sq
30740 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
30750 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  s", zName);.    
30760 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 7b 0a  if( zPath==0 ){.
30770 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
30780 73 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45  se(p, fd, __LINE
30790 5f 5f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  __);.      retur
307a0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
307b0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
307c0 6f 73 55 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b  osUnlink(zName);
307d0 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
307e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
307f0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
30800 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
30810 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
30820 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
30830 6e 6f 4c 6f 63 6b 20 3d 20 65 54 79 70 65 21 3d  noLock = eType!=
30840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
30850 5f 44 42 3b 0a 0a 20 20 0a 23 69 66 20 64 65 66  _DB;..  .#if def
30860 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
30870 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
30880 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
30890 20 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c   if( fstatfs(fd,
308a0 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20   &fsInfo) == -1 
308b0 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
308c0 45 72 72 6e 6f 28 70 2c 20 65 72 72 6e 6f 29 3b  Errno(p, errno);
308d0 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73  .    robust_clos
308e0 65 28 70 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f  e(p, fd, __LINE_
308f0 5f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  _);.    return S
30900 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
30910 53 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  SS;.  }.  if (0 
30920 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
30930 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
30940 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
30950 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70     ((unixFile*)p
30960 46 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c  File)->fsFlags |
30970 3d 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53  = SQLITE_FSFLAGS
30980 5f 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 20  _IS_MSDOS;.  }. 
30990 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d   if (0 == strncm
309a0 70 28 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66  p("exfat", fsInf
309b0 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20  o.f_fstypename, 
309c0 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78  5)) {.    ((unix
309d0 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73  File*)pFile)->fs
309e0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
309f0 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
30a00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
30a10 2f 2a 20 53 65 74 20 75 70 20 61 70 70 72 6f 70  /* Set up approp
30a20 72 69 61 74 65 20 63 74 72 6c 46 6c 61 67 73 20  riate ctrlFlags 
30a30 2a 2f 0a 20 20 69 66 28 20 69 73 44 65 6c 65 74  */.  if( isDelet
30a40 65 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  e )             
30a50 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
30a60 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b  UNIXFILE_DELETE;
30a70 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
30a80 79 20 29 20 20 20 20 20 20 20 20 20 20 20 20 20  y )             
30a90 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e   ctrlFlags |= UN
30aa0 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 3b 0a 20  IXFILE_RDONLY;. 
30ab0 20 69 66 28 20 6e 6f 4c 6f 63 6b 20 29 20 20 20   if( noLock )   
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
30ad0 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
30ae0 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 69  FILE_NOLOCK;.  i
30af0 66 28 20 73 79 6e 63 44 69 72 20 29 20 20 20 20  f( syncDir )    
30b00 20 20 20 20 20 20 20 20 20 20 20 20 20 63 74 72               ctr
30b10 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
30b20 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 20 20 69 66  LE_DIRSYNC;.  if
30b30 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
30b40 5f 4f 50 45 4e 5f 55 52 49 20 29 20 63 74 72 6c  _OPEN_URI ) ctrl
30b50 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
30b60 45 5f 55 52 49 3b 0a 0a 23 69 66 20 53 51 4c 49  E_URI;..#if SQLI
30b70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
30b80 47 5f 53 54 59 4c 45 0a 23 69 66 20 53 51 4c 49  G_STYLE.#if SQLI
30b90 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f  TE_PREFER_PROXY_
30ba0 4c 4f 43 4b 49 4e 47 0a 20 20 69 73 41 75 74 6f  LOCKING.  isAuto
30bb0 50 72 6f 78 79 20 3d 20 31 3b 0a 23 65 6e 64 69  Proxy = 1;.#endi
30bc0 66 0a 20 20 69 66 28 20 69 73 41 75 74 6f 50 72  f.  if( isAutoPr
30bd0 6f 78 79 20 26 26 20 28 7a 50 61 74 68 21 3d 4e  oxy && (zPath!=N
30be0 55 4c 4c 29 20 26 26 20 28 21 6e 6f 4c 6f 63 6b  ULL) && (!noLock
30bf0 29 20 26 26 20 70 56 66 73 2d 3e 78 4f 70 65 6e  ) && pVfs->xOpen
30c00 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 65 6e   ){.    char *en
30c10 76 66 6f 72 63 65 20 3d 20 67 65 74 65 6e 76 28  vforce = getenv(
30c20 22 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52  "SQLITE_FORCE_PR
30c30 4f 58 59 5f 4c 4f 43 4b 49 4e 47 22 29 3b 0a 20  OXY_LOCKING");. 
30c40 20 20 20 69 6e 74 20 75 73 65 50 72 6f 78 79 20     int useProxy 
30c50 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 51 4c  = 0;..    /* SQL
30c60 49 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f  ITE_FORCE_PROXY_
30c70 4c 4f 43 4b 49 4e 47 3d 3d 31 20 6d 65 61 6e 73  LOCKING==1 means
30c80 20 66 6f 72 63 65 20 61 6c 77 61 79 73 20 75 73   force always us
30c90 65 20 70 72 6f 78 79 2c 20 30 20 6d 65 61 6e 73  e proxy, 0 means
30ca0 20 0a 20 20 20 20 2a 2a 20 6e 65 76 65 72 20 75   .    ** never u
30cb0 73 65 20 70 72 6f 78 79 2c 20 4e 55 4c 4c 20 6d  se proxy, NULL m
30cc0 65 61 6e 73 20 75 73 65 20 70 72 6f 78 79 20 66  eans use proxy f
30cd0 6f 72 20 6e 6f 6e 2d 6c 6f 63 61 6c 20 66 69 6c  or non-local fil
30ce0 65 73 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20  es only.  */.   
30cf0 20 69 66 28 20 65 6e 76 66 6f 72 63 65 21 3d 4e   if( envforce!=N
30d00 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 75 73 65  ULL ){.      use
30d10 50 72 6f 78 79 20 3d 20 61 74 6f 69 28 65 6e 76  Proxy = atoi(env
30d20 66 6f 72 63 65 29 3e 30 3b 0a 20 20 20 20 7d 65  force)>0;.    }e
30d30 6c 73 65 7b 0a 20 20 20 20 20 20 75 73 65 50 72  lse{.      usePr
30d40 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f 2e 66  oxy = !(fsInfo.f
30d50 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c  _flags&MNT_LOCAL
30d60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
30d70 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20 20 20   useProxy ){.   
30d80 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e     rc = fillInUn
30d90 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66 64 2c  ixFile(pVfs, fd,
30da0 20 70 46 69 6c 65 2c 20 7a 50 61 74 68 2c 20 63   pFile, zPath, c
30db0 74 72 6c 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  trlFlags);.     
30dc0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30dd0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
30de0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
30df0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
30e00 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
30e10 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
30e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30e30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
30e40 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
30e50 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
30e60 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
30e70 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
30e80 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
30e90 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
30ea0 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
30eb0 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
30ec0 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
30ed0 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
30ee0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
30ef0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
30f00 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
30f10 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
30f20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
30f30 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
30f40 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30f50 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30f60 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
30f70 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
30f80 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
30f90 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
30fa0 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
30fb0 66 64 2c 20 70 46 69 6c 65 2c 20 7a 50 61 74 68  fd, pFile, zPath
30fc0 2c 20 63 74 72 6c 46 6c 61 67 73 29 3b 0a 0a 6f  , ctrlFlags);..o
30fd0 70 65 6e 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20  pen_finished:.  
30fe0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30ff0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
31000 5f 66 72 65 65 28 70 2d 3e 70 55 6e 75 73 65 64  _free(p->pUnused
31010 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
31020 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65  rc;.}.../*.** De
31030 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 61 74  lete the file at
31040 20 7a 50 61 74 68 2e 20 49 66 20 74 68 65 20 64   zPath. If the d
31050 69 72 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20  irSync argument 
31060 69 73 20 74 72 75 65 2c 20 66 73 79 6e 63 28 29  is true, fsync()
31070 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
31080 79 20 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67  y after deleting
31090 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74   the file..*/.st
310a0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44 65 6c  atic int unixDel
310b0 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ete(.  sqlite3_v
310c0 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20  fs *NotUsed,    
310d0 20 2f 2a 20 56 46 53 20 63 6f 6e 74 61 69 6e 69   /* VFS containi
310e0 6e 67 20 74 68 69 73 20 61 73 20 74 68 65 20 78  ng this as the x
310f0 44 65 6c 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f  Delete method */
31100 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
31110 50 61 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20  Path,        /* 
31120 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
31130 62 65 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  be deleted */.  
31140 69 6e 74 20 64 69 72 53 79 6e 63 20 20 20 20 20  int dirSync     
31150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
31160 74 72 75 65 2c 20 66 73 79 6e 63 28 29 20 64 69  true, fsync() di
31170 72 65 63 74 6f 72 79 20 61 66 74 65 72 20 64 65  rectory after de
31180 6c 65 74 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29  leting file */.)
31190 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
311a0 49 54 45 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44  ITE_OK;.  UNUSED
311b0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
311c0 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
311d0 4f 45 72 72 6f 72 28 72 65 74 75 72 6e 20 53 51  OError(return SQ
311e0 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
311f0 45 29 3b 0a 20 20 69 66 28 20 6f 73 55 6e 6c 69  E);.  if( osUnli
31200 6e 6b 28 7a 50 61 74 68 29 3d 3d 28 2d 31 29 20  nk(zPath)==(-1) 
31210 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e 6f  ){.    if( errno
31220 3d 3d 45 4e 4f 45 4e 54 0a 23 69 66 20 4f 53 5f  ==ENOENT.#if OS_
31230 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20 20 20  VXWORKS.        
31240 7c 7c 20 6f 73 41 63 63 65 73 73 28 7a 50 61 74  || osAccess(zPat
31250 68 2c 30 29 21 3d 30 0a 23 65 6e 64 69 66 0a 20  h,0)!=0.#endif. 
31260 20 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d     ){.      rc =
31270 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
31280 4c 45 54 45 5f 4e 4f 45 4e 54 3b 0a 20 20 20 20  LETE_NOENT;.    
31290 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
312a0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
312b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
312c0 54 45 2c 20 22 75 6e 6c 69 6e 6b 22 2c 20 7a 50  TE, "unlink", zP
312d0 61 74 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ath);.    }.    
312e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
312f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
31300 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20  SABLE_DIRSYNC.  
31310 69 66 28 20 28 64 69 72 53 79 6e 63 20 26 20 31  if( (dirSync & 1
31320 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
31330 66 64 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f  fd;.    rc = osO
31340 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50 61  penDirectory(zPa
31350 74 68 2c 20 26 66 64 29 3b 0a 20 20 20 20 69 66  th, &fd);.    if
31360 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
31370 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ){.#if OS_VXWORK
31380 53 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  S.      if( fsyn
31390 63 28 66 64 29 3d 3d 2d 31 20 29 0a 23 65 6c 73  c(fd)==-1 ).#els
313a0 65 0a 20 20 20 20 20 20 69 66 28 20 66 73 79 6e  e.      if( fsyn
313b0 63 28 66 64 29 20 29 0a 23 65 6e 64 69 66 0a 20  c(fd) ).#endif. 
313c0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 72       {.        r
313d0 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
313e0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  (SQLITE_IOERR_DI
313f0 52 5f 46 53 59 4e 43 2c 20 22 66 73 79 6e 63 22  R_FSYNC, "fsync"
31400 2c 20 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  , zPath);.      
31410 7d 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  }.      robust_c
31420 6c 6f 73 65 28 30 2c 20 66 64 2c 20 5f 5f 4c 49  lose(0, fd, __LI
31430 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  NE__);.    }else
31440 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31450 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20  CANTOPEN ){.    
31460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
31470 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
31480 69 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  if.  return rc;.
31490 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 68  }../*.** Test th
314a0 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 6f  e existence of o
314b0 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
314c0 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20 7a 50 61  ions of file zPa
314d0 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65 73 74 20  th. The.** test 
314e0 70 65 72 66 6f 72 6d 65 64 20 64 65 70 65 6e 64  performed depend
314f0 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  s on the value o
31500 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20  f flags:.**.**  
31510 20 20 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53     SQLITE_ACCESS
31520 5f 45 58 49 53 54 53 3a 20 52 65 74 75 72 6e 20  _EXISTS: Return 
31530 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 65 78  1 if the file ex
31540 69 73 74 73 0a 2a 2a 20 20 20 20 20 53 51 4c 49  ists.**     SQLI
31550 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  TE_ACCESS_READWR
31560 49 54 45 3a 20 52 65 74 75 72 6e 20 31 20 69 66  ITE: Return 1 if
31570 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65 61   the file is rea
31580 64 20 61 6e 64 20 77 72 69 74 61 62 6c 65 2e 0a  d and writable..
31590 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43  **     SQLITE_AC
315a0 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59 3a 20 52  CESS_READONLY: R
315b0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 66  eturn 1 if the f
315c0 69 6c 65 20 69 73 20 72 65 61 64 61 62 6c 65 2e  ile is readable.
315d0 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
315e0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
315f0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 41 63 63  atic int unixAcc
31600 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ess(.  sqlite3_v
31610 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 20 20 2f  fs *NotUsed,   /
31620 2a 20 54 68 65 20 56 46 53 20 63 6f 6e 74 61 69  * The VFS contai
31630 6e 69 6e 67 20 74 68 69 73 20 78 41 63 63 65 73  ning this xAcces
31640 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  s method */.  co
31650 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
31660 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 6f 66        /* Path of
31670 20 74 68 65 20 66 69 6c 65 20 74 6f 20 65 78 61   the file to exa
31680 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  mine */.  int fl
31690 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
316a0 20 20 2f 2a 20 57 68 61 74 20 64 6f 20 77 65 20    /* What do we 
316b0 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e 20 61 62  want to learn ab
316c0 6f 75 74 20 74 68 65 20 7a 50 61 74 68 20 66 69  out the zPath fi
316d0 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52  le? */.  int *pR
316e0 65 73 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  esOut           
316f0 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74   /* Write result
31700 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65 20 2a 2f   boolean here */
31710 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f 64 65 20  .){.  int amode 
31720 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  = 0;.  UNUSED_PA
31730 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
31740 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
31750 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
31760 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3b  TE_IOERR_ACCESS;
31770 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 66 6c   );.  switch( fl
31780 61 67 73 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ags ){.    case 
31790 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
317a0 49 53 54 53 3a 0a 20 20 20 20 20 20 61 6d 6f 64  ISTS:.      amod
317b0 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20 20 20 20  e = F_OK;.      
317c0 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
317d0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45  SQLITE_ACCESS_RE
317e0 41 44 57 52 49 54 45 3a 0a 20 20 20 20 20 20 61  ADWRITE:.      a
317f0 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52 5f 4f 4b  mode = W_OK|R_OK
31800 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31810 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
31820 43 43 45 53 53 5f 52 45 41 44 3a 0a 20 20 20 20  CCESS_READ:.    
31830 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f 4b 3b 0a    amode = R_OK;.
31840 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
31850 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
31860 20 61 73 73 65 72 74 28 21 22 49 6e 76 61 6c 69   assert(!"Invali
31870 64 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  d flags argument
31880 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 4f  ");.  }.  *pResO
31890 75 74 20 3d 20 28 6f 73 41 63 63 65 73 73 28 7a  ut = (osAccess(z
318a0 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30 29  Path, amode)==0)
318b0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 3d 3d 53  ;.  if( flags==S
318c0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
318d0 53 54 53 20 26 26 20 2a 70 52 65 73 4f 75 74 20  STS && *pResOut 
318e0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
318f0 61 74 20 62 75 66 3b 0a 20 20 20 20 69 66 28 20  at buf;.    if( 
31900 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c  0==osStat(zPath,
31910 20 26 62 75 66 29 20 26 26 20 62 75 66 2e 73 74   &buf) && buf.st
31920 5f 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _size==0 ){.    
31930 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
31940 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
31950 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
31960 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
31970 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
31980 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
31990 68 6e 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74  hname. The relat
319a0 69 76 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73  ive path.** is s
319b0 74 6f 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74  tored as a nul-t
319c0 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67  erminated string
319d0 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 70   in the buffer p
319e0 6f 69 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20  ointed to by.** 
319f0 7a 50 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f  zPath. .**.** zO
31a00 75 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  ut points to a b
31a10 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
31a20 74 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78  t sqlite3_vfs.mx
31a30 50 61 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a  Pathname bytes .
31a40 2a 2a 20 28 69 6e 20 74 68 69 73 20 63 61 73 65  ** (in this case
31a50 2c 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62  , MAX_PATHNAME b
31a60 79 74 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d  ytes). The full-
31a70 70 61 74 68 20 69 73 20 77 72 69 74 74 65 6e 20  path is written 
31a80 74 6f 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  to.** this buffe
31a90 72 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  r before returni
31aa0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
31ab0 74 20 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61  t unixFullPathna
31ac0 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
31ad0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
31ae0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
31af0 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
31b00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
31b10 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
31b20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61  /* Possibly rela
31b30 74 69 76 65 20 69 6e 70 75 74 20 70 61 74 68 20  tive input path 
31b40 2a 2f 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20  */.  int nOut,  
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75     /* Size of ou
31b70 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
31b80 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ytes */.  char *
31b90 7a 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  zOut            
31ba0 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
31bb0 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20  t buffer */.){. 
31bc0 20 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 2f   int nByte;..  /
31bd0 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69  * It's odd to si
31be0 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72  mulate an io-err
31bf0 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72 65 61  or here, but rea
31c00 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75 73 74  lly this is just
31c10 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  .  ** using the 
31c20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74  io-error infrast
31c30 72 75 63 74 75 72 65 20 74 6f 20 74 65 73 74 20  ructure to test 
31c40 74 68 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64  that SQLite hand
31c50 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75  les this.  ** fu
31c60 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20  nction failing. 
31c70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
31c80 75 6c 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72  uld fail if, for
31c90 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20   example, the.  
31ca0 2a 2a 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69  ** current worki
31cb0 6e 67 20 64 69 72 65 63 74 6f 72 79 20 68 61 73  ng directory has
31cc0 20 62 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a   been unlinked..
31cd0 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49    */.  SimulateI
31ce0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
31cf0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a  QLITE_ERROR );..
31d00 20 20 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e    assert( pVfs->
31d10 6d 78 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f  mxPathname==MAX_
31d20 50 41 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e  PATHNAME );.  UN
31d30 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
31d40 56 66 73 29 3b 0a 0a 20 20 2f 2a 20 41 74 74 65  Vfs);..  /* Atte
31d50 6d 70 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  mpt to resolve t
31d60 68 65 20 70 61 74 68 20 61 73 20 69 66 20 69 74  he path as if it
31d70 20 77 65 72 65 20 61 20 73 79 6d 62 6f 6c 69 63   were a symbolic
31d80 20 6c 69 6e 6b 2e 20 49 66 20 69 74 20 69 73 0a   link. If it is.
31d90 20 20 2a 2a 20 61 20 73 79 6d 62 6f 6c 69 63 20    ** a symbolic 
31da0 6c 69 6e 6b 2c 20 74 68 65 20 72 65 73 6f 6c 76  link, the resolv
31db0 65 64 20 70 61 74 68 20 69 73 20 73 74 6f 72 65  ed path is store
31dc0 64 20 69 6e 20 62 75 66 66 65 72 20 7a 4f 75 74  d in buffer zOut
31dd0 5b 5d 2e 20 4f 72 2c 20 69 66 0a 20 20 2a 2a 20  []. Or, if.  ** 
31de0 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20 66  the identified f
31df0 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
31e00 62 6f 6c 69 63 20 6c 69 6e 6b 20 6f 72 20 64 6f  bolic link or do
31e10 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
31e20 65 6e 0a 20 20 2a 2a 20 7a 50 61 74 68 20 69 73  en.  ** zPath is
31e30 20 63 6f 70 69 65 64 20 64 69 72 65 63 74 6c 79   copied directly
31e40 20 69 6e 74 6f 20 7a 4f 75 74 2e 20 45 69 74 68   into zOut. Eith
31e50 65 72 20 77 61 79 2c 20 6e 42 79 74 65 20 69 73  er way, nByte is
31e60 20 6c 65 66 74 20 73 65 74 20 74 6f 0a 20 20 2a   left set to.  *
31e70 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * the size of th
31e80 65 20 73 74 72 69 6e 67 20 63 6f 70 69 65 64 20  e string copied 
31e90 69 6e 74 6f 20 7a 4f 75 74 5b 5d 20 69 6e 20 62  into zOut[] in b
31ea0 79 74 65 73 2e 20 20 2a 2f 0a 20 20 6e 42 79 74  ytes.  */.  nByt
31eb0 65 20 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a  e = osReadlink(z
31ec0 50 61 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74  Path, zOut, nOut
31ed0 2d 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  -1);.  if( nByte
31ee0 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72  <0 ){.    if( er
31ef0 72 6e 6f 21 3d 45 49 4e 56 41 4c 20 26 26 20 65  rno!=EINVAL && e
31f00 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a  rrno!=ENOENT ){.
31f10 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
31f20 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
31f30 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
31f40 22 72 65 61 64 6c 69 6e 6b 22 2c 20 7a 50 61 74  "readlink", zPat
31f50 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4f  h);.    }.    zO
31f60 75 74 5b 6e 4f 75 74 2d 31 5d 20 3d 20 27 5c 30  ut[nOut-1] = '\0
31f70 27 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ';.    sqlite3_s
31f80 6e 70 72 69 6e 74 66 28 6e 4f 75 74 2d 31 2c 20  nprintf(nOut-1, 
31f90 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a 50 61 74  zOut, "%s", zPat
31fa0 68 29 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20  h);.    nByte = 
31fb0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
31fc0 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zOut);.  }else{.
31fd0 20 20 20 20 7a 4f 75 74 5b 6e 42 79 74 65 5d 20      zOut[nByte] 
31fe0 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a 20 20 2f  = '\0';.  }..  /
31ff0 2a 20 49 66 20 62 75 66 66 65 72 20 7a 4f 75 74  * If buffer zOut
32000 5b 5d 20 6e 6f 77 20 63 6f 6e 74 61 69 6e 73 20  [] now contains 
32010 61 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68  an absolute path
32020 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
32030 67 20 6d 6f 72 65 0a 20 20 2a 2a 20 74 6f 20 64  g more.  ** to d
32040 6f 2e 20 49 66 20 69 74 20 63 6f 6e 74 61 69 6e  o. If it contain
32050 73 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  s a relative pat
32060 68 2c 20 64 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  h, do the follow
32070 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ing:.  **.  **  
32080 20 2a 20 6d 6f 76 65 20 74 68 65 20 72 65 6c 61   * move the rela
32090 74 69 76 65 20 70 61 74 68 20 73 74 72 69 6e 67  tive path string
320a0 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 61   so that it is a
320b0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 0a  t the end of th.
320c0 20 20 2a 2a 20 20 20 20 20 7a 4f 75 74 5b 5d 20    **     zOut[] 
320d0 62 75 66 66 65 72 2e 0a 20 20 2a 2a 20 20 20 2a  buffer..  **   *
320e0 20 43 61 6c 6c 20 67 65 74 63 77 64 28 29 20 74   Call getcwd() t
320f0 6f 20 72 65 61 64 20 74 68 65 20 70 61 74 68 20  o read the path 
32100 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  of the current w
32110 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
32120 20 0a 20 20 2a 2a 20 20 20 20 20 69 6e 74 6f 20   .  **     into 
32130 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
32140 20 7a 4f 75 74 5b 5d 20 62 75 66 66 65 72 2e 0a   zOut[] buffer..
32150 20 20 2a 2a 20 20 20 2a 20 41 70 70 65 6e 64 20    **   * Append 
32160 61 20 27 2f 27 20 63 68 61 72 61 63 74 65 72 20  a '/' character 
32170 74 6f 20 74 68 65 20 63 77 64 20 73 74 72 69 6e  to the cwd strin
32180 67 20 61 6e 64 20 6d 6f 76 65 20 74 68 65 20 0a  g and move the .
32190 20 20 2a 2a 20 20 20 20 20 72 65 6c 61 74 69 76    **     relativ
321a0 65 20 70 61 74 68 20 62 61 63 6b 20 77 69 74 68  e path back with
321b0 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 73 6f  in the buffer so
321c0 20 74 68 61 74 20 69 74 20 69 6d 6d 65 64 69 61   that it immedia
321d0 74 65 6c 79 20 0a 20 20 2a 2a 20 20 20 20 20 66  tely .  **     f
321e0 6f 6c 6c 6f 77 73 20 74 68 65 20 27 2f 27 2e 0a  ollows the '/'..
321f0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 63    **.  ** This c
32200 6f 64 65 20 69 73 20 77 72 69 74 74 65 6e 20 73  ode is written s
32210 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 63 6f  o that if the co
32220 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  mbination of the
32230 20 43 57 44 20 61 6e 64 20 72 65 6c 61 74 69 76   CWD and relativ
32240 65 0a 20 20 2a 2a 20 70 61 74 68 20 61 72 65 20  e.  ** path are 
32250 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
32260 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  allocated size o
32270 66 20 7a 4f 75 74 5b 5d 20 74 68 65 20 43 57 44  f zOut[] the CWD
32280 20 69 73 20 73 69 6c 65 6e 74 6c 79 0a 20 20 2a   is silently.  *
32290 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 6d  * truncated to m
322a0 61 6b 65 20 69 74 20 66 69 74 2e 20 54 68 69 73  ake it fit. This
322b0 20 69 73 20 4f 6b 2c 20 61 73 20 53 51 4c 69 74   is Ok, as SQLit
322c0 65 20 72 65 66 75 73 65 73 20 74 6f 20 6f 70 65  e refuses to ope
322d0 6e 20 61 6e 79 0a 20 20 2a 2a 20 66 69 6c 65 20  n any.  ** file 
322e0 66 6f 72 20 77 68 69 63 68 20 74 68 69 73 20 66  for which this f
322f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
32300 61 20 66 75 6c 6c 20 70 61 74 68 20 6c 61 72 67  a full path larg
32310 65 72 20 74 68 61 6e 20 28 6e 4f 75 74 2d 38 29  er than (nOut-8)
32320 0a 20 20 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  .  ** bytes in s
32330 69 7a 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 7a  ize.  */.  if( z
32340 4f 75 74 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20  Out[0]!='/' ){. 
32350 20 20 20 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20     int nCwd;.   
32360 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 4f 75 74   int nRem = nOut
32370 2d 6e 42 79 74 65 2d 31 3b 0a 20 20 20 20 6d 65  -nByte-1;.    me
32380 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e 52 65 6d  mmove(&zOut[nRem
32390 5d 2c 20 7a 4f 75 74 2c 20 6e 42 79 74 65 2b 31  ], zOut, nByte+1
323a0 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e 52 65 6d  );.    zOut[nRem
323b0 2d 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  -1] = '\0';.    
323c0 69 66 28 20 6f 73 47 65 74 63 77 64 28 7a 4f 75  if( osGetcwd(zOu
323d0 74 2c 20 6e 52 65 6d 2d 31 29 3d 3d 30 20 29 7b  t, nRem-1)==0 ){
323e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
323f0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
32400 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
32410 20 22 67 65 74 63 77 64 22 2c 20 7a 50 61 74 68   "getcwd", zPath
32420 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 77  );.    }.    nCw
32430 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  d = sqlite3Strle
32440 6e 33 30 28 7a 4f 75 74 29 3b 0a 20 20 20 20 61  n30(zOut);.    a
32450 73 73 65 72 74 28 20 6e 43 77 64 3c 3d 6e 52 65  ssert( nCwd<=nRe
32460 6d 2d 31 20 29 3b 0a 20 20 20 20 7a 4f 75 74 5b  m-1 );.    zOut[
32470 6e 43 77 64 5d 20 3d 20 27 2f 27 3b 0a 20 20 20  nCwd] = '/';.   
32480 20 6d 65 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e   memmove(&zOut[n
32490 43 77 64 2b 31 5d 2c 20 26 7a 4f 75 74 5b 6e 52  Cwd+1], &zOut[nR
324a0 65 6d 5d 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20  em], nByte+1);. 
324b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
324c0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e  ITE_OK;.}...#ifn
324d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
324e0 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f  LOAD_EXTENSION./
324f0 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 73 20  *.** Interfaces 
32500 66 6f 72 20 6f 70 65 6e 69 6e 67 20 61 20 73 68  for opening a sh
32510 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 66 69  ared library, fi
32520 6e 64 69 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e  nding entry poin
32530 74 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 65  ts.** within the
32540 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2c   shared library,
32550 20 61 6e 64 20 63 6c 6f 73 69 6e 67 20 74 68 65   and closing the
32560 20 73 68 61 72 65 64 20 6c 69 62 72 61 72 79 2e   shared library.
32570 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c  .*/.#include <dl
32580 66 63 6e 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f  fcn.h>.static vo
32590 69 64 20 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73  id *unixDlOpen(s
325a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
325b0 73 65 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  sed, const char 
325c0 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55  *zFilename){.  U
325d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
325e0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
325f0 72 6e 20 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e  rn dlopen(zFilen
32600 61 6d 65 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20  ame, RTLD_NOW | 
32610 52 54 4c 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a  RTLD_GLOBAL);.}.
32620 0a 2f 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61  ./*.** SQLite ca
32630 6c 6c 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  lls this functio
32640 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66  n immediately af
32650 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e  ter a call to un
32660 69 78 44 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20  ixDlSym() or.** 
32670 75 6e 69 78 44 6c 4f 70 65 6e 28 29 20 66 61 69  unixDlOpen() fai
32680 6c 73 20 28 72 65 74 75 72 6e 73 20 61 20 6e 75  ls (returns a nu
32690 6c 6c 20 70 6f 69 6e 74 65 72 29 2e 20 49 66 20  ll pointer). If 
326a0 61 20 6d 6f 72 65 20 64 65 74 61 69 6c 65 64 20  a more detailed 
326b0 65 72 72 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65  error.** message
326c0 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 69   is available, i
326d0 74 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  t is written to 
326e0 7a 42 75 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65  zBufOut. If no e
326f0 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
32700 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42  is available, zB
32710 75 66 4f 75 74 20 69 73 20 6c 65 66 74 20 75 6e  ufOut is left un
32720 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 53 51 4c  modified and SQL
32730 69 74 65 20 75 73 65 73 20 61 20 64 65 66 61 75  ite uses a defau
32740 6c 74 0a 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73  lt.** error mess
32750 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
32760 6f 69 64 20 75 6e 69 78 44 6c 45 72 72 6f 72 28  oid unixDlError(
32770 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
32780 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
32790 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
327a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
327b0 72 72 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  rr;.  UNUSED_PAR
327c0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
327d0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
327e0 78 28 29 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c  x();.  zErr = dl
327f0 65 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a  error();.  if( z
32800 45 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Err ){.    sqlit
32810 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
32820 2c 20 7a 42 75 66 4f 75 74 2c 20 22 25 73 22 2c  , zBufOut, "%s",
32830 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e   zErr);.  }.  un
32840 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
32850 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  }.static void (*
32860 75 6e 69 78 44 6c 53 79 6d 28 73 71 6c 69 74 65  unixDlSym(sqlite
32870 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
32880 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
32890 68 61 72 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  har*zSym))(void)
328a0 7b 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43  {.  /* .  ** GCC
328b0 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69 63 2d   with -pedantic-
328c0 65 72 72 6f 72 73 20 73 61 79 73 20 74 68 61 74  errors says that
328d0 20 43 39 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c   C90 does not al
328e0 6c 6f 77 20 61 20 76 6f 69 64 2a 20 74 6f 20 62  low a void* to b
328f0 65 0a 20 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f  e.  ** cast into
32900 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
32910 66 75 6e 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79  function.  And y
32920 65 74 20 74 68 65 20 6c 69 62 72 61 72 79 20 64  et the library d
32930 6c 73 79 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20  lsym() routine. 
32940 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 76 6f   ** returns a vo
32950 69 64 2a 20 77 68 69 63 68 20 69 73 20 72 65 61  id* which is rea
32960 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
32970 20 61 20 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f   a function.  So
32980 20 68 6f 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20   how do we.  ** 
32990 75 73 65 20 64 6c 73 79 6d 28 29 20 77 69 74 68  use dlsym() with
329a0 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72   -pedantic-error
329b0 73 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72  s?.  **.  ** Var
329c0 69 61 62 6c 65 20 78 20 62 65 6c 6f 77 20 69 73  iable x below is
329d0 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 61   defined to be a
329e0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
329f0 6e 63 74 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20  nction taking.  
32a00 2a 2a 20 70 61 72 61 6d 65 74 65 72 73 20 76 6f  ** parameters vo
32a10 69 64 2a 20 61 6e 64 20 63 6f 6e 73 74 20 63 68  id* and const ch
32a20 61 72 2a 20 61 6e 64 20 72 65 74 75 72 6e 69 6e  ar* and returnin
32a30 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  g a pointer to a
32a40 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20   function..  ** 
32a50 57 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 78 20  We initialize x 
32a60 62 79 20 61 73 73 69 67 6e 69 6e 67 20 69 74 20  by assigning it 
32a70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
32a80 20 64 6c 73 79 6d 28 29 20 66 75 6e 63 74 69 6f   dlsym() functio
32a90 6e 2e 0a 20 20 2a 2a 20 28 54 68 61 74 20 61 73  n..  ** (That as
32aa0 73 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  signment require
32ab0 73 20 61 20 63 61 73 74 2e 29 20 20 54 68 65 6e  s a cast.)  Then
32ac0 20 77 65 20 63 61 6c 6c 20 74 68 65 20 66 75 6e   we call the fun
32ad0 63 74 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20  ction that.  ** 
32ae0 78 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20  x points to.  . 
32af0 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f   **.  ** This wo
32b00 72 6b 2d 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c  rk-around is unl
32b10 69 6b 65 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f  ikely to work co
32b20 72 72 65 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73  rrectly on any s
32b30 79 73 74 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a  ystem where.  **
32b40 20 79 6f 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e   you really cann
32b50 6f 74 20 63 61 73 74 20 61 20 66 75 6e 63 74 69  ot cast a functi
32b60 6f 6e 20 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20  on pointer into 
32b70 76 6f 69 64 2a 2e 20 20 42 75 74 20 74 68 65 6e  void*.  But then
32b80 2c 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74  , on the.  ** ot
32b90 68 65 72 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28  her hand, dlsym(
32ba0 29 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20  ) will not work 
32bb0 6f 6e 20 73 75 63 68 20 61 20 73 79 73 74 65 6d  on such a system
32bc0 20 65 69 74 68 65 72 2c 20 73 6f 20 77 65 20 68   either, so we h
32bd0 61 76 65 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61  ave.  ** not rea
32be0 6c 6c 79 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e  lly lost anythin
32bf0 67 2e 0a 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28  g..  */.  void (
32c00 2a 28 2a 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  *(*x)(void*,cons
32c10 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 3b  t char*))(void);
32c20 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
32c30 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
32c40 78 20 3d 20 28 76 6f 69 64 28 2a 28 2a 29 28 76  x = (void(*(*)(v
32c50 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
32c60 29 29 28 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a  ))(void))dlsym;.
32c70 20 20 72 65 74 75 72 6e 20 28 2a 78 29 28 70 2c    return (*x)(p,
32c80 20 7a 53 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63   zSym);.}.static
32c90 20 76 6f 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73   void unixDlClos
32ca0 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  e(sqlite3_vfs *N
32cb0 6f 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 48  otUsed, void *pH
32cc0 61 6e 64 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44  andle){.  UNUSED
32cd0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32ce0 65 64 29 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70  ed);.  dlclose(p
32cf0 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65  Handle);.}.#else
32d00 20 2f 2a 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d   /* if SQLITE_OM
32d10 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
32d20 4e 20 69 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f  N is defined: */
32d30 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32d40 6c 4f 70 65 6e 20 20 30 0a 20 20 23 64 65 66 69  lOpen  0.  #defi
32d50 6e 65 20 75 6e 69 78 44 6c 45 72 72 6f 72 20 30  ne unixDlError 0
32d60 0a 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44  .  #define unixD
32d70 6c 53 79 6d 20 20 20 30 0a 20 20 23 64 65 66 69  lSym   0.  #defi
32d80 6e 65 20 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30  ne unixDlClose 0
32d90 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
32da0 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73 20  rite nBuf bytes 
32db0 6f 66 20 72 61 6e 64 6f 6d 20 64 61 74 61 20 74  of random data t
32dc0 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  o the supplied b
32dd0 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73  uffer zBuf..*/.s
32de0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 61  tatic int unixRa
32df0 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33  ndomness(sqlite3
32e00 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69  _vfs *NotUsed, i
32e10 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a  nt nBuf, char *z
32e20 42 75 66 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Buf){.  UNUSED_P
32e30 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
32e40 29 3b 0a 20 20 61 73 73 65 72 74 28 28 73 69 7a  );.  assert((siz
32e50 65 5f 74 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f  e_t)nBuf>=(sizeo
32e60 66 28 74 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66  f(time_t)+sizeof
32e70 28 69 6e 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57  (int)));..  /* W
32e80 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61  e have to initia
32e90 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65  lize zBuf to pre
32ea0 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72  vent valgrind fr
32eb0 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a  om reporting.  *
32ec0 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72  * errors.  The r
32ed0 65 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79  eports issued by
32ee0 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e   valgrind are in
32ef0 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75  correct - we wou
32f00 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74  ld.  ** prefer t
32f10 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65  hat the randomne
32f20 73 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  ss be increased 
32f30 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66  by making use of
32f40 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74   the.  ** uninit
32f50 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e  ialized space in
32f60 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67   zBuf - but valg
32f70 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64  rind errors tend
32f80 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73   to worry.  ** s
32f90 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68  ome users.  Rath
32fa0 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69  er than argue, i
32fb0 74 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a  t seems easier j
32fc0 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ust to initializ
32fd0 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65  e.  ** the whole
32fe0 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e   array and silen
32ff0 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65  ce valgrind, eve
33000 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20  n if that means 
33010 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a  less randomness.
33020 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64    ** in the rand
33030 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20  om seed..  **.  
33040 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c  ** When testing,
33050 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42   initializing zB
33060 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20  uf[] to zero is 
33070 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74  all we do.  That
33080 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74   means.  ** that
33090 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74   we always use t
330a0 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e  he same random n
330b0 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 20  umber sequence. 
330c0 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a   This makes the.
330d0 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61    ** tests repea
330e0 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  table..  */.  me
330f0 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42  mset(zBuf, 0, nB
33100 75 66 29 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73  uf);.  randomnes
33110 73 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28  sPid = osGetpid(
33120 30 29 3b 20 20 0a 23 69 66 20 21 64 65 66 69 6e  0);  .#if !defin
33130 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
33140 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
33150 54 45 5f 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45  TE_OMIT_RANDOMNE
33160 53 53 29 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20  SS).  {.    int 
33170 66 64 2c 20 67 6f 74 3b 0a 20 20 20 20 66 64 20  fd, got;.    fd 
33180 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f  = robust_open("/
33190 64 65 76 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f  dev/urandom", O_
331a0 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20  RDONLY, 0);.    
331b0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
331c0 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20    time_t t;.    
331d0 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 20 20    time(&t);.    
331e0 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 26    memcpy(zBuf, &
331f0 74 2c 20 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20  t, sizeof(t));. 
33200 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75       memcpy(&zBu
33210 66 5b 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72  f[sizeof(t)], &r
33220 61 6e 64 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69  andomnessPid, si
33230 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50  zeof(randomnessP
33240 69 64 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65  id));.      asse
33250 72 74 28 20 73 69 7a 65 6f 66 28 74 29 2b 73 69  rt( sizeof(t)+si
33260 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50  zeof(randomnessP
33270 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
33280 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
33290 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
332a0 7a 65 6f 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50  zeof(randomnessP
332b0 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
332c0 20 20 20 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20        do{ got = 
332d0 6f 73 52 65 61 64 28 66 64 2c 20 7a 42 75 66 2c  osRead(fd, zBuf,
332e0 20 6e 42 75 66 29 3b 20 7d 77 68 69 6c 65 28 20   nBuf); }while( 
332f0 67 6f 74 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d  got<0 && errno==
33300 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20 72  EINTR );.      r
33310 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66  obust_close(0, f
33320 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
33330 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
33340 20 72 65 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a   return nBuf;.}.
33350 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
33360 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
33370 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
33380 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
33390 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d  pt..** The argum
333a0 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ent is the numbe
333b0 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
333c0 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73 6c 65  s we want to sle
333d0 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  ep..** The retur
333e0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
333f0 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
33400 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70 20 61  conds of sleep a
33410 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65  ctually.** reque
33420 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 75 6e  sted from the un
33430 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69  derlying operati
33440 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d  ng system, a num
33450 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67  ber which.** mig
33460 68 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ht be greater th
33470 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
33480 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62 75 74  he argument, but
33490 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61   not less.** tha
334a0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
334b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
334c0 69 78 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f  ixSleep(sqlite3_
334d0 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  vfs *NotUsed, in
334e0 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b  t microseconds){
334f0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
33500 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
33510 63 20 73 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73  c sp;..  sp.tv_s
33520 65 63 20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64  ec = microsecond
33530 73 20 2f 20 31 30 30 30 30 30 30 3b 0a 20 20 73  s / 1000000;.  s
33540 70 2e 74 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63  p.tv_nsec = (mic
33550 72 6f 73 65 63 6f 6e 64 73 20 25 20 31 30 30 30  roseconds % 1000
33560 30 30 30 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e  000) * 1000;.  n
33570 61 6e 6f 73 6c 65 65 70 28 26 73 70 2c 20 4e 55  anosleep(&sp, NU
33580 4c 4c 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  LL);.  UNUSED_PA
33590 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
335a0 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63 72 6f  ;.  return micro
335b0 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64  seconds;.#elif d
335c0 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
335d0 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
335e0 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 69 63 72  EP.  usleep(micr
335f0 6f 73 65 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55  oseconds);.  UNU
33600 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
33610 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
33620 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23   microseconds;.#
33630 65 6c 73 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e  else.  int secon
33640 64 73 20 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e  ds = (microsecon
33650 64 73 2b 39 39 39 39 39 39 29 2f 31 30 30 30 30  ds+999999)/10000
33660 30 30 3b 0a 20 20 73 6c 65 65 70 28 73 65 63 6f  00;.  sleep(seco
33670 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nds);.  UNUSED_P
33680 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33690 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 65 63 6f  );.  return seco
336a0 6e 64 73 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e  nds*1000000;.#en
336b0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  dif.}../*.** The
336c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61   following varia
336d0 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61  ble, if set to a
336e0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c   non-zero value,
336f0 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
33700 61 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  as.** the number
33710 20 6f 66 20 73 65 63 6f 6e 64 73 20 73 69 6e 63   of seconds sinc
33720 65 20 31 39 37 30 20 61 6e 64 20 69 73 20 75 73  e 1970 and is us
33730 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 72 65  ed to set the re
33740 73 75 6c 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  sult of.** sqlit
33750 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  e3OsCurrentTime(
33760 29 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  ) during testing
33770 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
33780 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
33790 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
337a0 20 3d 20 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73   = 0;  /* Fake s
337b0 79 73 74 65 6d 20 74 69 6d 65 20 69 6e 20 73 65  ystem time in se
337c0 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39 37 30  conds since 1970
337d0 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  . */.#endif../*.
337e0 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72  ** Find the curr
337f0 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69  ent time (in Uni
33800 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74  versal Coordinat
33810 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65  ed Time).  Write
33820 20 69 6e 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20   into *piNow.** 
33830 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
33840 20 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a   and date as a J
33850 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
33860 20 74 69 6d 65 73 20 38 36 5f 34 30 30 5f 30 30   times 86_400_00
33870 30 2e 20 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20  0.  In.** other 
33880 77 6f 72 64 73 2c 20 77 72 69 74 65 20 69 6e 74  words, write int
33890 6f 20 2a 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d  o *piNow the num
338a0 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
338b0 6e 64 73 20 73 69 6e 63 65 20 74 68 65 20 4a 75  nds since the Ju
338c0 6c 69 61 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66  lian.** epoch of
338d0 20 6e 6f 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69   noon in Greenwi
338e0 63 68 20 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32  ch on November 2
338f0 34 2c 20 34 37 31 34 20 42 2e 43 20 61 63 63 6f  4, 4714 B.C acco
33900 72 64 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  rding to the.** 
33910 70 72 6f 6c 65 70 74 69 63 20 47 72 65 67 6f 72  proleptic Gregor
33920 69 61 6e 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a  ian calendar..**
33930 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
33940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33950 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
33960 5f 45 52 52 4f 52 20 69 66 20 74 68 65 20 74 69  _ERROR if the ti
33970 6d 65 20 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20  me and date .** 
33980 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
33990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
339a0 6e 69 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  nixCurrentTimeIn
339b0 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
339c0 2a 4e 6f 74 55 73 65 64 2c 20 73 71 6c 69 74 65  *NotUsed, sqlite
339d0 33 5f 69 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b  3_int64 *piNow){
339e0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
339f0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 75 6e  sqlite3_int64 un
33a00 69 78 45 70 6f 63 68 20 3d 20 32 34 34 30 35 38  ixEpoch = 244058
33a10 37 35 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  75*(sqlite3_int6
33a20 34 29 38 36 34 30 30 30 30 3b 0a 20 20 69 6e 74  4)8640000;.  int
33a30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
33a40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
33a50 47 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74  GETTOD).  time_t
33a60 20 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a   t;.  time(&t);.
33a70 20 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c    *piNow = ((sql
33a80 69 74 65 33 5f 69 6e 74 36 34 29 74 29 2a 31 30  ite3_int64)t)*10
33a90 30 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a  00 + unixEpoch;.
33aa0 23 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  #elif OS_VXWORKS
33ab0 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70  .  struct timesp
33ac0 65 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b  ec sNow;.  clock
33ad0 5f 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52  _gettime(CLOCK_R
33ae0 45 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b  EALTIME, &sNow);
33af0 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78  .  *piNow = unix
33b00 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71  Epoch + 1000*(sq
33b10 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77  lite3_int64)sNow
33b20 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74  .tv_sec + sNow.t
33b30 76 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a  v_nsec/1000000;.
33b40 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74  #else.  struct t
33b50 69 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 69  imeval sNow;.  i
33b60 66 28 20 67 65 74 74 69 6d 65 6f 66 64 61 79 28  f( gettimeofday(
33b70 26 73 4e 6f 77 2c 20 30 29 3d 3d 30 20 29 7b 0a  &sNow, 0)==0 ){.
33b80 20 20 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69      *piNow = uni
33b90 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73  xEpoch + 1000*(s
33ba0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f  qlite3_int64)sNo
33bb0 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e  w.tv_sec + sNow.
33bc0 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 20 20  tv_usec/1000;.  
33bd0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
33be0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
33bf0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
33c00 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
33c10 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
33c20 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
33c30 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
33c40 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
33c50 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
33c60 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
33c70 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
33c80 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33c90 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  sed);.  return r
33ca0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  c;.}../*.** Find
33cb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
33cc0 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20  e (in Universal 
33cd0 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65  Coordinated Time
33ce0 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a  ).  Write the.**
33cf0 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
33d00 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
33d10 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e  an Day number in
33d20 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a  to *prNow and.**
33d30 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
33d40 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65  rn 1 if the time
33d50 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74   and date cannot
33d60 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74   be found..*/.st
33d70 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72  atic int unixCur
33d80 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33  rentTime(sqlite3
33d90 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64  _vfs *NotUsed, d
33da0 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20  ouble *prNow){. 
33db0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
33dc0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
33dd0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
33de0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72  ER(NotUsed);.  r
33df0 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e 74 54  c = unixCurrentT
33e00 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b  imeInt64(0, &i);
33e10 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36  .  *prNow = i/86
33e20 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75  400000.0;.  retu
33e30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
33e40 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
33e50 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
33e60 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
33e70 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
33e80 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
33e90 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
33ea0 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
33eb0 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
33ec0 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
33ed0 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
33ee0 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
33ef0 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
33f00 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
33f10 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
33f20 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
33f30 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
33f40 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
33f50 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
33f60 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
33f70 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
33f80 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
33f90 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
33fa0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
33fb0 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
33fc0 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
33fd0 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33fe0 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
33ff0 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
34000 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
34010 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
34020 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
34030 0a 0a 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*.***********
34040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
34050 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73  d of sqlite3_vfs
34060 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
34070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34080 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
34090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340d0 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
340e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34120 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
34130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34140 20 42 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63   Begin Proxy Loc
34150 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
34160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34170 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78  *****.**.** Prox
34180 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22  y locking is a "
34190 75 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74  uber-locking-met
341a0 68 6f 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e  hod" in this sen
341b0 73 65 3a 20 20 49 74 20 75 73 65 73 20 74 68 65  se:  It uses the
341c0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
341d0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63  g methods on sec
341e0 6f 6e 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65  ondary lock file
341f0 73 2e 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e  s.  Proxy lockin
34200 67 20 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c  g is a.** meta-l
34210 61 79 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66  ayer over top of
34220 20 74 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c   the primitive l
34230 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
34240 65 64 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a  ed above.  For.*
34250 2a 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74  * this reason, t
34260 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74  he division that
34270 20 69 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70   implements of p
34280 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20  roxy locking is 
34290 64 65 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69  deferred.** unti
342a0 6c 20 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69  l late in the fi
342b0 6c 65 20 28 68 65 72 65 29 20 61 66 74 65 72 20  le (here) after 
342c0 61 6c 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72  all of the other
342d0 20 49 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76   I/O methods hav
342e0 65 0a 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65  e.** been define
342f0 64 20 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20  d - so that the 
34300 70 72 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e  primitive lockin
34310 67 20 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76  g methods are av
34320 61 69 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65  ailable.** as se
34330 72 76 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77  rvices to help w
34340 69 74 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ith the implemen
34350 74 61 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20  tation of proxy 
34360 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a  locking..**.****
34370 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  .**.** The defau
34380 6c 74 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d  lt locking schem
34390 65 73 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65  es in SQLite use
343a0 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b   byte-range lock
343b0 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  s on the.** data
343c0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f  base file to coo
343d0 72 64 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f  rdinate safe, co
343e0 6e 63 75 72 72 65 6e 74 20 61 63 63 65 73 73 20  ncurrent access 
343f0 62 79 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64  by multiple read
34400 65 72 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  ers.** and write
34410 72 73 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74  rs [http://sqlit
34420 65 2e 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e  e.org/lockingv3.
34430 68 74 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65  html].  The five
34440 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   file locking.**
34450 20 73 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45   states (UNLOCKE
34460 44 2c 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52  D, PENDING, SHAR
34470 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58  ED, RESERVED, EX
34480 43 4c 55 53 49 56 45 29 20 61 72 65 20 69 6d 70  CLUSIVE) are imp
34490 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50  lemented.** as P
344a0 4f 53 49 58 20 72 65 61 64 20 26 20 77 72 69 74  OSIX read & writ
344b0 65 20 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78  e locks over fix
344c0 65 64 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69  ed set of locati
344d0 6f 6e 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c  ons (via fsctl),
344e0 0a 2a 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53  .** on AFP and S
344f0 4d 42 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76  MB only exclusiv
34500 65 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63  e byte-range loc
34510 6b 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ks are available
34520 20 76 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69   via fsctl.** wi
34530 74 68 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33  th _IOWR('z', 23
34540 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e  , struct ByteRan
34550 67 65 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72  geLockPB2) to tr
34560 61 63 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73  ack the same 5 s
34570 74 61 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d  tates..** To sim
34580 75 6c 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20  ulate a F_RDLCK 
34590 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 72 61  on the shared ra
345a0 6e 67 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61  nge, on AFP a ra
345b0 6e 64 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a  ndomly selected.
345c0 2a 2a 20 61 64 64 72 65 73 73 20 69 6e 20 74 68  ** address in th
345d0 65 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  e shared range i
345e0 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48  s taken for a SH
345f0 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65  ARED lock, the e
34600 6e 74 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20  ntire.** shared 
34610 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66  range is taken f
34620 6f 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  or an EXCLUSIVE 
34630 6c 6f 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  lock):.**.**    
34640 20 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20    PENDING_BYTE  
34650 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 30        0x40000000
34660 0a 2a 2a 20 20 20 20 20 20 52 45 53 45 52 56 45  .**      RESERVE
34670 44 5f 42 59 54 45 20 20 20 20 20 20 20 30 78 34  D_BYTE       0x4
34680 30 30 30 30 30 30 31 0a 2a 2a 20 20 20 20 20 20  0000001.**      
34690 53 48 41 52 45 44 5f 52 41 4e 47 45 20 20 20 20  SHARED_RANGE    
346a0 20 20 20 20 30 78 34 30 30 30 30 30 30 32 20 2d      0x40000002 -
346b0 3e 20 30 78 34 30 30 30 30 32 30 30 0a 2a 2a 0a  > 0x40000200.**.
346c0 2a 2a 20 54 68 69 73 20 77 6f 72 6b 73 20 77 65  ** This works we
346d0 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  ll on the local 
346e0 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 62 75 74  file system, but
346f0 20 73 68 6f 77 73 20 61 20 6e 65 61 72 6c 79 20   shows a nearly 
34700 31 30 30 78 0a 2a 2a 20 73 6c 6f 77 64 6f 77 6e  100x.** slowdown
34710 20 69 6e 20 72 65 61 64 20 70 65 72 66 6f 72 6d   in read perform
34720 61 6e 63 65 20 6f 6e 20 41 46 50 20 62 65 63 61  ance on AFP beca
34730 75 73 65 20 74 68 65 20 41 46 50 20 63 6c 69 65  use the AFP clie
34740 6e 74 20 64 69 73 61 62 6c 65 73 0a 2a 2a 20 74  nt disables.** t
34750 68 65 20 72 65 61 64 20 63 61 63 68 65 20 77 68  he read cache wh
34760 65 6e 20 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f  en byte-range lo
34770 63 6b 73 20 61 72 65 20 70 72 65 73 65 6e 74 2e  cks are present.
34780 20 20 45 6e 61 62 6c 69 6e 67 20 74 68 65 20 72    Enabling the r
34790 65 61 64 0a 2a 2a 20 63 61 63 68 65 20 65 78 70  ead.** cache exp
347a0 6f 73 65 73 20 61 20 63 61 63 68 65 20 63 6f 68  oses a cache coh
347b0 65 72 65 6e 63 79 20 70 72 6f 62 6c 65 6d 20 74  erency problem t
347c0 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 6f  hat is present o
347d0 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a 2a 20 73 75  n all OS X.** su
347e0 70 70 6f 72 74 65 64 20 6e 65 74 77 6f 72 6b 20  pported network 
347f0 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 20 20 4e  file systems.  N
34800 46 53 20 61 6e 64 20 41 46 50 20 62 6f 74 68 20  FS and AFP both 
34810 6f 62 73 65 72 76 65 20 74 68 65 0a 2a 2a 20 63  observe the.** c
34820 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e 20 73 65 6d  lose-to-open sem
34830 61 6e 74 69 63 73 20 66 6f 72 20 65 6e 73 75 72  antics for ensur
34840 69 6e 67 20 63 61 63 68 65 20 63 6f 68 65 72 65  ing cache cohere
34850 6e 63 79 0a 2a 2a 20 5b 68 74 74 70 3a 2f 2f 6e  ncy.** [http://n
34860 66 73 2e 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  fs.sourceforge.n
34870 65 74 2f 23 66 61 71 5f 61 38 5d 2c 20 77 68 69  et/#faq_a8], whi
34880 63 68 20 64 6f 65 73 20 6e 6f 74 20 65 66 66 65  ch does not effe
34890 63 74 69 76 65 6c 79 0a 2a 2a 20 61 64 64 72 65  ctively.** addre
348a0 73 73 20 74 68 65 20 72 65 71 75 69 72 65 6d 65  ss the requireme
348b0 6e 74 73 20 66 6f 72 20 63 6f 6e 63 75 72 72 65  nts for concurre
348c0 6e 74 20 64 61 74 61 62 61 73 65 20 61 63 63 65  nt database acce
348d0 73 73 20 62 79 20 6d 75 6c 74 69 70 6c 65 0a 2a  ss by multiple.*
348e0 2a 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  * readers and wr
348f0 69 74 65 72 73 0a 2a 2a 20 5b 68 74 74 70 3a 2f  iters.** [http:/
34900 2f 77 77 77 2e 6e 61 62 62 6c 65 2e 63 6f 6d 2f  /www.nabble.com/
34910 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46 53 2d 63 61  SQLite-on-NFS-ca
34920 63 68 65 2d 63 6f 68 65 72 65 6e 63 79 2d 74 64  che-coherency-td
34930 31 35 36 35 35 37 30 31 2e 68 74 6d 6c 5d 2e 0a  15655701.html]..
34940 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64 72 65 73 73  **.** To address
34950 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
34960 20 61 6e 64 20 63 61 63 68 65 20 63 6f 68 65 72   and cache coher
34970 65 6e 63 79 20 69 73 73 75 65 73 2c 20 70 72 6f  ency issues, pro
34980 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a  xy file locking.
34990 2a 2a 20 63 68 61 6e 67 65 73 20 74 68 65 20 77  ** changes the w
349a0 61 79 20 64 61 74 61 62 61 73 65 20 61 63 63 65  ay database acce
349b0 73 73 20 69 73 20 63 6f 6e 74 72 6f 6c 6c 65 64  ss is controlled
349c0 20 62 79 20 6c 69 6d 69 74 69 6e 67 20 61 63 63   by limiting acc
349d0 65 73 73 20 74 6f 20 61 0a 2a 2a 20 73 69 6e 67  ess to a.** sing
349e0 6c 65 20 68 6f 73 74 20 61 74 20 61 20 74 69 6d  le host at a tim
349f0 65 20 61 6e 64 20 6d 6f 76 69 6e 67 20 66 69 6c  e and moving fil
34a00 65 20 6c 6f 63 6b 73 20 6f 66 66 20 6f 66 20 74  e locks off of t
34a10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
34a20 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f 20 61 20 70  .** and onto a p
34a30 72 6f 78 79 20 66 69 6c 65 20 6f 6e 20 74 68 65  roxy file on the
34a40 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73 74   local file syst
34a50 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 55  em.  .**.**.** U
34a60 73 69 6e 67 20 70 72 6f 78 79 20 6c 6f 63 6b 73  sing proxy locks
34a70 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
34a80 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 43 20 41 50  -----.**.** C AP
34a90 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65  Is.**.**  sqlite
34aa0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
34ab0 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49 54  b, dbname, SQLIT
34ac0 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b  E_FCNTL_SET_LOCK
34ad0 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20  PROXYFILE,.**   
34ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34af0 20 20 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e      <proxy_path>
34b00 20 7c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a   | ":auto:");.**
34b10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63    sqlite3_file_c
34b20 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d  ontrol(db, dbnam
34b30 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  e, SQLITE_FCNTL_
34b40 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
34b50 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  E,.**           
34b60 20 20 20 20 20 20 20 20 20 20 20 20 26 3c 70 72              &<pr
34b70 6f 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a  oxy_path>);.**.*
34b80 2a 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73  *.** SQL pragmas
34b90 0a 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b  .**.**  PRAGMA [
34ba0 64 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70  database.]lock_p
34bb0 72 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79  roxy_file=<proxy
34bc0 5f 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a  _path> | :auto:.
34bd0 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61  **  PRAGMA [data
34be0 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79  base.]lock_proxy
34bf0 5f 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63  _file.**.** Spec
34c00 69 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20  ifying ":auto:" 
34c10 6d 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68  means that if th
34c20 65 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66  ere is a conch f
34c30 69 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68  ile with a match
34c40 69 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69  ing.** host ID i
34c50 6e 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20  n it, the proxy 
34c60 70 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  path in the conc
34c70 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
34c80 73 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a  sed, otherwise.*
34c90 2a 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62  * a proxy path b
34ca0 61 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72  ased on the user
34cb0 27 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28  's temp dir.** (
34cc0 76 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f  via confstr(_CS_
34cd0 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50  DARWIN_USER_TEMP
34ce0 5f 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20  _DIR,...)) will 
34cf0 62 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  be used and the.
34d00 2a 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20  ** actual proxy 
34d10 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e  file name is gen
34d20 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
34d30 6e 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66  name and path of
34d40 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
34d50 20 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d   file.  For exam
34d60 70 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ple:.**.**      
34d70 20 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61   For database pa
34d80 74 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f  th "/Users/me/fo
34d90 6f 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20  o.db" .**       
34da0 54 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69  The lock path wi
34db0 6c 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f  ll be "<tmpdir>/
34dc0 73 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73  sqliteplocks/_Us
34dd0 65 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75  ers_me_foo.db:au
34de0 74 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  to:").**.** Once
34df0 20 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73   a lock proxy is
34e00 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
34e10 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
34e20 63 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f  ction, it can no
34e30 74 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c  t.** be removed,
34e40 20 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20   however it may 
34e50 62 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61  be switched to a
34e60 20 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79   different proxy
34e70 20 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65   path via.** the
34e80 20 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73   above APIs (ass
34e90 75 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20  uming the conch 
34ea0 66 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e  file is not bein
34eb0 67 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65  g held by anothe
34ec0 72 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  r.** connection 
34ed0 6f 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a  or process). .**
34ee0 0a 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79  .**.** How proxy
34ef0 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a   locking works.*
34f00 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
34f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
34f20 50 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69  Proxy file locki
34f30 6e 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72  ng relies primar
34f40 69 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73  ily on two new s
34f50 75 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a  upporting files:
34f60 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e   .**.**   *  con
34f70 63 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74  ch file to limit
34f80 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64   access to the d
34f90 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
34fa0 61 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a  a single host.**
34fb0 20 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a        at a time.
34fc0 2a 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79  **.**   *  proxy
34fd0 20 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20   file to act as 
34fe0 61 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20  a proxy for the 
34ff0 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e  advisory locks n
35000 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20  ormally.**      
35010 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74  taken on the dat
35020 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20  abase.**.** The 
35030 63 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20  conch file - to 
35040 75 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65  use a proxy file
35050 2c 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69  , sqlite must fi
35060 72 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f  rst "hold the co
35070 6e 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e  nch".** by takin
35080 67 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c  g an sqlite-styl
35090 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  e shared lock on
350a0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c   the conch file,
350b0 20 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20   reading the.** 
350c0 63 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d  contents and com
350d0 70 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27  paring the host'
350e0 73 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44  s unique host ID
350f0 20 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64   (see below) and
35100 20 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70   lock.** proxy p
35110 61 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20  ath against the 
35120 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e  values stored in
35130 20 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65   the conch.  The
35140 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a   conch file is.*
35150 2a 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  * stored in the 
35160 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61  same directory a
35170 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
35180 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65  ile and the file
35190 20 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74   name.** is patt
351a0 65 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20  erned after the 
351b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61  database file na
351c0 6d 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73  me as ".<databas
351d0 65 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a  ename>-conch"..*
351e0 2a 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66  * If the conch f
351f0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
35200 73 74 2c 20 6f 72 20 69 74 73 20 63 6f 6e 74 65  st, or its conte
35210 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
35220 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
35230 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
35240 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
35250 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
35260 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
35270 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
35280 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
35290 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
352a0 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
352b0 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
352c0 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
352d0 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
352e0 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
352f0 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
35300 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
35310 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
35320 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
35330 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
35340 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
35350 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
35360 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
35370 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
35380 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
35390 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
353a0 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
353b0 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
353c0 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
353d0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
353e0 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
353f0 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
35400 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
35410 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
35420 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
35430 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
35440 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
35450 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
35460 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
35470 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
35480 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
35490 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
354a0 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
354b0 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
354c0 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
354d0 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
354e0 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
354f0 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
35500 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
35510 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
35520 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
35530 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
35540 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
35550 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
35560 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
35570 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
35580 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
35590 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
355a0 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
355b0 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
355c0 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
355d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
355e0 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
355f0 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
35600 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
35610 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
35620 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
35630 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
35640 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
35650 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
35660 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
35670 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
35680 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
35690 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
356a0 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
356b0 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
356c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
356d0 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
356e0 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
356f0 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
35700 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
35710 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
35720 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
35730 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
35740 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
35750 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
35760 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
35770 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
35780 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
35790 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
357a0 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
357b0 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
357c0 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
357d0 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
357e0 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
357f0 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
35800 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
35810 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
35820 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
35830 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
35840 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
35850 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
35860 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
35870 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
35880 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
35890 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
358a0 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
358b0 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
358c0 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
358d0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
358e0 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
358f0 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
35900 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
35910 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
35920 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
35930 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
35940 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
35950 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
35960 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
35970 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
35980 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
35990 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
359a0 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
359b0 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
359c0 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
359d0 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
359e0 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
359f0 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
35a00 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
35a10 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
35a20 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
35a30 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
35a40 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
35a50 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
35a60 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
35a70 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
35a80 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
35a90 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
35aa0 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
35ab0 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
35ac0 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
35ad0 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
35ae0 6c 65 73 20 28 65 78 70 6c 69 63 69 74 6c 79 20  les (explicitly 
35af0 63 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49  calling the SQLI
35b00 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43  TE_FCNTL_SET_LOC
35b10 4b 50 52 4f 58 59 46 49 4c 45 20 70 72 61 67 6d  KPROXYFILE pragm
35b20 61 20 6f 72 0a 2a 2a 20 73 71 6c 69 74 65 5f 66  a or.** sqlite_f
35b30 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 41 50 49 20  ile_control API 
35b40 69 73 20 6e 6f 74 20 61 66 66 65 63 74 65 64 20  is not affected 
35b50 62 79 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  by SQLITE_FORCE_
35b60 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 29 2e 0a  PROXY_LOCKING)..
35b70 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 78 79 20  */../*.** Proxy 
35b80 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
35b90 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
35ba0 4f 53 58 20 0a 2a 2f 0a 23 69 66 20 64 65 66 69  OSX .*/.#if defi
35bb0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
35bc0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
35bd0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
35be0 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 4c 6f  *.** The proxyLo
35bf0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 68 61 73  ckingContext has
35c00 20 74 68 65 20 70 61 74 68 20 61 6e 64 20 66 69   the path and fi
35c10 6c 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f  le structures fo
35c20 72 20 74 68 65 20 72 65 6d 6f 74 65 20 0a 2a 2a  r the remote .**
35c30 20 61 6e 64 20 6c 6f 63 61 6c 20 70 72 6f 78 79   and local proxy
35c40 20 66 69 6c 65 73 20 69 6e 20 69 74 0a 2a 2f 0a   files in it.*/.
35c50 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 70  typedef struct p
35c60 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35c70 78 74 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  xt proxyLockingC
35c80 6f 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 70  ontext;.struct p
35c90 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
35ca0 78 74 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt {.  unixFile 
35cb0 2a 63 6f 6e 63 68 46 69 6c 65 3b 20 20 20 20 20  *conchFile;     
35cc0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 63      /* Open conc
35cd0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  h file */.  char
35ce0 20 2a 63 6f 6e 63 68 46 69 6c 65 50 61 74 68 3b   *conchFilePath;
35cf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35d00 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   of the conch fi
35d10 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
35d20 20 2a 6c 6f 63 6b 50 72 6f 78 79 3b 20 20 20 20   *lockProxy;    
35d30 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 72 6f       /* Open pro
35d40 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  xy lock file */.
35d50 20 20 63 68 61 72 20 2a 6c 6f 63 6b 50 72 6f 78    char *lockProx
35d60 79 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 2f  yPath;         /
35d70 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72  * Name of the pr
35d80 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  oxy lock file */
35d90 0a 20 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  .  char *dbPath;
35da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35db0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
35dc0 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  pen file */.  in
35dd0 74 20 63 6f 6e 63 68 48 65 6c 64 3b 20 20 20 20  t conchHeld;    
35de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
35df0 69 66 20 74 68 65 20 63 6f 6e 63 68 20 69 73 20  if the conch is 
35e00 68 65 6c 64 2c 20 2d 31 20 69 66 20 6c 6f 63 6b  held, -1 if lock
35e10 6c 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  less */.  int nF
35e20 61 69 6c 73 3b 20 20 20 20 20 20 20 20 20 20 20  ails;           
35e30 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
35e40 20 6f 66 20 63 6f 6e 63 68 20 74 61 6b 69 6e 67   of conch taking
35e50 20 66 61 69 6c 75 72 65 73 20 2a 2f 0a 20 20 76   failures */.  v
35e60 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b 69 6e 67 43  oid *oldLockingC
35e70 6f 6e 74 65 78 74 3b 20 20 20 20 20 2f 2a 20 4f  ontext;     /* O
35e80 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 63  riginal lockingc
35e90 6f 6e 74 65 78 74 20 74 6f 20 72 65 73 74 6f 72  ontext to restor
35ea0 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 20 20  e on close */.  
35eb0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
35ec0 64 73 20 63 6f 6e 73 74 20 2a 70 4f 6c 64 4d 65  ds const *pOldMe
35ed0 74 68 6f 64 3b 20 20 20 20 20 2f 2a 20 4f 72 69  thod;     /* Ori
35ee0 67 69 6e 61 6c 20 49 2f 4f 20 6d 65 74 68 6f 64  ginal I/O method
35ef0 73 20 66 6f 72 20 63 6c 6f 73 65 20 2a 2f 0a 7d  s for close */.}
35f00 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 65 20 70 72  ;../* .** The pr
35f10 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  oxy lock file pa
35f20 74 68 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  th for the datab
35f30 61 73 65 20 61 74 20 64 62 50 61 74 68 20 69 73  ase at dbPath is
35f40 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6c 50   written into lP
35f50 61 74 68 2c 20 0a 2a 2a 20 77 68 69 63 68 20 6d  ath, .** which m
35f60 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 76 61 6c  ust point to val
35f70 69 64 2c 20 77 72 69 74 61 62 6c 65 20 6d 65 6d  id, writable mem
35f80 6f 72 79 20 6c 61 72 67 65 20 65 6e 6f 75 67 68  ory large enough
35f90 20 66 6f 72 20 61 20 6d 61 78 4c 65 6e 20 6c 65   for a maxLen le
35fa0 6e 67 74 68 0a 2a 2a 20 66 69 6c 65 20 70 61 74  ngth.** file pat
35fb0 68 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  h. .*/.static in
35fc0 74 20 70 72 6f 78 79 47 65 74 4c 6f 63 6b 50 61  t proxyGetLockPa
35fd0 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  th(const char *d
35fe0 62 50 61 74 68 2c 20 63 68 61 72 20 2a 6c 50 61  bPath, char *lPa
35ff0 74 68 2c 20 73 69 7a 65 5f 74 20 6d 61 78 4c 65  th, size_t maxLe
36000 6e 29 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  n){.  int len;. 
36010 20 69 6e 74 20 64 62 4c 65 6e 3b 0a 20 20 69 6e   int dbLen;.  in
36020 74 20 69 3b 0a 0a 23 69 66 64 65 66 20 4c 4f 43  t i;..#ifdef LOC
36030 4b 50 52 4f 58 59 44 49 52 0a 20 20 6c 65 6e 20  KPROXYDIR.  len 
36040 3d 20 73 74 72 6c 63 70 79 28 6c 50 61 74 68 2c  = strlcpy(lPath,
36050 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 2c 20 6d   LOCKPROXYDIR, m
36060 61 78 4c 65 6e 29 3b 0a 23 65 6c 73 65 0a 23 20  axLen);.#else.# 
36070 69 66 64 65 66 20 5f 43 53 5f 44 41 52 57 49 4e  ifdef _CS_DARWIN
36080 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 0a 20  _USER_TEMP_DIR. 
36090 20 7b 0a 20 20 20 20 69 66 28 20 21 63 6f 6e 66   {.    if( !conf
360a0 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f 55  str(_CS_DARWIN_U
360b0 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 20 6c 50  SER_TEMP_DIR, lP
360c0 61 74 68 2c 20 6d 61 78 4c 65 6e 29 20 29 7b 0a  ath, maxLen) ){.
360d0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
360e0 47 45 54 4c 4f 43 4b 50 41 54 48 20 20 66 61 69  GETLOCKPATH  fai
360f0 6c 65 64 20 25 73 20 65 72 72 6e 6f 3d 25 64 20  led %s errno=%d 
36100 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  pid=%d\n",.     
36110 20 20 20 20 20 20 20 20 20 20 6c 50 61 74 68 2c            lPath,
36120 20 65 72 72 6e 6f 2c 20 6f 73 47 65 74 70 69 64   errno, osGetpid
36130 28 30 29 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (0)));.      ret
36140 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
36150 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  _LOCK;.    }.   
36160 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c   len = strlcat(l
36170 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c 6f  Path, "sqliteplo
36180 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20 20  cks", maxLen);  
36190 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20 20    .  }.# else.  
361a0 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
361b0 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d 61  ath, "/tmp/", ma
361c0 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a 23  xLen);.# endif.#
361d0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50 61  endif..  if( lPa
361e0 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20 29  th[len-1]!='/' )
361f0 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72 6c  {.    len = strl
36200 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c 20  cat(lPath, "/", 
36210 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20 0a  maxLen);.  }.  .
36220 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74    /* transform t
36230 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61 20  he db path to a 
36240 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61 6d  unique cache nam
36250 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20 28  e */.  dbLen = (
36260 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61 74  int)strlen(dbPat
36270 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b 20  h);.  for( i=0; 
36280 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c 65  i<dbLen && (i+le
36290 6e 2b 37 29 3c 28 69 6e 74 29 6d 61 78 4c 65 6e  n+7)<(int)maxLen
362a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72  ; i++){.    char
362b0 20 63 20 3d 20 64 62 50 61 74 68 5b 69 5d 3b 0a   c = dbPath[i];.
362c0 20 20 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d      lPath[i+len]
362d0 20 3d 20 28 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a   = (c=='/')?'_':
362e0 63 3b 0a 20 20 7d 0a 20 20 6c 50 61 74 68 5b 69  c;.  }.  lPath[i
362f0 2b 6c 65 6e 5d 3d 27 5c 30 27 3b 0a 20 20 73 74  +len]='\0';.  st
36300 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 3a 61  rlcat(lPath, ":a
36310 75 74 6f 3a 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  uto:", maxLen);.
36320 20 20 4f 53 54 52 41 43 45 28 28 22 47 45 54 4c    OSTRACE(("GETL
36330 4f 43 4b 50 41 54 48 20 20 70 72 6f 78 79 20 6c  OCKPATH  proxy l
36340 6f 63 6b 20 70 61 74 68 3d 25 73 20 70 69 64 3d  ock path=%s pid=
36350 25 64 5c 6e 22 2c 20 6c 50 61 74 68 2c 20 6f 73  %d\n", lPath, os
36360 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 72  Getpid(0)));.  r
36370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
36380 0a 7d 0a 0a 2f 2a 20 0a 20 2a 2a 20 43 72 65 61  .}../* . ** Crea
36390 74 65 73 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c  tes the lock fil
363a0 65 20 61 6e 64 20 61 6e 79 20 6d 69 73 73 69 6e  e and any missin
363b0 67 20 64 69 72 65 63 74 6f 72 69 65 73 20 69 6e  g directories in
363c0 20 6c 6f 63 6b 50 61 74 68 0a 20 2a 2f 0a 73 74   lockPath. */.st
363d0 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
363e0 65 61 74 65 4c 6f 63 6b 50 61 74 68 28 63 6f 6e  eateLockPath(con
363f0 73 74 20 63 68 61 72 20 2a 6c 6f 63 6b 50 61 74  st char *lockPat
36400 68 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6c 65 6e  h){.  int i, len
36410 3b 0a 20 20 63 68 61 72 20 62 75 66 5b 4d 41 58  ;.  char buf[MAX
36420 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20  PATHLEN];.  int 
36430 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 0a 20 20  start = 0;.  .  
36440 61 73 73 65 72 74 28 6c 6f 63 6b 50 61 74 68 21  assert(lockPath!
36450 3d 4e 55 4c 4c 29 3b 0a 20 20 2f 2a 20 74 72 79  =NULL);.  /* try
36460 20 74 6f 20 63 72 65 61 74 65 20 61 6c 6c 20 74   to create all t
36470 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
36480 64 69 72 65 63 74 6f 72 69 65 73 20 2a 2f 0a 20  directories */. 
36490 20 6c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c   len = (int)strl
364a0 65 6e 28 6c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  en(lockPath);.  
364b0 62 75 66 5b 30 5d 20 3d 20 6c 6f 63 6b 50 61 74  buf[0] = lockPat
364c0 68 5b 30 5d 3b 0a 20 20 66 6f 72 28 20 69 3d 31  h[0];.  for( i=1
364d0 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 20 29 7b 0a  ; i<len; i++ ){.
364e0 20 20 20 20 69 66 28 20 6c 6f 63 6b 50 61 74 68      if( lockPath
364f0 5b 69 5d 20 3d 3d 20 27 2f 27 20 26 26 20 28 69  [i] == '/' && (i
36500 20 2d 20 73 74 61 72 74 20 3e 20 30 29 20 29 7b   - start > 0) ){
36510 0a 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 6d  .      /* only m
36520 6b 64 69 72 20 69 66 20 6c 65 61 66 20 64 69 72  kdir if leaf dir
36530 20 21 3d 20 22 2e 22 20 6f 72 20 22 2f 22 20 6f   != "." or "/" o
36540 72 20 22 2e 2e 22 20 2a 2f 0a 20 20 20 20 20 20  r ".." */.      
36550 69 66 28 20 69 2d 73 74 61 72 74 3e 32 20 7c 7c  if( i-start>2 ||
36560 20 28 69 2d 73 74 61 72 74 3d 3d 31 20 26 26 20   (i-start==1 && 
36570 62 75 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e  buf[start] != '.
36580 27 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20  ' && buf[start] 
36590 21 3d 20 27 2f 27 29 20 0a 20 20 20 20 20 20 20  != '/') .       
365a0 20 20 7c 7c 20 28 69 2d 73 74 61 72 74 3d 3d 32    || (i-start==2
365b0 20 26 26 20 62 75 66 5b 73 74 61 72 74 5d 20 21   && buf[start] !
365c0 3d 20 27 2e 27 20 26 26 20 62 75 66 5b 73 74 61  = '.' && buf[sta
365d0 72 74 2b 31 5d 20 21 3d 20 27 2e 27 29 20 29 7b  rt+1] != '.') ){
365e0 0a 20 20 20 20 20 20 20 20 62 75 66 5b 69 5d 3d  .        buf[i]=
365f0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 69 66  '\0';.        if
36600 28 20 6f 73 4d 6b 64 69 72 28 62 75 66 2c 20 53  ( osMkdir(buf, S
36610 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
36620 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
36630 4e 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NS) ){.         
36640 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
36650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 72            if( er
36660 72 21 3d 45 45 58 49 53 54 20 29 20 7b 0a 20 20  r!=EEXIST ) {.  
36670 20 20 20 20 20 20 20 20 20 20 4f 53 54 52 41 43            OSTRAC
36680 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50 41  E(("CREATELOCKPA
36690 54 48 20 20 46 41 49 4c 45 44 20 63 72 65 61 74  TH  FAILED creat
366a0 69 6e 67 20 25 73 2c 20 22 0a 20 20 20 20 20 20  ing %s, ".      
366b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
366c0 27 25 73 27 20 70 72 6f 78 79 20 6c 6f 63 6b 20  '%s' proxy lock 
366d0 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
366e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
366f0 20 20 20 20 20 20 20 20 62 75 66 2c 20 73 74 72          buf, str
36700 65 72 72 6f 72 28 65 72 72 29 2c 20 6c 6f 63 6b  error(err), lock
36710 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30  Path, osGetpid(0
36720 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  )));.           
36730 20 72 65 74 75 72 6e 20 65 72 72 3b 0a 20 20 20   return err;.   
36740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
36750 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
36760 20 73 74 61 72 74 3d 69 2b 31 3b 0a 20 20 20 20   start=i+1;.    
36770 7d 0a 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 6c  }.    buf[i] = l
36780 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a 20 20 7d 0a  ockPath[i];.  }.
36790 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41    OSTRACE(("CREA
367a0 54 45 4c 4f 43 4b 50 41 54 48 20 20 70 72 6f 78  TELOCKPATH  prox
367b0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
367c0 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f 63 6b 50 61  id=%d\n", lockPa
367d0 74 68 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  th, osGetpid(0))
367e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
367f0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
36800 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64 65   new VFS file de
36810 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65 64  scriptor (stored
36820 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
36830 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
36840 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64 20  te3_malloc) and 
36850 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 61  open the file na
36860 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74 68  med "path" in th
36870 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
36880 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  r..**.** The cal
36890 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
368a0 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72 20  le not only for 
368b0 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c 65  closing the file
368c0 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 62   descriptor.** b
368d0 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65 65  ut also for free
368e0 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20 61  ing the memory a
368f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
36900 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
36910 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
36920 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e 69  t proxyCreateUni
36930 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73 74  xFile(.    const
36940 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20   char *path,    
36950 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72 20      /* path for 
36960 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c 65  the new unixFile
36970 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   */.    unixFile
36980 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20 20   **ppFile,      
36990 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72 65   /* unixFile cre
369a0 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e 65  ated and returne
369b0 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20 20  d by ref */.    
369c0 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20 20  int islockfile  
369d0 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20 6e           /* if n
369e0 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67 20  on zero missing 
369f0 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72 65  dirs will be cre
36a00 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69 6e  ated */.) {.  in
36a10 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 75 6e 69  t fd = -1;.  uni
36a20 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 69  xFile *pNew;.  i
36a30 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
36a40 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  K;.  int openFla
36a50 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f  gs = O_RDWR | O_
36a60 43 52 45 41 54 3b 0a 20 20 73 71 6c 69 74 65 33  CREAT;.  sqlite3
36a70 5f 76 66 73 20 64 75 6d 6d 79 56 66 73 3b 0a 20  _vfs dummyVfs;. 
36a80 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d 20 30 3b   int terrno = 0;
36a90 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
36aa0 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55 4c 4c 3b  *pUnused = NULL;
36ab0 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72 73 74 20  ..  /* 1. first 
36ac0 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61  try to open/crea
36ad0 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  te the file.  **
36ae0 20 32 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   2. if that fail
36af0 73 2c 20 61 6e 64 20 74 68 69 73 20 69 73 20 61  s, and this is a
36b00 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e 6f 74 2d   lock file (not-
36b10 63 6f 6e 63 68 29 2c 20 74 72 79 20 63 72 65 61  conch), try crea
36b20 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 70 61  ting.  ** the pa
36b30 72 65 6e 74 20 64 69 72 65 63 74 6f 72 69 65 73  rent directories
36b40 20 61 6e 64 20 74 68 65 6e 20 74 72 79 20 61 67   and then try ag
36b50 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20 69 66 20  ain..  ** 3. if 
36b60 74 68 61 74 20 66 61 69 6c 73 2c 20 74 72 79 20  that fails, try 
36b70 74 6f 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65  to open the file
36b80 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20 2a 2a 20   read-only.  ** 
36b90 6f 74 68 65 72 77 69 73 65 20 72 65 74 75 72 6e  otherwise return
36ba0 20 42 55 53 59 20 28 69 66 20 6c 6f 63 6b 20 66   BUSY (if lock f
36bb0 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f 50 45 4e  ile) or CANTOPEN
36bc0 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 66   for the conch f
36bd0 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55 6e 75 73  ile.  */.  pUnus
36be0 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
36bf0 65 46 64 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  eFd(path, openFl
36c00 61 67 73 29 3b 0a 20 20 69 66 28 20 70 55 6e 75  ags);.  if( pUnu
36c10 73 65 64 20 29 7b 0a 20 20 20 20 66 64 20 3d 20  sed ){.    fd = 
36c20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20 7d  pUnused->fd;.  }
36c30 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e 75 73 65  else{.    pUnuse
36c40 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  d = sqlite3_mall
36c50 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 55 6e  oc64(sizeof(*pUn
36c60 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28 20  used));.    if( 
36c70 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20  !pUnused ){.    
36c80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
36c90 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
36ca0 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
36cb0 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
36cc0 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
36cd0 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72  ags, 0);.    ter
36ce0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
36cf0 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72 72   if( fd<0 && err
36d00 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 26 26 20 69 73  no==ENOENT && is
36d10 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20 20 20  lockfile ){.    
36d20 20 20 69 66 28 20 70 72 6f 78 79 43 72 65 61 74    if( proxyCreat
36d30 65 4c 6f 63 6b 50 61 74 68 28 70 61 74 68 29 20  eLockPath(path) 
36d40 3d 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  == SQLITE_OK ){.
36d50 20 20 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62          fd = rob
36d60 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c 20 6f  ust_open(path, o
36d70 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20  penFlags, 0);.  
36d80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
36d90 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
36da0 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f    openFlags = O_
36db0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d  RDONLY;.    fd =
36dc0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74   robust_open(pat
36dd0 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29  h, openFlags, 0)
36de0 3b 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65  ;.    terrno = e
36df0 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rrno;.  }.  if( 
36e00 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 66 28 20  fd<0 ){.    if( 
36e10 69 73 6c 6f 63 6b 66 69 6c 65 20 29 7b 0a 20 20  islockfile ){.  
36e20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
36e30 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
36e40 20 20 73 77 69 74 63 68 20 28 74 65 72 72 6e 6f    switch (terrno
36e50 29 20 7b 0a 20 20 20 20 20 20 63 61 73 65 20 45  ) {.      case E
36e60 41 43 43 45 53 3a 0a 20 20 20 20 20 20 20 20 72  ACCES:.        r
36e70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
36e80 4d 3b 0a 20 20 20 20 20 20 63 61 73 65 20 45 49  M;.      case EI
36e90 4f 3a 20 0a 20 20 20 20 20 20 20 20 72 65 74 75  O: .        retu
36ea0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
36eb0 4c 4f 43 4b 3b 20 2f 2a 20 65 76 65 6e 20 74 68  LOCK; /* even th
36ec0 6f 75 67 68 20 69 74 20 69 73 20 74 68 65 20 63  ough it is the c
36ed0 6f 6e 63 68 20 2a 2f 0a 20 20 20 20 20 20 64 65  onch */.      de
36ee0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 72  fault:.        r
36ef0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
36f00 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
36f10 7d 0a 20 20 7d 0a 20 20 0a 20 20 70 4e 65 77 20  }.  }.  .  pNew 
36f20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 73 71  = (unixFile *)sq
36f30 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73  lite3_malloc64(s
36f40 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
36f50 20 69 66 28 20 70 4e 65 77 3d 3d 4e 55 4c 4c 20   if( pNew==NULL 
36f60 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
36f70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
36f80 74 6f 20 65 6e 64 5f 63 72 65 61 74 65 5f 70 72  to end_create_pr
36f90 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  oxy;.  }.  memse
36fa0 74 28 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f  t(pNew, 0, sizeo
36fb0 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
36fc0 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  pNew->openFlags 
36fd0 3d 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 6d  = openFlags;.  m
36fe0 65 6d 73 65 74 28 26 64 75 6d 6d 79 56 66 73 2c  emset(&dummyVfs,
36ff0 20 30 2c 20 73 69 7a 65 6f 66 28 64 75 6d 6d 79   0, sizeof(dummy
37000 56 66 73 29 29 3b 0a 20 20 64 75 6d 6d 79 56 66  Vfs));.  dummyVf
37010 73 2e 70 41 70 70 44 61 74 61 20 3d 20 28 76 6f  s.pAppData = (vo
37020 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46  id*)&autolockIoF
37030 69 6e 64 65 72 3b 0a 20 20 64 75 6d 6d 79 56 66  inder;.  dummyVf
37040 73 2e 7a 4e 61 6d 65 20 3d 20 22 64 75 6d 6d 79  s.zName = "dummy
37050 22 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64  ";.  pUnused->fd
37060 20 3d 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64   = fd;.  pUnused
37070 2d 3e 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c  ->flags = openFl
37080 61 67 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e  ags;.  pNew->pUn
37090 75 73 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a  used = pUnused;.
370a0 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e    .  rc = fillIn
370b0 55 6e 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56  UnixFile(&dummyV
370c0 66 73 2c 20 66 64 2c 20 28 73 71 6c 69 74 65 33  fs, fd, (sqlite3
370d0 5f 66 69 6c 65 2a 29 70 4e 65 77 2c 20 70 61 74  _file*)pNew, pat
370e0 68 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d  h, 0);.  if( rc=
370f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
37100 20 20 2a 70 70 46 69 6c 65 20 3d 20 70 4e 65 77    *ppFile = pNew
37110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
37120 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 65 6e 64 5f  ITE_OK;.  }.end_
37130 63 72 65 61 74 65 5f 70 72 6f 78 79 3a 20 20 20  create_proxy:   
37140 20 0a 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65   .  robust_close
37150 28 70 4e 65 77 2c 20 66 64 2c 20 5f 5f 4c 49 4e  (pNew, fd, __LIN
37160 45 5f 5f 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E__);.  sqlite3_
37170 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 73 71  free(pNew);.  sq
37180 6c 69 74 65 33 5f 66 72 65 65 28 70 55 6e 75 73  lite3_free(pUnus
37190 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ed);.  return rc
371a0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
371b0 54 45 5f 54 45 53 54 0a 2f 2a 20 73 69 6d 75 6c  TE_TEST./* simul
371c0 61 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73  ate multiple hos
371d0 74 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75  ts by creating u
371e0 6e 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c  nique hostid fil
371f0 65 20 70 61 74 68 73 20 2a 2f 0a 69 6e 74 20 73  e paths */.int s
37200 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
37210 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 23  m = 0;.#endif..#
37220 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 4f 53  define PROXY_HOS
37230 54 49 44 4c 45 4e 20 20 20 20 31 36 20 20 2f 2a  TIDLEN    16  /*
37240 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 6f 73 74   conch file host
37250 20 69 64 20 6c 65 6e 67 74 68 20 2a 2f 0a 0a 23   id length */..#
37260 69 66 64 65 66 20 48 41 56 45 5f 47 45 54 48 4f  ifdef HAVE_GETHO
37270 53 54 55 55 49 44 0a 2f 2a 20 4e 6f 74 20 61 6c  STUUID./* Not al
37280 77 61 79 73 20 64 65 66 69 6e 65 64 20 69 6e 20  ways defined in 
37290 74 68 65 20 68 65 61 64 65 72 73 20 61 73 20 69  the headers as i
372a0 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20 2a 2f  t ought to be */
372b0 0a 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 68  .extern int geth
372c0 6f 73 74 75 75 69 64 28 75 75 69 64 5f 74 20 69  ostuuid(uuid_t i
372d0 64 2c 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  d, const struct 
372e0 74 69 6d 65 73 70 65 63 20 2a 77 61 69 74 29 3b  timespec *wait);
372f0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 67 65 74 20  .#endif../* get 
37300 74 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20  the host ID via 
37310 67 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70  gethostuuid(), p
37320 48 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e  HostID must poin
37330 74 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49  t to PROXY_HOSTI
37340 44 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f  DLEN .** bytes o
37350 66 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72  f writable memor
37360 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
37370 20 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28   proxyGetHostID(
37380 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
37390 48 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72  HostID, int *pEr
373a0 72 6f 72 29 7b 0a 20 20 61 73 73 65 72 74 28 50  ror){.  assert(P
373b0 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 3d  ROXY_HOSTIDLEN =
373c0 3d 20 73 69 7a 65 6f 66 28 75 75 69 64 5f 74 29  = sizeof(uuid_t)
373d0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 48 6f 73  );.  memset(pHos
373e0 74 49 44 2c 20 30 2c 20 50 52 4f 58 59 5f 48 4f  tID, 0, PROXY_HO
373f0 53 54 49 44 4c 45 4e 29 3b 0a 23 69 66 64 65 66  STIDLEN);.#ifdef
37400 20 48 41 56 45 5f 47 45 54 48 4f 53 54 55 55 49   HAVE_GETHOSTUUI
37410 44 0a 20 20 7b 0a 20 20 20 20 73 74 72 75 63 74  D.  {.    struct
37420 20 74 69 6d 65 73 70 65 63 20 74 69 6d 65 6f 75   timespec timeou
37430 74 20 3d 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31  t = {1, 0}; /* 1
37440 20 73 65 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a   sec timeout */.
37450 20 20 20 20 69 66 28 20 67 65 74 68 6f 73 74 75      if( gethostu
37460 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26 74 69  uid(pHostID, &ti
37470 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20 20 20  meout) ){.      
37480 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
37490 0a 20 20 20 20 20 20 69 66 28 20 70 45 72 72 6f  .      if( pErro
374a0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 45  r ){.        *pE
374b0 72 72 6f 72 20 3d 20 65 72 72 3b 0a 20 20 20 20  rror = err;.    
374c0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
374d0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
374e0 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 20     }.  }.#else. 
374f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
37500 52 28 70 45 72 72 6f 72 29 3b 0a 23 65 6e 64 69  R(pError);.#endi
37510 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
37520 54 45 53 54 0a 20 20 2f 2a 20 73 69 6d 75 6c 61  TEST.  /* simula
37530 74 65 20 6d 75 6c 74 69 70 6c 65 20 68 6f 73 74  te multiple host
37540 73 20 62 79 20 63 72 65 61 74 69 6e 67 20 75 6e  s by creating un
37550 69 71 75 65 20 68 6f 73 74 69 64 20 66 69 6c 65  ique hostid file
37560 20 70 61 74 68 73 20 2a 2f 0a 20 20 69 66 28 20   paths */.  if( 
37570 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e  sqlite3_hostid_n
37580 75 6d 20 21 3d 20 30 29 7b 0a 20 20 20 20 70 48  um != 0){.    pH
37590 6f 73 74 49 44 5b 30 5d 20 3d 20 28 63 68 61 72  ostID[0] = (char
375a0 29 28 70 48 6f 73 74 49 44 5b 30 5d 20 2b 20 28  )(pHostID[0] + (
375b0 63 68 61 72 29 28 73 71 6c 69 74 65 33 5f 68 6f  char)(sqlite3_ho
375c0 73 74 69 64 5f 6e 75 6d 20 26 20 30 78 46 46 29  stid_num & 0xFF)
375d0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
375e0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
375f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 63  _OK;.}../* The c
37600 6f 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 61 69  onch file contai
37610 6e 73 20 74 68 65 20 68 65 61 64 65 72 2c 20 68  ns the header, h
37620 6f 73 74 20 69 64 20 61 6e 64 20 6c 6f 63 6b 20  ost id and lock 
37630 66 69 6c 65 20 70 61 74 68 0a 20 2a 2f 0a 23 64  file path. */.#d
37640 65 66 69 6e 65 20 50 52 4f 58 59 5f 43 4f 4e 43  efine PROXY_CONC
37650 48 56 45 52 53 49 4f 4e 20 32 20 20 20 2f 2a 20  HVERSION 2   /* 
37660 31 2d 62 79 74 65 20 68 65 61 64 65 72 2c 20 31  1-byte header, 1
37670 36 2d 62 79 74 65 20 68 6f 73 74 20 69 64 2c 20  6-byte host id, 
37680 70 61 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20  path */.#define 
37690 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 20  PROXY_HEADERLEN 
376a0 20 20 20 31 20 20 20 2f 2a 20 63 6f 6e 63 68 20     1   /* conch 
376b0 66 69 6c 65 20 68 65 61 64 65 72 20 6c 65 6e 67  file header leng
376c0 74 68 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52  th */.#define PR
376d0 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 20 20  OXY_PATHINDEX   
376e0 20 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45   (PROXY_HEADERLE
376f0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
37700 4e 29 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59  N).#define PROXY
37710 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 20 20 28 50  _MAXCONCHLEN  (P
37720 52 4f 58 59 5f 48 45 41 44 45 52 4c 45 4e 2b 50  ROXY_HEADERLEN+P
37730 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 2b 4d  ROXY_HOSTIDLEN+M
37740 41 58 50 41 54 48 4c 45 4e 29 0a 0a 2f 2a 20 0a  AXPATHLEN)../* .
37750 2a 2a 20 54 61 6b 65 73 20 61 6e 20 6f 70 65 6e  ** Takes an open
37760 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 63 6f 70   conch file, cop
37770 69 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ies the contents
37780 20 74 6f 20 61 20 6e 65 77 20 70 61 74 68 20 61   to a new path a
37790 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 0a 2a  nd then moves .*
377a0 2a 20 69 74 20 62 61 63 6b 2e 20 20 54 68 65 20  * it back.  The 
377b0 6e 65 77 6c 79 20 63 72 65 61 74 65 64 20 66 69  newly created fi
377c0 6c 65 27 73 20 66 69 6c 65 20 64 65 73 63 72 69  le's file descri
377d0 70 74 6f 72 20 69 73 20 61 73 73 69 67 6e 65 64  ptor is assigned
377e0 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 63 68   to the.** conch
377f0 20 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20   file structure 
37800 61 6e 64 20 66 69 6e 61 6c 6c 79 20 74 68 65 20  and finally the 
37810 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 63 68 20 66  original conch f
37820 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
37830 73 20 0a 2a 2a 20 63 6c 6f 73 65 64 2e 20 20 52  s .** closed.  R
37840 65 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 73  eturns zero if s
37850 75 63 63 65 73 73 66 75 6c 2e 0a 2a 2f 0a 73 74  uccessful..*/.st
37860 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 42 72  atic int proxyBr
37870 65 61 6b 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e 69  eakConchLock(uni
37880 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75 75  xFile *pFile, uu
37890 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 29 7b 0a  id_t myHostID){.
378a0 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f    proxyLockingCo
378b0 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70  ntext *pCtx = (p
378c0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
378d0 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
378e0 69 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75  ingContext; .  u
378f0 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
37900 6c 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68  le = pCtx->conch
37910 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 74 50 61  File;.  char tPa
37920 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
37930 20 20 63 68 61 72 20 62 75 66 5b 50 52 4f 58 59    char buf[PROXY
37940 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
37950 20 63 68 61 72 20 2a 63 50 61 74 68 20 3d 20 70   char *cPath = p
37960 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
37970 74 68 3b 0a 20 20 73 69 7a 65 5f 74 20 72 65 61  th;.  size_t rea
37980 64 4c 65 6e 20 3d 20 30 3b 0a 20 20 73 69 7a 65  dLen = 0;.  size
37990 5f 74 20 70 61 74 68 4c 65 6e 20 3d 20 30 3b 0a  _t pathLen = 0;.
379a0 20 20 63 68 61 72 20 65 72 72 6d 73 67 5b 36 34    char errmsg[64
379b0 5d 20 3d 20 22 22 3b 0a 20 20 69 6e 74 20 66 64  ] = "";.  int fd
379c0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
379d0 3d 20 2d 31 3b 0a 20 20 55 4e 55 53 45 44 5f 50  = -1;.  UNUSED_P
379e0 41 52 41 4d 45 54 45 52 28 6d 79 48 6f 73 74 49  ARAMETER(myHostI
379f0 44 29 3b 0a 0a 20 20 2f 2a 20 63 72 65 61 74 65  D);..  /* create
37a00 20 61 20 6e 65 77 20 70 61 74 68 20 62 79 20 72   a new path by r
37a10 65 70 6c 61 63 65 20 74 68 65 20 74 72 61 69 6c  eplace the trail
37a20 69 6e 67 20 27 2d 63 6f 6e 63 68 27 20 77 69 74  ing '-conch' wit
37a30 68 20 27 2d 62 72 65 61 6b 27 20 2a 2f 0a 20 20  h '-break' */.  
37a40 70 61 74 68 4c 65 6e 20 3d 20 73 74 72 6c 63 70  pathLen = strlcp
37a50 79 28 74 50 61 74 68 2c 20 63 50 61 74 68 2c 20  y(tPath, cPath, 
37a60 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69  MAXPATHLEN);.  i
37a70 66 28 20 70 61 74 68 4c 65 6e 3e 4d 41 58 50 41  f( pathLen>MAXPA
37a80 54 48 4c 45 4e 20 7c 7c 20 70 61 74 68 4c 65 6e  THLEN || pathLen
37a90 3c 36 20 7c 7c 20 0a 20 20 20 20 20 28 73 74 72  <6 || .     (str
37aa0 6c 63 70 79 28 26 74 50 61 74 68 5b 70 61 74 68  lcpy(&tPath[path
37ab0 4c 65 6e 2d 35 5d 2c 20 22 62 72 65 61 6b 22 2c  Len-5], "break",
37ac0 20 36 29 20 21 3d 20 35 29 20 29 7b 0a 20 20 20   6) != 5) ){.   
37ad0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
37ae0 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29  f(sizeof(errmsg)
37af0 2c 65 72 72 6d 73 67 2c 22 70 61 74 68 20 65 72  ,errmsg,"path er
37b00 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28 69  ror (len %d)",(i
37b10 6e 74 29 70 61 74 68 4c 65 6e 29 3b 0a 20 20 20  nt)pathLen);.   
37b20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c   goto end_breakl
37b30 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 72 65  ock;.  }.  /* re
37b40 61 64 20 74 68 65 20 63 6f 6e 63 68 20 63 6f 6e  ad the conch con
37b50 74 65 6e 74 20 2a 2f 0a 20 20 72 65 61 64 4c 65  tent */.  readLe
37b60 6e 20 3d 20 6f 73 50 72 65 61 64 28 63 6f 6e 63  n = osPread(conc
37b70 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2c 20 50  hFile->h, buf, P
37b80 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e  ROXY_MAXCONCHLEN
37b90 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 65 61 64  , 0);.  if( read
37ba0 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54 48 49 4e  Len<PROXY_PATHIN
37bb0 44 45 58 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  DEX ){.    sqlit
37bc0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
37bd0 6f 66 28 65 72 72 6d 73 67 29 2c 65 72 72 6d 73  of(errmsg),errms
37be0 67 2c 22 72 65 61 64 20 65 72 72 6f 72 20 28 6c  g,"read error (l
37bf0 65 6e 20 25 64 29 22 2c 28 69 6e 74 29 72 65 61  en %d)",(int)rea
37c00 64 4c 65 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20  dLen);.    goto 
37c10 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20  end_breaklock;. 
37c20 20 7d 0a 20 20 2f 2a 20 77 72 69 74 65 20 69 74   }.  /* write it
37c30 20 6f 75 74 20 74 6f 20 74 68 65 20 74 65 6d 70   out to the temp
37c40 6f 72 61 72 79 20 62 72 65 61 6b 20 66 69 6c 65  orary break file
37c50 20 2a 2f 0a 20 20 66 64 20 3d 20 72 6f 62 75 73   */.  fd = robus
37c60 74 5f 6f 70 65 6e 28 74 50 61 74 68 2c 20 28 4f  t_open(tPath, (O
37c70 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f  _RDWR|O_CREAT|O_
37c80 45 58 43 4c 29 2c 20 30 29 3b 0a 20 20 69 66 28  EXCL), 0);.  if(
37c90 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c   fd<0 ){.    sql
37ca0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
37cb0 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20 65 72  zeof(errmsg), er
37cc0 72 6d 73 67 2c 20 22 63 72 65 61 74 65 20 66 61  rmsg, "create fa
37cd0 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72 6e  iled (%d)", errn
37ce0 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  o);.    goto end
37cf0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
37d00 20 20 69 66 28 20 6f 73 50 77 72 69 74 65 28 66    if( osPwrite(f
37d10 64 2c 20 62 75 66 2c 20 72 65 61 64 4c 65 6e 2c  d, buf, readLen,
37d20 20 30 29 20 21 3d 20 28 73 73 69 7a 65 5f 74 29   0) != (ssize_t)
37d30 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73  readLen ){.    s
37d40 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37d50 73 69 7a 65 6f 66 28 65 72 72 6d 73 67 29 2c 20  sizeof(errmsg), 
37d60 65 72 72 6d 73 67 2c 20 22 77 72 69 74 65 20 66  errmsg, "write f
37d70 61 69 6c 65 64 20 28 25 64 29 22 2c 20 65 72 72  ailed (%d)", err
37d80 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  no);.    goto en
37d90 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d  d_breaklock;.  }
37da0 0a 20 20 69 66 28 20 72 65 6e 61 6d 65 28 74 50  .  if( rename(tP
37db0 61 74 68 2c 20 63 50 61 74 68 29 20 29 7b 0a 20  ath, cPath) ){. 
37dc0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
37dd0 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73  ntf(sizeof(errms
37de0 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 72 65 6e  g), errmsg, "ren
37df0 61 6d 65 20 66 61 69 6c 65 64 20 28 25 64 29 22  ame failed (%d)"
37e00 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f  , errno);.    go
37e10 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b  to end_breaklock
37e20 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a  ;.  }.  rc = 0;.
37e30 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
37e40 2c 20 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c  , "broke stale l
37e50 6f 63 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50  ock on %s\n", cP
37e60 61 74 68 29 3b 0a 20 20 72 6f 62 75 73 74 5f 63  ath);.  robust_c
37e70 6c 6f 73 65 28 70 46 69 6c 65 2c 20 63 6f 6e 63  lose(pFile, conc
37e80 68 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  hFile->h, __LINE
37e90 5f 5f 29 3b 0a 20 20 63 6f 6e 63 68 46 69 6c 65  __);.  conchFile
37ea0 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 63 6f 6e 63  ->h = fd;.  conc
37eb0 68 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73  hFile->openFlags
37ec0 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
37ed0 45 41 54 3b 0a 0a 65 6e 64 5f 62 72 65 61 6b 6c  EAT;..end_breakl
37ee0 6f 63 6b 3a 0a 20 20 69 66 28 20 72 63 20 29 7b  ock:.  if( rc ){
37ef0 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
37f00 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
37f10 28 74 50 61 74 68 29 3b 0a 20 20 20 20 20 20 72  (tPath);.      r
37f20 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
37f30 65 2c 20 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  e, fd, __LINE__)
37f40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 70 72 69  ;.    }.    fpri
37f50 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
37f60 6c 65 64 20 74 6f 20 62 72 65 61 6b 20 73 74 61  led to break sta
37f70 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73 2c 20 25  le lock on %s, %
37f80 73 5c 6e 22 2c 20 63 50 61 74 68 2c 20 65 72 72  s\n", cPath, err
37f90 6d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  msg);.  }.  retu
37fa0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b  rn rc;.}../* Tak
37fb0 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  e the requested 
37fc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f 6e 63  lock on the conc
37fd0 68 20 66 69 6c 65 20 61 6e 64 20 62 72 65 61 6b  h file and break
37fe0 20 61 20 73 74 61 6c 65 20 6c 6f 63 6b 20 69 66   a stale lock if
37ff0 20 74 68 65 20 0a 2a 2a 20 68 6f 73 74 20 69 64   the .** host id
38000 20 6d 61 74 63 68 65 73 2e 0a 2a 2f 0a 73 74 61   matches..*/.sta
38010 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6f 6e  tic int proxyCon
38020 63 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20  chLock(unixFile 
38030 2a 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d  *pFile, uuid_t m
38040 79 48 6f 73 74 49 44 2c 20 69 6e 74 20 6c 6f 63  yHostID, int loc
38050 6b 54 79 70 65 29 7b 0a 20 20 70 72 6f 78 79 4c  kType){.  proxyL
38060 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
38070 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b  Ctx = (proxyLock
38080 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69  ingContext *)pFi
38090 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
380a0 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20  xt; .  unixFile 
380b0 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74  *conchFile = pCt
380c0 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20  x->conchFile;.  
380d0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
380e0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 54 72 69 65 73  OK;.  int nTries
380f0 20 3d 20 30 3b 0a 20 20 73 74 72 75 63 74 20 74   = 0;.  struct t
38100 69 6d 65 73 70 65 63 20 63 6f 6e 63 68 4d 6f 64  imespec conchMod
38110 54 69 6d 65 3b 0a 20 20 0a 20 20 6d 65 6d 73 65  Time;.  .  memse
38120 74 28 26 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2c  t(&conchModTime,
38130 20 30 2c 20 73 69 7a 65 6f 66 28 63 6f 6e 63 68   0, sizeof(conch
38140 4d 6f 64 54 69 6d 65 29 29 3b 0a 20 20 64 6f 20  ModTime));.  do 
38150 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
38160 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
38170 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69  Lock((sqlite3_fi
38180 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 6c  le*)conchFile, l
38190 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 6e 54  ockType);.    nT
381a0 72 69 65 73 20 2b 2b 3b 0a 20 20 20 20 69 66 28  ries ++;.    if(
381b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
381c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
381d0 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 65 64 20  the lock failed 
381e0 28 62 75 73 79 29 3a 0a 20 20 20 20 20 20 20 2a  (busy):.       *
381f0 20 31 73 74 20 74 72 79 3a 20 67 65 74 20 74 68   1st try: get th
38200 65 20 6d 6f 64 20 74 69 6d 65 20 6f 66 20 74 68  e mod time of th
38210 65 20 63 6f 6e 63 68 2c 20 77 61 69 74 20 30 2e  e conch, wait 0.
38220 35 73 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e  5s and try again
38230 2e 20 0a 20 20 20 20 20 20 20 2a 20 32 6e 64 20  . .       * 2nd 
38240 74 72 79 3a 20 66 61 69 6c 20 69 66 20 74 68 65  try: fail if the
38250 20 6d 6f 64 20 74 69 6d 65 20 63 68 61 6e 67 65   mod time change
38260 64 20 6f 72 20 68 6f 73 74 20 69 64 20 69 73 20  d or host id is 
38270 64 69 66 66 65 72 65 6e 74 2c 20 77 61 69 74 20  different, wait 
38280 0a 20 20 20 20 20 20 20 2a 20 20 20 20 20 20 20  .       *       
38290 20 20 20 20 31 30 20 73 65 63 20 61 6e 64 20 74      10 sec and t
382a0 72 79 20 61 67 61 69 6e 0a 20 20 20 20 20 20 20  ry again.       
382b0 2a 20 33 72 64 20 74 72 79 3a 20 62 72 65 61 6b  * 3rd try: break
382c0 20 74 68 65 20 6c 6f 63 6b 20 75 6e 6c 65 73 73   the lock unless
382d0 20 74 68 65 20 6d 6f 64 20 74 69 6d 65 20 68 61   the mod time ha
382e0 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 20  s changed..     
382f0 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 75 63    */.      struc
38300 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 20 20  t stat buf;.    
38310 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 63 6f    if( osFstat(co
38320 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  nchFile->h, &buf
38330 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
38340 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
38350 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
38360 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38370 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20  _IOERR_LOCK;.   
38380 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
38390 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 31 20    if( nTries==1 
383a0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68  ){.        conch
383b0 4d 6f 64 54 69 6d 65 20 3d 20 62 75 66 2e 73 74  ModTime = buf.st
383c0 5f 6d 74 69 6d 65 73 70 65 63 3b 0a 20 20 20 20  _mtimespec;.    
383d0 20 20 20 20 75 73 6c 65 65 70 28 35 30 30 30 30      usleep(50000
383e0 30 29 3b 20 2f 2a 20 77 61 69 74 20 30 2e 35 20  0); /* wait 0.5 
383f0 73 65 63 20 61 6e 64 20 74 72 79 20 74 68 65 20  sec and try the 
38400 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f 0a 20 20 20  lock again*/.   
38410 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20       continue;  
38420 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
38430 61 73 73 65 72 74 28 20 6e 54 72 69 65 73 3e 31  assert( nTries>1
38440 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6f   );.      if( co
38450 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 73 65  nchModTime.tv_se
38460 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d  c != buf.st_mtim
38470 65 73 70 65 63 2e 74 76 5f 73 65 63 20 7c 7c 20  espec.tv_sec || 
38480 0a 20 20 20 20 20 20 20 20 20 63 6f 6e 63 68 4d  .         conchM
38490 6f 64 54 69 6d 65 2e 74 76 5f 6e 73 65 63 20 21  odTime.tv_nsec !
384a0 3d 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70  = buf.st_mtimesp
384b0 65 63 2e 74 76 5f 6e 73 65 63 20 29 7b 0a 20 20  ec.tv_nsec ){.  
384c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
384d0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
384e0 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  }.      .      i
384f0 66 28 20 6e 54 72 69 65 73 3d 3d 32 20 29 7b 20  f( nTries==2 ){ 
38500 20 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 74   .        char t
38510 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
38520 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 20 20  CHLEN];.        
38530 69 6e 74 20 6c 65 6e 20 3d 20 6f 73 50 72 65 61  int len = osPrea
38540 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  d(conchFile->h, 
38550 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  tBuf, PROXY_MAXC
38560 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 20  ONCHLEN, 0);.   
38570 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30 20 29