/ Hex Artifact Content
Login

Artifact 7d56433ac85e77423d2d613fd5e53db08c5868ed:


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 42 4c 4f 43 4b 20 20 20 20 20 30 78 30 31  E_BLOCK     0x01
2510: 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 53  00     /* Next S
2520: 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62 6c  HM lock might bl
2530: 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ock */../*.** In
2540: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
2550: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
2560: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
2570: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
2580: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
2590: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
25a0: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
25b0: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
25c0: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
25d0: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
25e0: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
25f0: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2600: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2610: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2620: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2630: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2640: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2650: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
2660: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
2670: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
2680: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
2690: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
26a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
26b0: 20 74 68 72 65 61 64 69 64 20 6d 61 63 72 6f 20   threadid macro 
26c0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68 65 20  resolves to the 
26d0: 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74 6f 20  thread-id or to 
26e0: 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a 2a 20  0.  Used for.** 
26f0: 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
2700: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23  gging only..*/.#
2710: 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44  if SQLITE_THREAD
2720: 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74 68 72  SAFE.#define thr
2730: 65 61 64 69 64 20 70 74 68 72 65 61 64 5f 73 65  eadid pthread_se
2740: 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  lf().#else.#defi
2750: 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a 23 65  ne threadid 0.#e
2760: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45  ndif../*.** HAVE
2770: 5f 4d 52 45 4d 41 50 20 64 65 66 61 75 6c 74 73  _MREMAP defaults
2780: 20 74 6f 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75   to true on Linu
2790: 78 20 61 6e 64 20 66 61 6c 73 65 20 65 76 65 72  x and false ever
27a0: 79 77 68 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a  ywhere else..*/.
27b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 48 41 56  #if !defined(HAV
27c0: 45 5f 4d 52 45 4d 41 50 29 0a 23 20 69 66 20 64  E_MREMAP).# if d
27d0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
27e0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 47 4e  ) && defined(_GN
27f0: 55 5f 53 4f 55 52 43 45 29 0a 23 20 20 64 65 66  U_SOURCE).#  def
2800: 69 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20  ine HAVE_MREMAP 
2810: 31 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69  1.# else.#  defi
2820: 6e 65 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 30  ne HAVE_MREMAP 0
2830: 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  .# endif.#endif.
2840: 0a 2f 2a 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c  ./*.** Explicitl
2850: 79 20 63 61 6c 6c 20 74 68 65 20 36 34 2d 62 69  y call the 64-bi
2860: 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65  t version of lse
2870: 65 6b 28 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e  ek() on Android.
2880: 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 73 65 65   Otherwise, lsee
2890: 6b 28 29 0a 2a 2a 20 69 73 20 74 68 65 20 33 32  k().** is the 32
28a0: 2d 62 69 74 20 76 65 72 73 69 6f 6e 2c 20 65 76  -bit version, ev
28b0: 65 6e 20 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53  en if _FILE_OFFS
28c0: 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20 64 65  ET_BITS=64 is de
28d0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  fined..*/.#ifdef
28e0: 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64   __ANDROID__.# d
28f0: 65 66 69 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65  efine lseek lsee
2900: 6b 36 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  k64.#endif../*.*
2910: 2a 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78  * Different Unix
2920: 20 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65   systems declare
2930: 20 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65   open() in diffe
2940: 72 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65  rent ways.  Same
2950: 20 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e   use.** open(con
2960: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64  st char*,int,mod
2970: 65 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73  e_t).  Others us
2980: 65 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e open(const cha
2990: 72 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20  r*,int,...)..** 
29a0: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
29b0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e  s important when
29c0: 20 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72   using a pointer
29d0: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
29e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65  ..**.** The safe
29f0: 73 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77  st way to deal w
2a00: 69 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ith the problem 
2a10: 69 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65  is to always use
2a20: 20 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a   this wrapper.**
2a30: 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61   which always ha
2a40: 73 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d  s the same well-
2a50: 64 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63  defined interfac
2a60: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2a70: 20 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74   posixOpen(const
2a80: 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
2a90: 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64  t flags, int mod
2aa0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  e){.  return ope
2ab0: 6e 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20  n(zFile, flags, 
2ac0: 6d 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72  mode);.}../* For
2ad0: 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a  ward reference *
2ae0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
2af0: 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
2b00: 20 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73   char*, int*);.s
2b10: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
2b20: 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b  tpagesize(void);
2b30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73  ../*.** Many sys
2b40: 74 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63  tem calls are ac
2b50: 63 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70  cessed through p
2b60: 6f 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69  ointer-to-functi
2b70: 6f 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ons so that.** t
2b80: 68 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72  hey may be overr
2b90: 69 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65  idden at runtime
2ba0: 20 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66   to facilitate f
2bb0: 61 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64  ault injection d
2bc0: 75 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67  uring.** testing
2bd0: 20 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e   and sandboxing.
2be0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2bf0: 61 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20  array holds the 
2c00: 6e 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65  names and pointe
2c10: 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65  rs.** to all ove
2c20: 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d  rrideable system
2c30: 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   calls..*/.stati
2c40: 63 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79  c struct unix_sy
2c50: 73 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20  scall {.  const 
2c60: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20  char *zName;    
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2c80: 6f 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61  of the system ca
2c90: 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ll */.  sqlite3_
2ca0: 73 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72  syscall_ptr pCur
2cb0: 72 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74  rent; /* Current
2cc0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79   value of the sy
2cd0: 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73  stem call */.  s
2ce0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2cf0: 74 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20  tr pDefault; /* 
2d00: 44 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f  Default value */
2d10: 0a 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20  .} aSyscall[] = 
2d20: 7b 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20  {.  { "open",   
2d30: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
2d40: 79 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78  yscall_ptr)posix
2d50: 4f 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65  Open,  0  },.#de
2d60: 66 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20  fine osOpen     
2d70: 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20   ((int(*)(const 
2d80: 63 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61  char*,int,int))a
2d90: 53 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72  Syscall[0].pCurr
2da0: 65 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65  ent)..  { "close
2db0: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
2dc0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63  e3_syscall_ptr)c
2dd0: 6c 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c  lose,      0  },
2de0: 0a 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65  .#define osClose
2df0: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e       ((int(*)(in
2e00: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70  t))aSyscall[1].p
2e10: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61  Current)..  { "a
2e20: 63 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73  ccess",       (s
2e30: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2e40: 74 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30  tr)access,     0
2e50: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41    },.#define osA
2e60: 63 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a  ccess    ((int(*
2e70: 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  )(const char*,in
2e80: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70  t))aSyscall[2].p
2e90: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67  Current)..  { "g
2ea0: 65 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73  etcwd",       (s
2eb0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
2ec0: 74 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30  tr)getcwd,     0
2ed0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47    },.#define osG
2ee0: 65 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a  etcwd    ((char*
2ef0: 28 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74  (*)(char*,size_t
2f00: 29 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43  ))aSyscall[3].pC
2f10: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74  urrent)..  { "st
2f20: 61 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  at",         (sq
2f30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
2f40: 72 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20  r)stat,       0 
2f50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74   },.#define osSt
2f60: 61 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29  at      ((int(*)
2f70: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72  (const char*,str
2f80: 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63  uct stat*))aSysc
2f90: 61 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29  all[4].pCurrent)
2fa0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50  ../*.** The DJGP
2fb0: 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72  P compiler envir
2fc0: 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73  onment looks mos
2fd0: 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62  tly like Unix, b
2fe0: 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74  ut it.** lacks t
2ff0: 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65  he fcntl() syste
3000: 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65  m call.  So rede
3010: 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20  fine fcntl() to 
3020: 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  be something.** 
3030: 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63  that always succ
3040: 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e  eeds.  This mean
3050: 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64  s that locking d
3060: 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
3070: 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42  der.** DJGPP.  B
3080: 75 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77  ut it is DOS - w
3090: 68 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65  hat did you expe
30a0: 63 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ct?.*/.#ifdef __
30b0: 44 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74  DJGPP__.  { "fst
30c0: 61 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20  at",        0,  
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
30e0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
30f0: 73 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30  stat(a,b,c)    0
3100: 0a 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20  .#else     .  { 
3110: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
3120: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3130: 5f 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20  _ptr)fstat,     
3140: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
3150: 73 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74  sFstat     ((int
3160: 28 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73  (*)(int,struct s
3170: 74 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35  tat*))aSyscall[5
3180: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64  ].pCurrent).#end
3190: 69 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61  if..  { "ftrunca
31a0: 74 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  te",    (sqlite3
31b0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72  _syscall_ptr)ftr
31c0: 75 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23  uncate,  0  },.#
31d0: 64 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61  define osFtrunca
31e0: 74 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c  te ((int(*)(int,
31f0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
3200: 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  6].pCurrent)..  
3210: 7b 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20  { "fcntl",      
3220: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3230: 6c 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20  ll_ptr)fcntl,   
3240: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
3250: 20 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69   osFcntl     ((i
3260: 6e 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e  nt(*)(int,int,..
3270: 2e 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70  .))aSyscall[7].p
3280: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
3290: 65 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73  ead",         (s
32a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
32b0: 74 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30  tr)read,       0
32c0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52    },.#define osR
32d0: 65 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65  ead      ((ssize
32e0: 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c  _t(*)(int,void*,
32f0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
3300: 5b 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23  [8].pCurrent)..#
3310: 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50  if defined(USE_P
3320: 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f  READ) || SQLITE_
3330: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
3340: 54 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22  TYLE.  { "pread"
3350: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3360: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
3370: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
3380: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
3390: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
33a0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
33b0: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
33c0: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
33d0: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
33e0: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
33f0: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
3400: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
3410: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
3420: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
3430: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
3440: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3450: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
3460: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
3470: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
3480: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
3490: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
34a0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
34b0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
34c0: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
34d0: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
34e0: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
34f0: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
3500: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
3510: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
3520: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
3530: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
3540: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
3550: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
3560: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
3570: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
3580: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
3590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
35a0: 5f 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54  _PREAD) || SQLIT
35b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35c0: 5f 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69  _STYLE.  { "pwri
35d0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
35e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
35f0: 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d  pwrite,     0  }
3600: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72  ,.#else.  { "pwr
3610: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
3620: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3630: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
3640: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
3650: 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28  e osPwrite    ((
3660: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63  ssize_t(*)(int,c
3670: 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f  onst void*,size_
3680: 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20  t,off_t))\.     
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
36a0: 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72  Syscall[12].pCur
36b0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
36c0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
36d0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
36e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
36f0: 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36  call_ptr)pwrite6
3700: 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  4,   0  },.#else
3710: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
3720: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3730: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3740: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
3750: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72  if.#define osPwr
3760: 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74  ite64  ((ssize_t
3770: 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  (*)(int,const vo
3780: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
3790: 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ))\.            
37a0: 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c 6c          aSyscall
37b0: 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [13].pCurrent)..
37c0: 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20 20    { "fchmod",   
37d0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
37e0: 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64 2c  call_ptr)fchmod,
37f0: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
3800: 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f 64  #define osFchmod
3810: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
3820: 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61 6c  ,mode_t))aSyscal
3830: 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[14].pCurrent).
3840: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56  .#if defined(HAV
3850: 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54  E_POSIX_FALLOCAT
3860: 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49 58  E) && HAVE_POSIX
3870: 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20 22  _FALLOCATE.  { "
3880: 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20 28  fallocate",    (
3890: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
38a0: 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f 63  ptr)posix_falloc
38b0: 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73 65  ate,  0 },.#else
38c0: 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65 22  .  { "fallocate"
38d0: 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79  ,    (sqlite3_sy
38e0: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c              0 },
3900: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
3910: 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69 6e  osFallocate ((in
3920: 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f  t(*)(int,off_t,o
3930: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31  ff_t))aSyscall[1
3940: 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  5].pCurrent)..  
3950: 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20 20  { "unlink",     
3960: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
3970: 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20 20  ll_ptr)unlink,  
3980: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3990: 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20 20  efine osUnlink  
39a0: 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74    ((int(*)(const
39b0: 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c 6c   char*))aSyscall
39c0: 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [16].pCurrent)..
39d0: 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74 6f    { "openDirecto
39e0: 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33  ry",    (sqlite3
39f0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70 65  _syscall_ptr)ope
3a00: 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20 20  nDirectory,     
3a10: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
3a20: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28 28  OpenDirectory ((
3a30: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
3a40: 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61 6c  r*,int*))aSyscal
3a50: 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[17].pCurrent).
3a60: 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20 20  .  { "mkdir",   
3a70: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3a80: 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72 2c  scall_ptr)mkdir,
3a90: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3aa0: 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72 20  #define osMkdir 
3ab0: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e      ((int(*)(con
3ac0: 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74 29  st char*,mode_t)
3ad0: 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70 43  )aSyscall[18].pC
3ae0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 6d  urrent)..  { "rm
3af0: 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73 71  dir",        (sq
3b00: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
3b10: 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20  r)rmdir,        
3b20: 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20     0 },.#define 
3b30: 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69 6e  osRmdir     ((in
3b40: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
3b50: 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e 70  ))aSyscall[19].p
3b60: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 66  Current)..  { "f
3b70: 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73  chown",       (s
3b80: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
3b90: 74 72 29 66 63 68 6f 77 6e 2c 20 20 20 20 20 20  tr)fchown,      
3ba0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3bb0: 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28 69   osFchown    ((i
3bc0: 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74 2c  nt(*)(int,uid_t,
3bd0: 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  gid_t))aSyscall[
3be0: 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  20].pCurrent).. 
3bf0: 20 7b 20 22 67 65 74 65 75 69 64 22 2c 20 20 20   { "geteuid",   
3c00: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
3c10: 61 6c 6c 5f 70 74 72 29 67 65 74 65 75 69 64 2c  all_ptr)geteuid,
3c20: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64           0 },.#d
3c30: 65 66 69 6e 65 20 6f 73 47 65 74 65 75 69 64 20  efine osGeteuid 
3c40: 20 20 28 28 75 69 64 5f 74 28 2a 29 28 76 6f 69    ((uid_t(*)(voi
3c50: 64 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  d))aSyscall[21].
3c60: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
3c70: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3c80: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
3c90: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
3ca0: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
3cb0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3cc0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
3cd0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
3ce0: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
3cf0: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3d00: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
3d10: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d 2e  t))aSyscall[22].
3d20: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
3d30: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
3d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
3d50: 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20  ptr)munmap,     
3d60: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
3d70: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69  e osMunmap ((voi
3d80: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
3d90: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d  _t))aSyscall[23]
3da0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
3db0: 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20  HAVE_MREMAP.  { 
3dc0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
3dd0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
3de0: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
3df0: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
3e00: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
3e10: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
3e20: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
3e30: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
3e40: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
3e50: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
3e60: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
3e70: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
3e80: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
3e90: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74  rrent)..  { "get
3ea0: 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c  pagesize",  (sql
3eb0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
3ec0: 29 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65  )unixGetpagesize
3ed0: 2c 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f  , 0 },.#define o
3ee0: 73 47 65 74 70 61 67 65 73 69 7a 65 20 28 28 69  sGetpagesize ((i
3ef0: 6e 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73  nt(*)(void))aSys
3f00: 63 61 6c 6c 5b 32 35 5d 2e 70 43 75 72 72 65 6e  call[25].pCurren
3f10: 74 29 0a 0a 20 20 7b 20 22 72 65 61 64 6c 69 6e  t)..  { "readlin
3f20: 6b 22 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33  k",     (sqlite3
3f30: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 65 61  _syscall_ptr)rea
3f40: 64 6c 69 6e 6b 2c 20 20 20 20 20 20 20 20 30 20  dlink,        0 
3f50: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65 61  },.#define osRea
3f60: 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65 5f 74 28  dlink ((ssize_t(
3f70: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63  *)(const char*,c
3f80: 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79  har*,size_t))aSy
3f90: 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75 72 72 65  scall[26].pCurre
3fa0: 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20  nt)..#endif..}; 
3fb0: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76  /* End of the ov
3fc0: 65 72 72 69 64 65 61 62 6c 65 20 73 79 73 74 65  errideable syste
3fd0: 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a  m calls */.../*.
3fe0: 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65  ** On some syste
3ff0: 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20 66 63 68  ms, calls to fch
4000: 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72 69 67 67  own() will trigg
4010: 65 72 20 61 20 6d 65 73 73 61 67 65 20 69 6e 20  er a message in 
4020: 61 20 73 65 63 75 72 69 74 79 0a 2a 2a 20 6c 6f  a security.** lo
4030: 67 20 69 66 20 74 68 65 79 20 63 6f 6d 65 20 66  g if they come f
4040: 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20 70 72 6f  rom non-root pro
4050: 63 65 73 73 65 73 2e 20 20 53 6f 20 61 76 6f 69  cesses.  So avoi
4060: 64 20 63 61 6c 6c 69 6e 67 20 66 63 68 6f 77 6e  d calling fchown
4070: 28 29 20 69 66 0a 2a 2a 20 77 65 20 61 72 65 20  () if.** we are 
4080: 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61 73 20 72  not running as r
4090: 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oot..*/.static i
40a0: 6e 74 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28  nt robustFchown(
40b0: 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20 75 69  int fd, uid_t ui
40c0: 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b 0a 23  d, gid_t gid){.#
40d0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
40e0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73 65 0a  return 0;.#else.
40f0: 20 20 72 65 74 75 72 6e 20 6f 73 47 65 74 65 75    return osGeteu
4100: 69 64 28 29 20 3f 20 30 20 3a 20 6f 73 46 63 68  id() ? 0 : osFch
4110: 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b  own(fd,uid,gid);
4120: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
4130: 20 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65   This is the xSe
4140: 74 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65  tSystemCall() me
4150: 74 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f  thod of sqlite3_
4160: 76 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74  vfs for all of t
4170: 68 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53  he.** "unix" VFS
4180: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4190: 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65  TE_OK opon succe
41a0: 73 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67  ssfully updating
41b0: 20 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63   the.** system c
41c0: 61 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20  all pointer, or 
41d0: 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
41e0: 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63  if there is no c
41f0: 6f 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73  onfigurable.** s
4200: 79 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64  ystem call named
4210: 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   zName..*/.stati
4220: 63 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73  c int unixSetSys
4230: 74 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74  temCall(.  sqlit
4240: 65 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64  e3_vfs *pNotUsed
4250: 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
4260: 56 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f  VFS pointer.  No
4270: 74 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  t used */.  cons
4280: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20  t char *zName,  
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
42a0: 65 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c  e of system call
42b0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a   to override */.
42c0: 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c    sqlite3_syscal
42d0: 6c 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20  l_ptr pNewFunc  
42e0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65  /* Pointer to ne
42f0: 77 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61  w system call va
4300: 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  lue */.){.  unsi
4310: 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e  gned int i;.  in
4320: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  t rc = SQLITE_NO
4330: 54 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45  TFOUND;..  UNUSE
4340: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74  D_PARAMETER(pNot
4350: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61  Used);.  if( zNa
4360: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  me==0 ){.    /* 
4370: 49 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67  If no zName is g
4380: 69 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c  iven, restore al
4390: 6c 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74  l system calls t
43a0: 6f 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a  o their default.
43b0: 20 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20      ** settings 
43c0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a  and return NULL.
43d0: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
43e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66  SQLITE_OK;.    f
43f0: 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
4400: 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f  (aSyscall)/sizeo
4410: 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20  f(aSyscall[0]); 
4420: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
4430: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4440: 61 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ault ){.        
4450: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
4460: 72 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  rent = aSyscall[
4470: 69 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20  i].pDefault;.   
4480: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
4490: 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e  se{.    /* If zN
44a0: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
44b0: 2c 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c  , operate on onl
44c0: 79 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d  y the one system
44d0: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65   call.    ** spe
44e0: 63 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  cified..    */. 
44f0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
4500: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
4510: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
4520: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
4530: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
4540: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4550: 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ame)==0 ){.     
4560: 20 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b     if( aSyscall[
4570: 69 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29  i].pDefault==0 )
4580: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73  {.          aSys
4590: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
45a0: 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70   = aSyscall[i].p
45b0: 43 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20  Current;.       
45c0: 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
45d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
45e0: 20 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d     if( pNewFunc=
45f0: 3d 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20  =0 ) pNewFunc = 
4600: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
4610: 61 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53  ault;.        aS
4620: 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65  yscall[i].pCurre
4630: 6e 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20  nt = pNewFunc;. 
4640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4660: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4670: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4680: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74   value of a syst
4690: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
46a0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69   NULL if zName i
46b0: 73 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67  s not a.** recog
46c0: 6e 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c  nized system cal
46d0: 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73  l name.  NULL is
46e0: 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
46f0: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
4700: 6c 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  l.** is currentl
4710: 79 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  y undefined..*/.
4720: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73  static sqlite3_s
4730: 79 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47  yscall_ptr unixG
4740: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
4750: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
4760: 74 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63  tUsed,.  const c
4770: 68 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20  har *zName.){.  
4780: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
4790: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
47a0: 54 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20  TER(pNotUsed);. 
47b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
47c0: 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a  of(aSyscall)/siz
47d0: 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29  eof(aSyscall[0])
47e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
47f0: 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53  strcmp(zName, aS
4800: 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29  yscall[i].zName)
4810: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79  ==0 ) return aSy
4820: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
4830: 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
4840: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
4850: 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
4860: 68 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20  he first system 
4870: 63 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65  call after zName
4880: 2e 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c  .  If zName==NUL
4890: 4c 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e  L.** then return
48a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
48b0: 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61   first system ca
48c0: 6c 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ll.  Return NULL
48d0: 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20   if zName.** is 
48e0: 74 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20  the last system 
48f0: 63 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65  call or if zName
4900: 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65   is not the name
4910: 20 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73   of a valid.** s
4920: 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73  ystem call..*/.s
4930: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
4940: 20 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d   *unixNextSystem
4950: 43 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73  Call(sqlite3_vfs
4960: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
4970: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
4980: 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44   = -1;..  UNUSED
4990: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20  _PARAMETER(p);. 
49a0: 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
49b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
49c0: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
49d0: 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
49e0: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
49f0: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
4a00: 61 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  ame)==0 ) break;
4a10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
4a20: 28 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i++; i<ArraySiz
4a30: 65 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b  e(aSyscall); i++
4a40: 29 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63  ){.    if( aSysc
4a50: 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21  all[i].pCurrent!
4a60: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
4a70: 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20  call[i].zName;. 
4a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
4a90: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61  ../*.** Do not a
4aa0: 63 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64  ccept any file d
4ab0: 65 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74  escriptor less t
4ac0: 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20  han this value, 
4ad0: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
4ae0: 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74  d.** opening dat
4af0: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
4b00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4b10: 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
4b20: 6e 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a  nly used for .**
4b30: 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c   standard input,
4b40: 20 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72   output, and err
4b50: 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  or..*/.#ifndef S
4b60: 51 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49  QLITE_MINIMUM_FI
4b70: 4c 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20  LE_DESCRIPTOR.# 
4b80: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49  define SQLITE_MI
4b90: 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52  NIMUM_FILE_DESCR
4ba0: 49 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a  IPTOR 3.#endif..
4bb0: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65  /*.** Invoke ope
4bc0: 6e 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74  n().  Do so mult
4bd0: 69 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69  iple times, unti
4be0: 6c 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63  l it either succ
4bf0: 65 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73  eeds or.** fails
4c00: 20 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e   for some reason
4c10: 20 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54   other than EINT
4c20: 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  R..**.** If the 
4c30: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
4c40: 64 65 20 22 6d 22 20 69 73 20 30 20 74 68 65 6e  de "m" is 0 then
4c50: 20 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64   set it to the d
4c60: 65 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51  efault for.** SQ
4c70: 4c 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75  Lite.  The defau
4c80: 6c 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46  lt is SQLITE_DEF
4c90: 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
4ca0: 53 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a  SIONS (normally.
4cb0: 2a 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69  ** 0644) as modi
4cc0: 66 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74  fied by the syst
4cd0: 65 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20  em umask.  If m 
4ce0: 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a  is not 0, then.*
4cf0: 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
4d00: 63 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65  creation mode be
4d10: 20 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72   exactly m ignor
4d20: 69 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a  ing the umask..*
4d30: 2a 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d  *.** The m param
4d40: 65 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e  eter will be non
4d50: 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20  -zero only when 
4d60: 63 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d  creating -wal, -
4d70: 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20  journal,.** and 
4d80: 2d 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20  -shm files.  We 
4d90: 77 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73  want those files
4da0: 20 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c   to have *exactl
4db0: 79 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70  y* the same.** p
4dc0: 65 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68  ermissions as th
4dd0: 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
4de0: 61 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72  abase, unadulter
4df0: 61 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73  ated by the umas
4e00: 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61  k..** In that wa
4e10: 79 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65  y, if a database
4e20: 20 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d   file is -rw-rw-
4e30: 72 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c  rw or -rw-rw-r-,
4e40: 20 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61   and a.** transa
4e50: 63 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e  ction crashes an
4e60: 64 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20  d leaves behind 
4e70: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  hot journals, th
4e80: 65 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73  en any.** proces
4e90: 73 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74  s that is able t
4ea0: 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64  o write to the d
4eb0: 61 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73  atabase will als
4ec0: 6f 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20  o be able to.** 
4ed0: 72 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20  recover the hot 
4ee0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61  journals..*/.sta
4ef0: 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f  tic int robust_o
4f00: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  pen(const char *
4f10: 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74  z, int f, mode_t
4f20: 20 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20   m){.  int fd;. 
4f30: 20 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f   mode_t m2 = m ?
4f40: 20 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41   m : SQLITE_DEFA
4f50: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
4f60: 49 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29  IONS;.  while(1)
4f70: 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f  {.#if defined(O_
4f80: 43 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20  CLOEXEC).    fd 
4f90: 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43  = osOpen(z,f|O_C
4fa0: 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73  LOEXEC,m2);.#els
4fb0: 65 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65  e.    fd = osOpe
4fc0: 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69  n(z,f,m2);.#endi
4fd0: 66 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29  f.    if( fd<0 )
4fe0: 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
4ff0: 6f 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69  o==EINTR ) conti
5000: 6e 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nue;.      break
5010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
5020: 66 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  fd>=SQLITE_MINIM
5030: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
5040: 4f 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OR ) break;.    
5050: 6f 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  osClose(fd);.   
5060: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
5070: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20  ITE_WARNING, .  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61                "a
5090: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c  ttempt to open \
50a0: 22 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65  "%s\" as file de
50b0: 73 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c  scriptor %d", z,
50c0: 20 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d   fd);.    fd = -
50d0: 31 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65  1;.    if( osOpe
50e0: 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66  n("/dev/null", f
50f0: 2c 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a  , m)<0 ) break;.
5100: 20 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20    }.  if( fd>=0 
5110: 29 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20  ){.    if( m!=0 
5120: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
5130: 73 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20  stat statbuf;.  
5140: 20 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28      if( osFstat(
5150: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30  fd, &statbuf)==0
5160: 20 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74   .       && stat
5170: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20  buf.st_size==0. 
5180: 20 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75        && (statbu
5190: 66 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21  f.st_mode&0777)!
51a0: 3d 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =m .      ){.   
51b0: 20 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64       osFchmod(fd
51c0: 2c 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , m);.      }.  
51d0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
51e0: 46 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28  FD_CLOEXEC) && (
51f0: 21 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58  !defined(O_CLOEX
5200: 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43  EC) || O_CLOEXEC
5210: 3d 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c  ==0).    osFcntl
5220: 28 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73  (fd, F_SETFD, os
5230: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46  Fcntl(fd, F_GETF
5240: 44 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58  D, 0) | FD_CLOEX
5250: 45 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  EC);.#endif.  }.
5260: 20 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a    return fd;.}..
5270: 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e  /*.** Helper fun
5280: 63 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e  ctions to obtain
5290: 20 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20   and relinquish 
52a0: 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
52b0: 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20  . The.** global 
52c0: 6d 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f  mutex is used to
52d0: 20 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69   protect the uni
52e0: 78 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a  xInodeInfo and.*
52f0: 2a 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  * vxworksFileId 
5300: 6f 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20  objects used by 
5310: 74 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f  this file, all o
5320: 66 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a  f which may be .
5330: 2a 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c  ** shared by mul
5340: 74 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a  tiple threads..*
5350: 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e  *.** Function un
5360: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73  ixMutexHeld() is
5370: 20 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28   used to assert(
5380: 29 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61  ) that the globa
5390: 6c 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68  l mutex .** is h
53a0: 65 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65  eld when require
53b0: 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
53c0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73   is only used as
53d0: 20 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28   part of assert(
53e0: 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ) .** statements
53f0: 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75  . e.g..**.**   u
5400: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a  nixEnterMutex().
5410: 2a 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75  **     assert( u
5420: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
5430: 3b 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72  ;.**   unixEnter
5440: 4c 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69  Leave().*/.stati
5450: 63 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72  c void unixEnter
5460: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
5470: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
5480: 65 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41  er(sqlite3MutexA
5490: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
54a0: 58 5f 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b  X_STATIC_VFS1));
54b0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  .}.static void u
54c0: 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f  nixLeaveMutex(vo
54d0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
54e0: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
54f0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
5500: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
5510: 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 69 66 64 65  _VFS1));.}.#ifde
5520: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
5530: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 75  tatic int unixMu
5540: 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b 0a  texHeld(void) {.
5550: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5560: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c 69  _mutex_held(sqli
5570: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
5580: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
5590: 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23 65 6e 64  C_VFS1));.}.#end
55a0: 69 66 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  if...#ifdef SQLI
55b0: 54 45 5f 48 41 56 45 5f 4f 53 5f 54 52 41 43 45  TE_HAVE_OS_TRACE
55c0: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
55d0: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
55e0: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
55f0: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
5600: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
5610: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
5620: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
5630: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
5640: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
5650: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
5660: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
5670: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
5680: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
5690: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
56a0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
56b0: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
56c0: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
56d0: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
56e0: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
56f0: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
5700: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
5710: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
5720: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
5730: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
5740: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
5750: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
5760: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
5770: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
5780: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
5790: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
57a0: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
57b0: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
57c0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
57d0: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
57e0: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
57f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5800: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
5810: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
5820: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
5830: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
5840: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
5850: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
5860: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
5870: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
5880: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
5890: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
58a0: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
58b0: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
58c0: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
58d0: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
58e0: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
58f0: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
5900: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
5910: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
5920: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
5930: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
5940: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
5950: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
5960: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
5970: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
5980: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
5990: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
59a0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
59b0: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
59c0: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
59d0: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
59e0: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
59f0: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
5a00: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
5a10: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
5a20: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
5a30: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
5a40: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
5a50: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
5a60: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
5a70: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
5a80: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
5a90: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
5aa0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
5ab0: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
5ac0: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
5ad0: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
5ae0: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
5af0: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
5b00: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
5b10: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
5b20: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
5b30: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
5b40: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
5b50: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
5b60: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
5b70: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
5b80: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
5b90: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
5ba0: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
5bb0: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
5bc0: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
5bd0: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
5be0: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
5bf0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
5c00: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
5c10: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
5c20: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
5c30: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
5c40: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
5c50: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
5c60: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
5c70: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
5c80: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
5c90: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
5ca0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
5cb0: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
5cc0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
5cd0: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
5ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
5cf0: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
5d00: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
5d10: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
5d20: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
5d30: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
5d40: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
5d50: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
5d60: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
5d70: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
5d80: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
5d90: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
5da0: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
5db0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
5dc0: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
5dd0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
5de0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
5df0: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
5e00: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
5e10: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
5e20: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
5e30: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
5e40: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
5e50: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
5e60: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77  hrough.** this w
5e70: 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20  rapper.  On the 
5e80: 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d  Android platform
5e90: 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
5ea0: 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63  logic below.** c
5eb0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63  ould lead to a c
5ec0: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
5ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5ee0: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
5ef0: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
5f00: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
5f10: 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  rc;.#ifdef __AND
5f20: 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41  ROID__.  /* On A
5f30: 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74  ndroid, ftruncat
5f40: 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20  e() always uses 
5f50: 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20  32-bit offsets, 
5f60: 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46  even if .  ** _F
5f70: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d  ILE_OFFSET_BITS=
5f80: 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  64 is defined. T
5f90: 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20  his means it is 
5fa0: 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70  unsafe to attemp
5fb0: 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  t to.  ** trunca
5fc0: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79  te a file to any
5fd0: 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61   size larger tha
5fe0: 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79  n 2GiB. Silently
5ff0: 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   ignore any.  **
6000: 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20   such attempts. 
6010: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71   */.  if( sz>(sq
6020: 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46  lite3_int64)0x7F
6030: 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63  FFFFFF ){.    rc
6040: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
6050: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64  }else.#endif.  d
6060: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
6070: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
6080: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
6090: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
60a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
60b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
60c0: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
60d0: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
60e0: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
60f0: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
6100: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
6110: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
6120: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
6130: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
6140: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
6150: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
6160: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
6170: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
6180: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
6190: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
61a0: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
61b0: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
61c0: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
61d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
61e0: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
61f0: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
6200: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
6210: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
6220: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
6230: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
6240: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
6250: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
6260: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
6270: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
6280: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
6290: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
62a0: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
62b0: 7b 0a 20 20 61 73 73 65 72 74 28 20 28 73 71 6c  {.  assert( (sql
62c0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
62d0: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
62e0: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 73 71  | .          (sq
62f0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
6300: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
6310: 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ) || .          
6320: 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20  (sqliteIOErr == 
6330: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
6340: 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  OCK) ||.        
6350: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
6360: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
6370: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
6380: 29 20 29 3b 0a 20 20 73 77 69 74 63 68 20 28 70  ) );.  switch (p
6390: 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20 20 63  osixError) {.  c
63a0: 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20 20 63  ase EACCES: .  c
63b0: 61 73 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61  ase EAGAIN:.  ca
63c0: 73 65 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20  se ETIMEDOUT:.  
63d0: 63 61 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61  case EBUSY:.  ca
63e0: 73 65 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65  se EINTR:.  case
63f0: 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f   ENOLCK:  .    /
6400: 2a 20 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74  * random NFS ret
6410: 72 79 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73  ry error, unless
6420: 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73   during file sys
6430: 74 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20  tem support .   
6440: 20 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f    * introspectio
6450: 6e 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61  n, in which it a
6460: 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68  ctually means wh
6470: 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20  at it says */.  
6480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6490: 42 55 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73  BUSY;.    .  cas
64a0: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
64c0: 3b 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74  ;.    .  default
64d0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  : .    return sq
64e0: 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d  liteIOErr;.  }.}
64f0: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .../************
6500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6540: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
6550: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71  ***** Begin Uniq
6560: 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69  ue File ID Utili
6570: 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72  ty Used By VxWor
6580: 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks *************
6590: 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74  **.**.** On most
65a0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69   versions of uni
65b0: 78 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20  x, we can get a 
65c0: 75 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20  unique ID for a 
65d0: 66 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e  file by concaten
65e0: 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76  ating.** the dev
65f0: 69 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  ice number and t
6600: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e  he inode number.
6610: 20 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20    But this does 
6620: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
6630: 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72  rks..** On VxWor
6640: 6b 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c  ks, a unique fil
6650: 65 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73  e id must be bas
6660: 65 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69  ed on the canoni
6670: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  cal filename..**
6680: 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
6690: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
66a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
66b0: 72 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75  ructure can be u
66c0: 73 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71  sed as a.** uniq
66d0: 75 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78  ue file ID in Vx
66e0: 57 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73  Works.  Each ins
66f0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
6700: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
6710: 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68  .** a copy of th
6720: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  e canonical file
6730: 6e 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20  name.  There is 
6740: 61 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65  also a reference
6750: 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65   count.  .** The
6760: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65   structure is re
6770: 63 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65  claimed when the
6780: 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   number of point
6790: 65 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20  ers to it drops 
67a0: 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a  to.** zero..**.*
67b0: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65  * There are neve
67c0: 72 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65  r very many file
67d0: 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69  s open at one ti
67e0: 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61  me and lookups a
67f0: 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66  re not.** a perf
6800: 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c  ormance-critical
6810: 20 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20   path, so it is 
6820: 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75  sufficient to pu
6830: 74 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63  t these.** struc
6840: 74 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65  tures on a linke
6850: 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63  d list..*/.struc
6860: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
6870: 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  {.  struct vxwor
6880: 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b  ksFileId *pNext;
6890: 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c    /* Next in a l
68a0: 69 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20  ist of them all 
68b0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
68e0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
68f0: 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  is one */.  int 
6900: 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  nName;          
6910: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
6920: 67 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f  gth of the zCano
6930: 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69  nicalName[] stri
6940: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  ng */.  char *zC
6950: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20  anonicalName;   
6960: 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63        /* Canonic
6970: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d  al filename */.}
6980: 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  ;..#if OS_VXWORK
6990: 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69  S./* .** All uni
69a0: 71 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72  que filenames ar
69b0: 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b  e held on a link
69c0: 65 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62  ed list headed b
69d0: 79 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62  y this.** variab
69e0: 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  le:.*/.static st
69f0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
6a00: 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c  Id *vxworksFileL
6a10: 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
6a20: 53 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e  Simplify a filen
6a30: 61 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e  ame into its can
6a40: 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62  onical form.** b
6a50: 79 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c  y making the fol
6a60: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a  lowing changes:.
6a70: 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e  **.**  * removin
6a80: 67 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61  g any trailing a
6a90: 6e 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a  nd duplicate /.*
6aa0: 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f  *  * convert /./
6ab0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20   into just /.** 
6ac0: 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e   * convert /A/..
6ad0: 2f 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79  / where A is any
6ae0: 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74   simple name int
6af0: 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43  o just /.**.** C
6b00: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
6b10: 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72  in-place.  Retur
6b20: 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c  n the new name l
6b30: 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ength..**.** The
6b40: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61   original filena
6b50: 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d  me is in z[0..n-
6b60: 31 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  1].  Return the 
6b70: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61  number of.** cha
6b80: 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73  racters in the s
6b90: 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a  implified name..
6ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78  */.static int vx
6bb0: 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d  worksSimplifyNam
6bc0: 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  e(char *z, int n
6bd0: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
6be0: 20 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a   while( n>1 && z
6bf0: 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d  [n-1]=='/' ){ n-
6c00: 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30  -; }.  for(i=j=0
6c10: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
6c20: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29   if( z[i]=='/' )
6c30: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  {.      if( z[i+
6c40: 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e  1]=='/' ) contin
6c50: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b  ue;.      if( z[
6c60: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32  i+1]=='.' && i+2
6c70: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f  <n && z[i+2]=='/
6c80: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b  ' ){.        i +
6c90: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 1;.        con
6ca0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6cb0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
6cc0: 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26  ='.' && i+3<n &&
6cd0: 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20   z[i+2]=='.' && 
6ce0: 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20  z[i+3]=='/' ){. 
6cf0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e         while( j>
6d00: 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27  0 && z[j-1]!='/'
6d10: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
6d20: 20 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d     if( j>0 ){ j-
6d30: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b  -; }.        i +
6d40: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  = 2;.        con
6d50: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
6d60: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20     }.    z[j++] 
6d70: 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b  = z[i];.  }.  z[
6d80: 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  j] = 0;.  return
6d90: 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   j;.}../*.** Fin
6da0: 64 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20  d a unique file 
6db0: 49 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ID for the given
6dc0: 20 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61   absolute pathna
6dd0: 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  me.  Return.** a
6de0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6df0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
6e00: 6a 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e  ject.  This poin
6e10: 74 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75  ter is the uniqu
6e20: 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a  e.** file ID..**
6e30: 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65  .** The nRef fie
6e40: 6c 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b  ld of the vxwork
6e50: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
6e60: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65  s incremented be
6e70: 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  fore.** the obje
6e80: 63 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ct is returned. 
6e90: 20 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69   A new vxworksFi
6ea0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63  leId object is c
6eb0: 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64  reated.** and ad
6ec0: 64 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61  ded to the globa
6ed0: 6c 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73  l list if necess
6ee0: 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ary..**.** If a 
6ef0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
6f00: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
6f10: 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a  return NULL..*/.
6f20: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
6f30: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
6f40: 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63  orksFindFileId(c
6f50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f  onst char *zAbso
6f60: 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72  luteName){.  str
6f70: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
6f80: 64 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20  d *pNew;        
6f90: 20 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61   /* search key a
6fa0: 6e 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a  nd new file ID *
6fb0: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
6fc0: 6b 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69  ksFileId *pCandi
6fd0: 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c  date;   /* For l
6fe0: 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73  ooping over exis
6ff0: 74 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f  ting file IDs */
7000: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7020: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
7030: 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d   of zAbsoluteNam
7040: 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61  e string */..  a
7050: 73 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65  ssert( zAbsolute
7060: 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a  Name[0]=='/' );.
7070: 20 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    n = (int)strle
7080: 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29  n(zAbsoluteName)
7090: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
70a0: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
70b0: 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b  eof(*pNew) + (n+
70c0: 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  1) );.  if( pNew
70d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
70e0: 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63    pNew->zCanonic
70f0: 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  alName = (char*)
7100: 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63  &pNew[1];.  memc
7110: 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  py(pNew->zCanoni
7120: 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75  calName, zAbsolu
7130: 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20  teName, n+1);.  
7140: 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c  n = vxworksSimpl
7150: 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43  ifyName(pNew->zC
7160: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
7170: 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68 20 66  ;..  /* Search f
7180: 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67 20 65  or an existing e
7190: 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63 68 69  ntry that matchi
71a0: 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  ng the canonical
71b0: 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66   name..  ** If f
71c0: 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20  ound, increment 
71d0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
71e0: 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 61  unt and return a
71f0: 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a   pointer to.  **
7200: 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 66 69   the existing fi
7210: 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e  le ID..  */.  un
7220: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
7230: 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61 74 65    for(pCandidate
7240: 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  =vxworksFileList
7250: 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20 70 43  ; pCandidate; pC
7260: 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64 69 64  andidate=pCandid
7270: 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ate->pNext){.   
7280: 20 69 66 28 20 70 43 61 6e 64 69 64 61 74 65 2d   if( pCandidate-
7290: 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20  >nName==n .     
72a0: 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69  && memcmp(pCandi
72b0: 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  date->zCanonical
72c0: 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e  Name, pNew->zCan
72d0: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d  onicalName, n)==
72e0: 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20  0.    ){.       
72f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
7300: 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61 6e 64  w);.       pCand
7310: 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  idate->nRef++;. 
7320: 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
7330: 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 72  utex();.       r
7340: 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61 74 65  eturn pCandidate
7350: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
7360: 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73 20 66  * No match was f
7370: 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d  ound.  We will m
7380: 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65 20 49  ake a new file I
7390: 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65  D */.  pNew->nRe
73a0: 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e  f = 1;.  pNew->n
73b0: 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77  Name = n;.  pNew
73c0: 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b  ->pNext = vxwork
73d0: 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77  sFileList;.  vxw
73e0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 70  orksFileList = p
73f0: 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  New;.  unixLeave
7400: 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
7410: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
7420: 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
7430: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f  eference count o
7440: 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  n a vxworksFileI
7450: 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65 65 0a  d object.  Free.
7460: 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20 77 68  ** the object wh
7470: 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  en the reference
7480: 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a   count reaches z
7490: 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ero..*/.static v
74a0: 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c 65 61  oid vxworksRelea
74b0: 73 65 46 69 6c 65 49 64 28 73 74 72 75 63 74 20  seFileId(struct 
74c0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
74d0: 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72  Id){.  unixEnter
74e0: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
74f0: 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29  t( pId->nRef>0 )
7500: 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b  ;.  pId->nRef--;
7510: 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52 65 66  .  if( pId->nRef
7520: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ==0 ){.    struc
7530: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
7540: 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28 70 70  **pp;.    for(pp
7550: 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73  =&vxworksFileLis
7560: 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21 3d 70  t; *pp && *pp!=p
7570: 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70 70 29  Id; pp = &((*pp)
7580: 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20  ->pNext)){}.    
7590: 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70 49 64  assert( *pp==pId
75a0: 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49   );.    *pp = pI
75b0: 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71  d->pNext;.    sq
75c0: 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64 29 3b  lite3_free(pId);
75d0: 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
75e0: 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69  Mutex();.}.#endi
75f0: 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
7600: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
7610: 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69 71 75  *** End of Uniqu
7620: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
7630: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
7640: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
7650: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
7660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76a0: 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
76b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
76f0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
7700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7710: 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20   Posix Advisory 
7720: 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
7730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
7740: 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58  ****.**.** POSIX
7750: 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20   advisory locks 
7760: 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20 64 65  are broken by de
7770: 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54 44 20  sign.  ANSI STD 
7780: 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a  1003.1 (1996).**
7790: 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32   section 6.5.2.2
77a0: 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72 6f 75   lines 483 throu
77b0: 67 68 20 34 39 30 20 73 70 65 63 69 66 79 20 74  gh 490 specify t
77c0: 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f 63 65  hat when a proce
77d0: 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c  ss.** sets or cl
77e0: 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61  ears a lock, tha
77f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76 65 72  t operation over
7800: 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f 72 20  rides any prior 
7810: 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20  locks set.** by 
7820: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
7830: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 65  .  It does not e
7840: 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20 73 6f  xplicitly say so
7850: 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70 6c 69  , but this impli
7860: 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20 6f 76  es.** that it ov
7870: 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20 73 65  errides locks se
7880: 74 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  t by the same pr
7890: 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20 64 69  ocess using a di
78a0: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
78b0: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e  descriptor.  Con
78c0: 73 69 64 65 72 20 74 68 69 73 20 74 65 73 74 20  sider this test 
78d0: 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  case:.**.**     
78e0: 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e    int fd1 = open
78f0: 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44  ("./file1", O_RD
7900: 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34  WR|O_CREAT, 0644
7910: 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20  );.**       int 
7920: 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69  fd2 = open("./fi
7930: 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  le2", O_RDWR|O_C
7940: 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a  REAT, 0644);.**.
7950: 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c  ** Suppose ./fil
7960: 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61  e1 and ./file2 a
7970: 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20 73 61  re really the sa
7980: 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75 73 65  me file (because
7990: 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68 61 72  .** one is a har
79a0: 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69  d or symbolic li
79b0: 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65 72 29  nk to the other)
79c0: 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73 65 74   then if you set
79d0: 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69 76 65  .** an exclusive
79e0: 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68   lock on fd1, th
79f0: 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20 61 6e  en try to get an
7a00: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a   exclusive lock.
7a10: 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f  ** on fd2, it wo
7a20: 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20 68 61  rks.  I would ha
7a30: 76 65 20 65 78 70 65 63 74 65 64 20 74 68 65 20  ve expected the 
7a40: 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a  second lock to.*
7a50: 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74 68 65  * fail since the
7a60: 72 65 20 77 61 73 20 61 6c 72 65 61 64 79 20 61  re was already a
7a70: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
7a80: 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a  e due to fd1..**
7a90: 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69   But not so.  Si
7aa0: 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63  nce both locks c
7ab0: 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73 61 6d  ame from the sam
7ac0: 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a  e process, the.*
7ad0: 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72 69 64  * second overrid
7ae0: 65 73 20 74 68 65 20 66 69 72 73 74 2c 20 65 76  es the first, ev
7af0: 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79 20 77  en though they w
7b00: 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65 6e 74  ere on different
7b10: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
7b20: 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64  tors opened on d
7b30: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20 6e 61  ifferent file na
7b40: 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  mes..**.** This 
7b50: 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 63 61  means that we ca
7b60: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
7b70: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
7b80: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 0a  ize file access.
7b90: 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69  ** among competi
7ba0: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
7bb0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
7bc0: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
7bd0: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
7be0: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
7bf0: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
7c00: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
7c10: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
7c20: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
7c30: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
7c40: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
7c50: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
7c60: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
7c70: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
7c80: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
7c90: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
7ca0: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
7cb0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
7cc0: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
7cd0: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
7ce0: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
7cf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
7d00: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
7d10: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
7d20: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
7d30: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
7d40: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
7d50: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
7d60: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
7d70: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
7d80: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
7d90: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
7da0: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
7db0: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
7dc0: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
7dd0: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
7de0: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
7df0: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
7e00: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
7e10: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
7e20: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
7e30: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
7e40: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
7e50: 20 28 41 73 69 64 65 3a 20 54 68 65 20 75 73 65   (Aside: The use
7e60: 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72   of inode number
7e70: 73 20 61 73 20 75 6e 69 71 75 65 20 49 44 73 20  s as unique IDs 
7e80: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
7e90: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72   VxWorks..** For
7ea0: 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68 61 76   VxWorks, we hav
7eb0: 65 20 74 6f 20 75 73 65 20 74 68 65 20 61 6c 74  e to use the alt
7ec0: 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75 65 20  ernative unique 
7ed0: 49 44 20 73 79 73 74 65 6d 20 62 61 73 65 64 20  ID system based 
7ee0: 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20  on.** canonical 
7ef0: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70  filename and imp
7f00: 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68 65 20  lemented in the 
7f10: 70 72 65 76 69 6f 75 73 20 64 69 76 69 73 69 6f  previous divisio
7f20: 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71  n.).**.** The sq
7f30: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
7f40: 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20 69  ture for POSIX i
7f50: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74  s no longer just
7f60: 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c 65   an integer file
7f70: 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e 20  .** descriptor. 
7f80: 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74 72   It is now a str
7f90: 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c 64  ucture that hold
7fa0: 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66 69  s the integer fi
7fb0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
7fc0: 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74   and a pointer t
7fd0: 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  o a structure th
7fe0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
7ff0: 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63   internal.** loc
8000: 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65 73  ks on the corres
8010: 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20  ponding inode.  
8020: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63  There is one loc
8030: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a 2a  king structure.*
8040: 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20  * per inode, so 
8050: 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  if the same inod
8060: 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69 63  e is opened twic
8070: 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69 6c 65  e, both unixFile
8080: 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70   structures.** p
8090: 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65  oint to the same
80a0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
80b0: 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  re.  The locking
80c0: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
80d0: 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
80e0: 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c  count (so we wil
80f0: 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64  l know when to d
8100: 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20  elete it) and a 
8110: 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74  "cnt".** field t
8120: 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73  hat tells us its
8130: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
8140: 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d  tatus.  cnt==0 m
8150: 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65  eans the.** file
8160: 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63   is unlocked.  c
8170: 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65  nt==-1 means the
8180: 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63   file has an exc
8190: 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20  lusive lock..** 
81a0: 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72  cnt>0 means ther
81b0: 65 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64  e are cnt shared
81c0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69   locks on the fi
81d0: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74  le..**.** Any at
81e0: 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72  tempt to lock or
81f0: 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66   unlock a file f
8200: 69 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20  irst checks the 
8210: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63  locking.** struc
8220: 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c  ture.  The fcntl
8230: 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69  () system call i
8240: 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74  s only invoked t
8250: 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49  o set a .** POSI
8260: 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e  X lock if the in
8270: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75  ternal lock stru
8280: 63 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e  cture transition
8290: 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c  s between.** a l
82a0: 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c  ocked and an unl
82b0: 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a  ocked state..**.
82c0: 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20 74 68  ** But wait:  th
82d0: 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f 72 65  ere are yet more
82e0: 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68 20 50   problems with P
82f0: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
8300: 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f  cks..**.** If yo
8310: 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20 64  u close a file d
8320: 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 70  escriptor that p
8330: 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65 20  oints to a file 
8340: 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a  that has locks,.
8350: 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20  ** all locks on 
8360: 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20 61  that file that a
8370: 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20  re owned by the 
8380: 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20  current process 
8390: 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e  are.** released.
83a0: 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64    To work around
83b0: 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65   this problem, e
83c0: 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ach unixInodeInf
83d0: 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e  o object.** main
83e0: 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66  tains a count of
83f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
8400: 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20  ending locks on 
8410: 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68  tha inode..** Wh
8420: 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  en an attempt is
8430: 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61   made to close a
8440: 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66 20 74  n unixFile, if t
8450: 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65  here are.** othe
8460: 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20  r unixFile open 
8470: 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e 6f 64  on the same inod
8480: 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c 64 69  e that are holdi
8490: 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61  ng locks, the ca
84a0: 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29  ll.** to close()
84b0: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
84c0: 70 74 6f 72 20 69 73 20 64 65 66 65 72 72 65 64  ptor is deferred
84d0: 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68   until all of th
84e0: 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a  e locks clear..*
84f0: 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  * The unixInodeI
8500: 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 6b 65  nfo structure ke
8510: 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20 66 69  eps a list of fi
8520: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 74  le descriptors t
8530: 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62  hat need to.** b
8540: 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74 68 61  e closed and tha
8550: 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b 65 64  t list is walked
8560: 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29 20 77   (and cleared) w
8570: 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
8580: 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a  k.** clears..**.
8590: 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72 20 70  ** Yet another p
85a0: 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68  roblem:  LinuxTh
85b0: 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61  reads do not pla
85c0: 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f 73 69  y well with posi
85d0: 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d  x locks..**.** M
85e0: 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73 69 6f  any older versio
85f0: 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73 65 20  ns of linux use 
8600: 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61 64 73  the LinuxThreads
8610: 20 6c 69 62 72 61 72 79 20 77 68 69 63 68 20 69   library which i
8620: 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63  s.** not posix c
8630: 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72  ompliant.  Under
8640: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20 61   LinuxThreads, a
8650: 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79   lock created by
8660: 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e   thread.** A can
8670: 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65 64 20  not be modified 
8680: 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  or overridden by
8690: 20 61 20 64 69 66 66 65 72 65 6e 74 20 74 68 72   a different thr
86a0: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74  ead B..** Only t
86b0: 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f 64 69  hread A can modi
86c0: 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f  fy the lock.  Lo
86d0: 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72 20 69  cking behavior i
86e0: 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20  s correct.** if 
86f0: 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e 20 75  the appliation u
8700: 73 65 73 20 74 68 65 20 6e 65 77 65 72 20 4e 61  ses the newer Na
8710: 74 69 76 65 20 50 6f 73 69 78 20 54 68 72 65 61  tive Posix Threa
8720: 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54 4c 29  d Library (NPTL)
8730: 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77  .** on linux - w
8740: 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20  ith NPTL a lock 
8750: 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65 61  created by threa
8760: 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65  d A can override
8770: 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72   locks.** in thr
8780: 65 61 64 20 42 2e 20 20 42 75 74 20 74 68 65 72  ead B.  But ther
8790: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b  e is no way to k
87a0: 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  now at compile-t
87b0: 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74 68 72  ime which.** thr
87c0: 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79 20 69  eading library i
87d0: 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20 20 53  s being used.  S
87e0: 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61  o there is no wa
87f0: 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20  y to know at.** 
8800: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 65  compile-time whe
8810: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 72 65  ther or not thre
8820: 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69 64  ad A can overrid
8830: 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61  e locks on threa
8840: 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20  d B..** One has 
8850: 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65  to do a run-time
8860: 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63 6f 76   check to discov
8870: 65 72 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  er the behavior 
8880: 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  of the.** curren
8890: 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  t process..**.**
88a0: 20 53 51 4c 69 74 65 20 75 73 65 64 20 74 6f 20   SQLite used to 
88b0: 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54 68 72  support LinuxThr
88c0: 65 61 64 73 2e 20 20 42 75 74 20 73 75 70 70 6f  eads.  But suppo
88d0: 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68 72 65  rt for LinuxThre
88e0: 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70  ads.** was dropp
88f0: 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ed beginning wit
8900: 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e  h version 3.7.0.
8910: 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 73 74    SQLite will st
8920: 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a  ill work with.**
8930: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 70 72   LinuxThreads pr
8940: 6f 76 69 64 65 64 20 74 68 61 74 20 28 31 29 20  ovided that (1) 
8950: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65  there is no more
8960: 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63   than one connec
8970: 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74  tion .** per dat
8980: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68  abase file in th
8990: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 61  e same process a
89a0: 6e 64 20 28 32 29 20 64 61 74 61 62 61 73 65 20  nd (2) database 
89b0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64  connections.** d
89c0: 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73  o not move acros
89d0: 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f  s threads..*/../
89e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
89f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
8a00: 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72 76  g structure serv
8a10: 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75 73  es as the key us
8a20: 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20  ed.** to locate 
8a30: 61 20 70 61 72 74 69 63 75 6c 61 72 20 75 6e 69  a particular uni
8a40: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
8a50: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  t..*/.struct uni
8a60: 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f  xFileId {.  dev_
8a70: 74 20 64 65 76 3b 20 20 20 20 20 20 20 20 20 20  t dev;          
8a80: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
8a90: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20  e number */.#if 
8aa0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72  OS_VXWORKS.  str
8ab0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
8ac0: 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71  d *pId;  /* Uniq
8ad0: 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20 76  ue file ID for v
8ae0: 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65  xworks. */.#else
8af0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
8b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8b10: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
8b20: 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a  /.#endif.};../*.
8b30: 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ** An instance o
8b40: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8b50: 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c  structure is all
8b60: 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  ocated for each 
8b70: 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20  open.** inode.  
8b80: 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65  Or, on LinuxThre
8b90: 61 64 73 2c 20 74 68 65 72 65 20 69 73 20 6f 6e  ads, there is on
8ba0: 65 20 6f 66 20 74 68 65 73 65 20 73 74 72 75 63  e of these struc
8bb0: 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63  tures for.** eac
8bc0: 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62  h inode opened b
8bd0: 79 20 65 61 63 68 20 74 68 72 65 61 64 2e 0a 2a  y each thread..*
8be0: 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e  *.** A single in
8bf0: 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c  ode can have mul
8c00: 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72  tiple file descr
8c10: 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20  iptors, so each 
8c20: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
8c30: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
8c40: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
8c50: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
8c60: 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69 73 0a  object and this.
8c70: 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70 73 20  ** object keeps 
8c80: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
8c90: 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46 69 6c  umber of unixFil
8ca0: 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74  e pointing to it
8cb0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
8cc0: 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74  InodeInfo {.  st
8cd0: 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20  ruct unixFileId 
8ce0: 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20 2f 2a  fileId;       /*
8cf0: 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20   The lookup key 
8d00: 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72 65 64  */.  int nShared
8d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8d20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8d30: 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 68  f SHARED locks h
8d40: 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  eld */.  unsigne
8d50: 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b  d char eFileLock
8d60: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  ;        /* One 
8d70: 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20  of SHARED_LOCK, 
8d80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74  RESERVED_LOCK et
8d90: 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  c. */.  unsigned
8da0: 20 63 68 61 72 20 62 50 72 6f 63 65 73 73 4c 6f   char bProcessLo
8db0: 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20 65 78  ck;     /* An ex
8dc0: 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73 73 20  clusive process 
8dd0: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a  lock is held */.
8de0: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
8e10: 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73 20  ointers to this 
8e20: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 75  structure */.  u
8e30: 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
8e40: 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f  Node;          /
8e50: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
8e60: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
8e70: 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20  this inode */.  
8e80: 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20  int nLock;      
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ea0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  /* Number of out
8eb0: 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f  standing file lo
8ec0: 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  cks */.  UnixUnu
8ed0: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
8ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
8ef0: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
8f00: 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a  ors to close */.
8f10: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
8f20: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20  *pNext;         
8f30: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
8f40: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
8f50: 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78  bjects */.  unix
8f60: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
8f70: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20  ;           /*  
8f80: 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69    .... doubly li
8f90: 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49  nked */.#if SQLI
8fa0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
8fb0: 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e  G_STYLE.  unsign
8fc0: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61  ed long long sha
8fd0: 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72  redByte;  /* for
8fe0: 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73   AFP simulated s
8ff0: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65  hared lock */.#e
9000: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f  ndif.#if OS_VXWO
9010: 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65  RKS.  sem_t *pSe
9020: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
9030: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50        /* Named P
9040: 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20 2a  OSIX semaphore *
9050: 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61 6d  /.  char aSemNam
9060: 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32  e[MAX_PATHNAME+2
9070: 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ];  /* Name of t
9080: 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f  hat semaphore */
9090: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
90a0: 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c  * A lists of all
90b0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
90c0: 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  bjects..*/.stati
90d0: 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  c unixInodeInfo 
90e0: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
90f0: 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ./*.**.** This f
9100: 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f  unction - unixLo
9110: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20  gErrorAtLine(), 
9120: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
9130: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
9140: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
9150: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
9160: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
9170: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
9180: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
9190: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
91a0: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
91b0: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
91c0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
91d0: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
91e0: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
91f0: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
9200: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
9210: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
9220: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
9230: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
9240: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
9250: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
9260: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
9270: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
9280: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
9290: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
92a0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
92b0: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
92c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
92d0: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
92e0: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
92f0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
9300: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
9310: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
9320: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
9330: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
9340: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
9350: 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ") and the assoc
9360: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
9370: 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e  m path,.** if an
9380: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e  y..*/.#define un
9390: 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  ixLogError(a,b,c
93a0: 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  )     unixLogErr
93b0: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
93c0: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
93d0: 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  int unixLogError
93e0: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
93f0: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
9400: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
9410: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
9420: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9430: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
9440: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
9450: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
9460: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
9470: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
9480: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
9490: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
94a0: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
94b0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
94e0: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
94f0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
9500: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
9510: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
9520: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
9530: 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  e from strerror(
9540: 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ) or equivalent 
9550: 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20  */.  int iErrno 
9560: 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  = errno;        
9570: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79       /* Saved sy
9580: 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62  scall error numb
9590: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
95a0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72  his is not a thr
95b0: 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53  eadsafe build (S
95c0: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
95d0: 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20  ==0), then use. 
95e0: 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72   ** the strerror
95f0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f  () function to o
9600: 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d  btain the human-
9610: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d  readable error m
9620: 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69  essage.  ** equi
9630: 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e  valent to errno.
9640: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
9650: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20  strerror_r()..  
9660: 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  */ .#if SQLITE_T
9670: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
9680: 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52  ined(HAVE_STRERR
9690: 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72  OR_R).  char aEr
96a0: 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  r[80];.  memset(
96b0: 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aErr, 0, sizeof(
96c0: 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d  aErr));.  zErr =
96d0: 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20   aErr;..  /* If 
96e0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
96f0: 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f  P (set by autoco
9700: 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f  nf scripts) or _
9710: 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69  _USE_GNU is defi
9720: 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ned,.  ** assume
9730: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
9740: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e   provides the GN
9750: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
9760: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20  error_r() that. 
9770: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
9780: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
9790: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
97a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
97b0: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
97c0: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
97d0: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
97e0: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
97f0: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
9800: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
9810: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
9820: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
9830: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
9840: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
9850: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
9860: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
9870: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
9880: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
9890: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
98a0: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
98b0: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
98c0: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
98d0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
98e0: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
98f0: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
9900: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
9910: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
9920: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
9930: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
9940: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
9950: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
9960: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
9970: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
9980: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
9990: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
99a0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
99b0: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
99c0: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
99d0: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
99e0: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
99f0: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
9a00: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
9a10: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
9a20: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
9a30: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
9a40: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
9a50: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
9a60: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
9a70: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
9a80: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
9a90: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
9aa0: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
9ab0: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
9ac0: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
9ad0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
9ae0: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
9af0: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
9b00: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
9b10: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
9b20: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
9b30: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
9b40: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
9b50: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
9b60: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
9b70: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
9b80: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
9b90: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
9ba0: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
9bb0: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
9bc0: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
9bd0: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
9be0: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
9bf0: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
9c00: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
9c10: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
9c20: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
9c30: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
9c40: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
9c50: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
9c60: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
9c70: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
9c80: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
9c90: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
9ca0: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
9cb0: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
9cc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9cd0: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
9ce0: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
9cf0: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
9d00: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
9d10: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
9d20: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
9d30: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
9d40: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
9d50: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
9d60: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
9d70: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
9d80: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
9d90: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
9da0: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
9db0: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
9dc0: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
9dd0: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
9de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9df0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
9e00: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
9e10: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
9e20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
9e30: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
9e40: 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20  .  Do this in a 
9e50: 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68  subroutine as th
9e60: 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61  at provides.** a
9e70: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
9e80: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
9e90: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
9ea0: 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45   void storeLastE
9eb0: 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70  rrno(unixFile *p
9ec0: 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29  File, int error)
9ed0: 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  {.  pFile->lastE
9ee0: 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a  rrno = error;.}.
9ef0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
9f00: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
9f10: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
9f20: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
9f30: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
9f40: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
9f50: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
9f60: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9f70: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
9f80: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
9f90: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
9fa0: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
9fb0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
9fc0: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
9fd0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
9fe0: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
9ff0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
a000: 3b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  ;.    robust_clo
a010: 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c  se(pFile, p->fd,
a020: 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
a030: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
a040: 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  .  }.  pInode->p
a050: 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
a060: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75  *.** Release a u
a070: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72  nixInodeInfo str
a080: 75 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c  ucture previousl
a090: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66  y allocated by f
a0a0: 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a  indInodeInfo()..
a0b0: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20  **.** The mutex 
a0c0: 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68  entered using th
a0d0: 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
a0e0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  () function must
a0f0: 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e   be held.** when
a100: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a110: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
a120: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
a130: 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69  InodeInfo(unixFi
a140: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
a150: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
a160: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
a170: 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75  ode;.  assert( u
a180: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
a190: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  ;.  if( ALWAYS(p
a1a0: 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49  Inode) ){.    pI
a1b0: 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  node->nRef--;.  
a1c0: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52    if( pInode->nR
a1d0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  ef==0 ){.      a
a1e0: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a1f0: 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20  ShmNode==0 );.  
a200: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
a210: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
a220: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50    if( pInode->pP
a230: 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rev ){.        a
a240: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70  ssert( pInode->p
a250: 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e  Prev->pNext==pIn
a260: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ode );.        p
a270: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
a280: 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ext = pInode->pN
a290: 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ext;.      }else
a2a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
a2b0: 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e  ( inodeList==pIn
a2c0: 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ode );.        i
a2d0: 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64  nodeList = pInod
a2e0: 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  e->pNext;.      
a2f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  }.      if( pIno
a300: 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20  de->pNext ){.   
a310: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e       assert( pIn
a320: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
a330: 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20  v==pInode );.   
a340: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65       pInode->pNe
a350: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  xt->pPrev = pIno
a360: 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20  de->pPrev;.     
a370: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a380: 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20  _free(pInode);. 
a390: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
a3a0: 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64  * Given a file d
a3b0: 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74  escriptor, locat
a3c0: 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49  e the unixInodeI
a3d0: 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a  nfo object that.
a3e0: 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61  ** describes tha
a3f0: 74 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  t file descripto
a400: 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77  r.  Create a new
a410: 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72   one if necessar
a420: 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72  y.  The.** retur
a430: 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65  n value might be
a440: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69   uninitialized i
a450: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
a460: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  s..**.** The mut
a470: 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67  ex entered using
a480: 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
a490: 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d  tex() function m
a4a0: 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77  ust be held.** w
a4b0: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
a4c0: 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  n is called..**.
a4d0: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70  ** Return an app
a4e0: 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
a4f0: 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
a500: 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  nt findInodeInfo
a510: 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
a520: 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
a530: 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20     /* Unix file 
a540: 77 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75  with file desc u
a550: 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a  sed in the key *
a560: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
a570: 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20  o **ppInode     
a580: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
a590: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
a5a0: 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b  bject here */.){
a5b0: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
a5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5d0: 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c    /* System call
a5e0: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
a5f0: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
a600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a610: 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
a620: 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c  criptor for pFil
a630: 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e  e */.  struct un
a640: 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b  ixFileId fileId;
a650: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20        /* Lookup 
a660: 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78  key for the unix
a670: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73  InodeInfo */.  s
a680: 74 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62  truct stat statb
a690: 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  uf;           /*
a6a0: 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20   Low-level file 
a6b0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20  information */. 
a6c0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
a6d0: 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20  pInode = 0;     
a6e0: 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69  /* Candidate uni
a6f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
a700: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
a710: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
a720: 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77  );..  /* Get low
a730: 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69  -level informati
a740: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c  on about the fil
a750: 65 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  e that we can us
a760: 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74  ed to.  ** creat
a770: 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20  e a unique name 
a780: 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  for the file..  
a790: 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d  */.  fd = pFile-
a7a0: 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  >h;.  rc = osFst
a7b0: 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29  at(fd, &statbuf)
a7c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
a7d0: 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
a7e0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
a7f0: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 45  );.#if defined(E
a800: 4f 56 45 52 46 4c 4f 57 29 20 26 26 20 64 65 66  OVERFLOW) && def
a810: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 49 53 41  ined(SQLITE_DISA
a820: 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20 69 66 28  BLE_LFS).    if(
a830: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
a840: 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72  o==EOVERFLOW ) r
a850: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c  eturn SQLITE_NOL
a860: 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  FS;.#endif.    r
a870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
a880: 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  RR;.  }..#ifdef 
a890: 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f  __APPLE__.  /* O
a8a0: 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64  n OS X on an msd
a8b0: 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74  os filesystem, t
a8c0: 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20  he inode number 
a8d0: 69 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a  is reported.  **
a8e0: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72   incorrectly for
a8f0: 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73   zero-size files
a900: 2e 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33  .  See ticket #3
a910: 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20  260.  To work.  
a920: 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70  ** around this p
a930: 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69  roblem (we consi
a940: 64 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20  der it a bug in 
a950: 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65  OS X, not SQLite
a960: 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73  ).  ** we always
a970: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69   increase the fi
a980: 6c 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20  le size to 1 by 
a990: 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
a9a0: 20 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72   byte.  ** prior
a9b0: 20 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68   to accessing th
a9c0: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
a9d0: 20 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72   The one byte wr
a9e0: 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e  itten is.  ** an
a9f0: 20 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61   ASCII 'S' chara
aa00: 63 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20  cter which also 
aa10: 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68  happens to be th
aa20: 65 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a  e first byte.  *
aa30: 2a 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  * in the header 
aa40: 6f 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20  of every SQLite 
aa50: 64 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68  database.  In th
aa60: 69 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65  is way, if there
aa70: 0a 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20  .  ** is a race 
aa80: 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74  condition such t
aa90: 68 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65  hat another thre
aaa0: 61 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  ad has already p
aab0: 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68  opulated.  ** th
aac0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
aad0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f  the database, no
aae0: 20 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e   damage is done.
aaf0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74  .  */.  if( stat
ab00: 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26  buf.st_size==0 &
ab10: 26 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67  & (pFile->fsFlag
ab20: 73 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41  s & SQLITE_FSFLA
ab30: 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20  GS_IS_MSDOS)!=0 
ab40: 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20  ){.    do{ rc = 
ab50: 6f 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c  osWrite(fd, "S",
ab60: 20 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c   1); }while( rc<
ab70: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
ab80: 52 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  R );.    if( rc!
ab90: 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =1 ){.      stor
aba0: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
abb0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
abc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
abd0: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ERR;.    }.    r
abe0: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
abf0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
ac00: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
ac10: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
ac20: 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
ac30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ac40: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
ac50: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d  .  }.#endif..  m
ac60: 65 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30  emset(&fileId, 0
ac70: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
ac80: 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20  );.  fileId.dev 
ac90: 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76  = statbuf.st_dev
aca0: 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
acb0: 0a 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20  .  fileId.pId = 
acc0: 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73  pFile->pId;.#els
acd0: 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d  e.  fileId.ino =
ace0: 20 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b   statbuf.st_ino;
acf0: 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65  .#endif.  pInode
ad00: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
ad10: 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
ad20: 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c   memcmp(&fileId,
ad30: 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   &pInode->fileId
ad40: 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29  , sizeof(fileId)
ad50: 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  ) ){.    pInode 
ad60: 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b  = pInode->pNext;
ad70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64  .  }.  if( pInod
ad80: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f  e==0 ){.    pIno
ad90: 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  de = sqlite3_mal
ada0: 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70  loc64( sizeof(*p
adb0: 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20 69 66  Inode) );.    if
adc0: 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20  ( pInode==0 ){. 
add0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
ade0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
adf0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64      memset(pInod
ae00: 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  e, 0, sizeof(*pI
ae10: 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63  node));.    memc
ae20: 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  py(&pInode->file
ae30: 49 64 2c 20 26 66 69 6c 65 49 64 2c 20 73 69 7a  Id, &fileId, siz
ae40: 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20  eof(fileId));.  
ae50: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d    pInode->nRef =
ae60: 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e   1;.    pInode->
ae70: 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73  pNext = inodeLis
ae80: 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70  t;.    pInode->p
ae90: 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 69 66  Prev = 0;.    if
aea0: 28 20 69 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e  ( inodeList ) in
aeb0: 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d  odeList->pPrev =
aec0: 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f   pInode;.    ino
aed0: 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b  deList = pInode;
aee0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
aef0: 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  node->nRef++;.  
af00: 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70  }.  *ppInode = p
af10: 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75 72 6e 20  Inode;.  return 
af20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
af30: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
af40: 69 66 20 70 46 69 6c 65 20 68 61 73 20 62 65 65  if pFile has bee
af50: 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c  n renamed or unl
af60: 69 6e 6b 65 64 20 73 69 6e 63 65 20 69 74 20 77  inked since it w
af70: 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64 2e  as first opened.
af80: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
af90: 69 6c 65 48 61 73 4d 6f 76 65 64 28 75 6e 69 78  ileHasMoved(unix
afa0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69  File *pFile){.#i
afb0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72  f OS_VXWORKS.  r
afc0: 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e  eturn pFile->pIn
afd0: 6f 64 65 21 3d 30 20 26 26 20 70 46 69 6c 65 2d  ode!=0 && pFile-
afe0: 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  >pId!=pFile->pIn
aff0: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b  ode->fileId.pId;
b000: 0a 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20  .#else.  struct 
b010: 73 74 61 74 20 62 75 66 3b 0a 20 20 72 65 74 75  stat buf;.  retu
b020: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
b030: 21 3d 30 20 26 26 0a 20 20 20 20 20 20 28 6f 73  !=0 &&.      (os
b040: 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74  Stat(pFile->zPat
b050: 68 2c 20 26 62 75 66 29 21 3d 30 20 7c 7c 20 62  h, &buf)!=0 || b
b060: 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65  uf.st_ino!=pFile
b070: 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64  ->pInode->fileId
b080: 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  .ino);.#endif.}.
b090: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20  ../*.** Check a 
b0a0: 75 6e 69 78 46 69 6c 65 20 74 68 61 74 20 69 73  unixFile that is
b0b0: 20 61 20 64 61 74 61 62 61 73 65 2e 20 20 56 65   a database.  Ve
b0c0: 72 69 66 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  rify the followi
b0d0: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68  ng:.**.** (1) Th
b0e0: 65 72 65 20 69 73 20 65 78 61 63 74 6c 79 20 6f  ere is exactly o
b0f0: 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20  ne hard link on 
b100: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20  the file.** (2) 
b110: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
b120: 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a  a symbolic link.
b130: 2a 2a 20 28 33 29 20 54 68 65 20 66 69 6c 65 20  ** (3) The file 
b140: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e  has not been ren
b150: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
b160: 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c  .**.** Issue sql
b170: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b180: 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73  WARNING,...) mes
b190: 73 61 67 65 73 20 69 66 20 61 6e 79 74 68 69 6e  sages if anythin
b1a0: 67 20 69 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a  g is not right..
b1b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
b1c0: 65 72 69 66 79 44 62 46 69 6c 65 28 75 6e 69 78  erifyDbFile(unix
b1d0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
b1e0: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
b1f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20  .  int rc;.  rc 
b200: 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  = osFstat(pFile-
b210: 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28  >h, &buf);.  if(
b220: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71   rc!=0 ){.    sq
b230: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
b240: 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f  _WARNING, "canno
b250: 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20  t fstat db file 
b260: 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  %s", pFile->zPat
b270: 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  h);.    return;.
b280: 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74    }.  if( buf.st
b290: 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70 46  _nlink==0 && (pF
b2a0: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
b2b0: 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
b2c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
b2d0: 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57  te3_log(SQLITE_W
b2e0: 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e  ARNING, "file un
b2f0: 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65  linked while ope
b300: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b310: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b320: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66  n;.  }.  if( buf
b330: 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20  .st_nlink>1 ){. 
b340: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
b350: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22  QLITE_WARNING, "
b360: 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74  multiple links t
b370: 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69  o file: %s", pFi
b380: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
b390: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
b3a0: 28 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70  ( fileHasMoved(p
b3b0: 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c  File) ){.    sql
b3c0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
b3d0: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72  WARNING, "file r
b3e0: 65 6e 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65  enamed while ope
b3f0: 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  n: %s", pFile->z
b400: 50 61 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72  Path);.    retur
b410: 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n;.  }.}.../*.**
b420: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
b430: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
b440: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
b450: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
b460: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
b470: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
b480: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
b490: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
b4a0: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
b4b0: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
b4c0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
b4d0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
b4e0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
b4f0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
b500: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
b510: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
b520: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
b530: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
b540: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
b550: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
b560: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
b570: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
b580: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
b590: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b5a0: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
b5b0: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
b5c0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
b5d0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
b5e0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
b5f0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
b600: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
b610: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
b620: 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
b630: 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  rt( pFile->eFile
b640: 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
b650: 4b 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72  K );.  unixEnter
b660: 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
b670: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
b680: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
b690: 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20  ss threads */.. 
b6a0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
b6b0: 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
b6c0: 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
b6d0: 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
b6e0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
b6f0: 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
b700: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73  _LOCK ){.    res
b710: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a  erved = 1;.  }..
b720: 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
b730: 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
b740: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
b750: 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  t..  */.#ifndef 
b760: 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20  __DJGPP__.  if( 
b770: 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70 46  !reserved && !pF
b780: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
b790: 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20  ocessLock ){.   
b7a0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
b7b0: 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  ck;.    lock.l_w
b7c0: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
b7d0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
b7e0: 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
b7f0: 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
b800: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  en = 1;.    lock
b810: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
b820: 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e  K;.    if( osFcn
b830: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47  tl(pFile->h, F_G
b840: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a  ETLK, &lock) ){.
b850: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
b860: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
b870: 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  ERVEDLOCK;.     
b880: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
b890: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
b8a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f     } else if( lo
b8b0: 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c  ck.l_type!=F_UNL
b8c0: 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65  CK ){.      rese
b8d0: 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rved = 1;.    }.
b8e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
b8f0: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
b900: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  ;.  OSTRACE(("TE
b910: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
b920: 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %d (unix)\n", p
b930: 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73  File->h, rc, res
b940: 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65  erved));..  *pRe
b950: 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b  sOut = reserved;
b960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b970: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
b980: 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c  o set a system-l
b990: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
b9a0: 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b  pFile.  The lock
b9b0: 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65   is .** describe
b9c0: 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a  d by pLock..**.*
b9d0: 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20 77  * If the pFile w
b9e0: 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77  as opened read/w
b9f0: 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65  rite from unix-e
ba00: 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e  xcl, then the on
ba10: 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20  ly lock.** ever 
ba20: 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65  obtained is an e
ba30: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61  xclusive lock, a
ba40: 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65  nd it is obtaine
ba50: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a  d exactly once.*
ba60: 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  * the first time
ba70: 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74   any lock is att
ba80: 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62  empted.  All sub
ba90: 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c  sequent system l
baa0: 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  ocking.** operat
bab0: 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f  ions become no-o
bac0: 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65  ps.  Locking ope
bad0: 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61  rations still ha
bae0: 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c  ppen internally,
baf0: 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  .** in order to 
bb00: 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73  coordinate acces
bb10: 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72 61  s between separa
bb20: 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  te database conn
bb30: 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69  ections.** withi
bb40: 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  n this process, 
bb50: 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20  but all of that 
bb60: 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65  is handled in me
bb70: 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20  mory and the.** 
bb80: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
bb90: 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63   does not partic
bba0: 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ipate..**.** Thi
bbb0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
bbc0: 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20  pass-through to 
bbd0: 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69  fcntl(F_SETLK) i
bbe0: 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67  f pFile is using
bbf0: 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65  .** any VFS othe
bc00: 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63  r than "unix-exc
bc10: 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69  l" or if pFile i
bc20: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69  s opened on "uni
bc30: 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69  x-excl".** and i
bc40: 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a  s read-only..**.
bc50: 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72  ** Zero is retur
bc60: 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20  ned if the call 
bc70: 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73  completes succes
bc80: 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66  sfully, or -1 if
bc90: 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63   a call.** to fc
bca0: 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20  ntl() fails. In 
bcb0: 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f  this case, errno
bcc0: 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72 69   is set appropri
bcd0: 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28  ately (by fcntl(
bce0: 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ))..*/.static in
bcf0: 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75  t unixFileLock(u
bd00: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
bd10: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c  struct flock *pL
bd20: 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ock){.  int rc;.
bd30: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
bd40: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
bd50: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
bd60: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
bd70: 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  () );.  assert( 
bd80: 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69  pInode!=0 );.  i
bd90: 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  f( ((pFile->ctrl
bda0: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
bdb0: 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e  _EXCL)!=0 || pIn
bdc0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
bdd0: 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c 65  k).   && ((pFile
bde0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
bdf0: 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d  IXFILE_RDONLY)==
be00: 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  0).  ){.    if( 
be10: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
be20: 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
be30: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
be40: 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ck;.      assert
be50: 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d  ( pInode->nLock=
be60: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 );.      lock
be70: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
be80: 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  _SET;.      lock
be90: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
bea0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
beb0: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
bec0: 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c  ED_SIZE;.      l
bed0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
bee0: 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d  RLCK;.      rc =
bef0: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
bf00: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  h, F_SETLK, &loc
bf10: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
bf20: 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  <0 ) return rc;.
bf30: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50        pInode->bP
bf40: 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a  rocessLock = 1;.
bf50: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
bf60: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  ock++;.    }else
bf70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
bf80: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
bf90: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
bfa0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
bfb0: 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 20  K, pLock);.  }. 
bfc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
bfd0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
bfe0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
bff0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
c000: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
c010: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
c020: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
c030: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
c040: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
c050: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
c060: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
c070: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
c080: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
c090: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
c0a0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
c0b0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
c0c0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
c0d0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
c0e0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
c0f0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
c100: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
c110: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
c120: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
c130: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
c140: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
c150: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
c160: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
c170: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
c180: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
c190: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
c1a0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
c1b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
c1c0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
c1d0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
c1e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
c1f0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
c200: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
c210: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
c220: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
c230: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
c240: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
c250: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
c260: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
c270: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
c280: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
c290: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
c2a0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
c2b0: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
c2c0: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
c2d0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
c2e0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
c2f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
c300: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
c310: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
c320: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
c330: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
c340: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
c350: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
c360: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
c370: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
c380: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
c390: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
c3a0: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
c3b0: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
c3c0: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
c3d0: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
c3e0: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
c3f0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
c400: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
c410: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
c420: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
c430: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
c440: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
c450: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
c460: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
c470: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
c480: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
c490: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
c4a0: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
c4b0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
c4c0: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
c4d0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
c4e0: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
c4f0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
c500: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
c510: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
c520: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
c530: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
c540: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
c550: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c560: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
c570: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
c580: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
c590: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
c5a0: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
c5b0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
c5c0: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
c5d0: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
c5e0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
c5f0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
c600: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
c610: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
c620: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
c630: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
c640: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
c650: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
c660: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
c670: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
c680: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
c690: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
c6a0: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
c6b0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
c6c0: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
c6d0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
c6e0: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
c6f0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
c700: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
c710: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
c720: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
c730: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
c740: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
c750: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
c760: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
c770: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
c780: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
c790: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
c7a0: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
c7b0: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
c7c0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
c7d0: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
c7e0: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
c7f0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
c800: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
c810: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
c820: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
c830: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
c840: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
c850: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
c860: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
c870: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
c880: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
c890: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
c8a0: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
c8b0: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
c8c0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
c8d0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
c8e0: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
c8f0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
c900: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
c910: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
c920: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
c930: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
c940: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
c950: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
c960: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
c970: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
c980: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
c990: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
c9a0: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
c9b0: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
c9c0: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
c9d0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
c9e0: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
c9f0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
ca00: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
ca10: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
ca20: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
ca30: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
ca40: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
ca50: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
ca60: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
ca70: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
ca80: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
ca90: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
caa0: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
cab0: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
cac0: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
cad0: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
cae0: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
caf0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
cb00: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
cb10: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
cb20: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
cb30: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
cb40: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
cb50: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
cb60: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
cb70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
cb80: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
cb90: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
cba0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
cbb0: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
cbc0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
cbd0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
cbe0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
cbf0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
cc00: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
cc10: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
cc20: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
cc30: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
cc40: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
cc50: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
cc60: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
cc70: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
cc80: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
cc90: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
cca0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
ccb0: 61 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65  ared,.      osGe
ccc0: 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a  tpid(0)));..  /*
ccd0: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
cce0: 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74  eady a lock of t
ccf0: 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65  his type or more
cd00: 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20   restrictive on 
cd10: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c  the.  ** unixFil
cd20: 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44  e, do nothing. D
cd30: 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64  on't use the end
cd40: 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68  _lock: exit path
cd50: 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e  , as.  ** unixEn
cd60: 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27  terMutex() hasn'
cd70: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65  t been called ye
cd80: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  t..  */.  if( pF
cd90: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
cda0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
cdb0: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
cdc0: 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72     %d %s ok (alr
cdd0: 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78  eady held) (unix
cde0: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69              azFi
ce00: 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
ce10: 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
ce20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
ce30: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
ce40: 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
ce50: 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  nce is correct..
ce60: 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
ce70: 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
ce80: 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
ce90: 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
cea0: 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
ceb0: 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
cec0: 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
ced0: 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
cee0: 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
cef0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
cf00: 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
cf10: 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
cf20: 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
cf30: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
cf40: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
cf50: 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
cf60: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
cf70: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
cf80: 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
cf90: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
cfa0: 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
cfb0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
cfc0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
cfd0: 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
cfe0: 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78  .  /* This mutex
cff0: 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75   is needed becau
d000: 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  se pFile->pInode
d010: 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73   is shared acros
d020: 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20  s threads.  */. 
d030: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
d040: 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46  );.  pInode = pF
d050: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20  ile->pInode;..  
d060: 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61  /* If some threa
d070: 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
d080: 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20   has a lock via 
d090: 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78  a different unix
d0a0: 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c  File*.  ** handl
d0b0: 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73  e that precludes
d0c0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
d0d0: 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59  ock, return BUSY
d0e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46  ..  */.  if( (pF
d0f0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
d100: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
d110: 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20  k && .          
d120: 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
d130: 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  ck>=PENDING_LOCK
d140: 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48   || eFileLock>SH
d150: 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b  ARED_LOCK)).  ){
d160: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
d170: 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
d180: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20  end_lock;.  }.. 
d190: 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20   /* If a SHARED 
d1a0: 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65  lock is requeste
d1b0: 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65  d, and some thre
d1c0: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
d1d0: 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68  D already.  ** h
d1e0: 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52  as a SHARED or R
d1f0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68  ESERVED lock, th
d200: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66  en increment ref
d210: 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e  erence counts an
d220: 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51  d.  ** return SQ
d230: 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20  LITE_OK..  */.  
d240: 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
d250: 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20  HARED_LOCK && . 
d260: 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
d270: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
d280: 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
d290: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
d2a0: 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
d2b0: 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
d2c0: 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
d2d0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
d2e0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
d2f0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d300: 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
d310: 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
d320: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
d330: 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
d340: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
d350: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
d360: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
d370: 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a  end_lock;.  }...
d380: 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
d390: 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
d3a0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
d3b0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
d3c0: 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
d3d0: 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
d3e0: 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
d3f0: 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
d400: 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
d410: 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
d420: 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c  d..  */.  lock.l
d430: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63  _len = 1L;.  loc
d440: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
d450: 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69  K_SET;.  if( eFi
d460: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
d470: 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65  OCK .      || (e
d480: 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
d490: 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  IVE_LOCK && pFil
d4a0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e  e->eFileLock<PEN
d4b0: 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  DING_LOCK).  ){.
d4c0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
d4d0: 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  = (eFileLock==SH
d4e0: 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43  ARED_LOCK?F_RDLC
d4f0: 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20  K:F_WRLCK);.    
d500: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
d510: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
d520: 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
d530: 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 20  k(pFile, &lock) 
d540: 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
d550: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
d560: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
d570: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
d580: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
d590: 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
d5a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42  if( rc!=SQLITE_B
d5b0: 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73  USY ){.        s
d5c0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
d5d0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
d5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
d5f0: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d   end_lock;.    }
d600: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63  .  }...  /* If c
d610: 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74  ontrol gets to t
d620: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
d630: 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61  actually go ahea
d640: 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20  d and make.  ** 
d650: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
d660: 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73   calls for the s
d670: 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20  pecified lock.. 
d680: 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
d690: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
d6a0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
d6b0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
d6c0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
d6d0: 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  ( pInode->eFileL
d6e0: 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
d6f0: 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
d700: 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e  _OK );..    /* N
d710: 6f 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d  ow get the read-
d720: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b  lock */.    lock
d730: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
d740: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63  D_FIRST;.    loc
d750: 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
d760: 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28 20 75  _SIZE;.    if( u
d770: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
d780: 65 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 20 20 20  e, &lock) ){.   
d790: 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
d7a0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
d7b0: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
d7c0: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
d7d0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
d7e0: 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
d7f0: 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
d800: 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
d810: 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
d820: 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
d830: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
d840: 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
d850: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
d860: 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
d870: 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
d880: 2c 20 26 6c 6f 63 6b 29 20 26 26 20 72 63 3d 3d  , &lock) && rc==
d890: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d8a0: 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
d8b0: 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
d8c0: 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
d8d0: 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
d8e0: 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
d8f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
d900: 4c 4f 43 4b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20  LOCK; .    }..  
d910: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
d920: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d930: 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
d940: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
d950: 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
d960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
d970: 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
d980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
d990: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
d9a0: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
d9b0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
d9c0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  k++;.      pInod
d9d0: 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a  e->nShared = 1;.
d9e0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
d9f0: 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
da00: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
da10: 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
da20: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72   ){.    /* We ar
da30: 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20  e trying for an 
da40: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62  exclusive lock b
da50: 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  ut another threa
da60: 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a  d in this.    **
da70: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
da80: 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
da90: 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
daa0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
dab0: 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
dac0: 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
dad0: 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
dae0: 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
daf0: 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
db00: 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
db10: 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
db20: 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
db30: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
db40: 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
db50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
db60: 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65  ert( 0!=pFile->e
db70: 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20  FileLock );.    
db80: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
db90: 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65  WRLCK;..    asse
dba0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  rt( eFileLock==R
dbb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
dbc0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
dbd0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  SIVE_LOCK );.   
dbe0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
dbf0: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b  RESERVED_LOCK ){
dc00: 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  .      lock.l_st
dc10: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
dc20: 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  YTE;.      lock.
dc30: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20  l_len = 1L;.    
dc40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63  }else{.      loc
dc50: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
dc60: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
dc70: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
dc80: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a  RED_SIZE;.    }.
dc90: 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
dca0: 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
dcb0: 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72  ck) ){.      tEr
dcc0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
dcd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
dce0: 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
dcf0: 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
dd00: 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
dd10: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
dd20: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
dd30: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
dd40: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
dd50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dd60: 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
dd70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
dd80: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
dd90: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
dda0: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
ddb0: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
ddc0: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
ddd0: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
dde0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
ddf0: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
de00: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
de10: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
de20: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
de30: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
de40: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
de50: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
de60: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
de70: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
de80: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
de90: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
dea0: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
deb0: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
dec0: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
ded0: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
dee0: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
def0: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
df00: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
df10: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
df20: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
df30: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
df40: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
df50: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
df60: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
df70: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
df80: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
df90: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
dfa0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
dfb0: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
dfc0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
dfd0: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
dfe0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
dff0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
e000: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
e010: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
e020: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
e030: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
e040: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e050: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
e060: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
e070: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
e080: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
e090: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
e0a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
e0b0: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
e0c0: 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
e0d0: 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
e0e0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
e0f0: 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
e100: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
e110: 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
e120: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
e130: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
e140: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
e150: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
e160: 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
e170: 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ile->pUnused;.  
e180: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64  p->pNext = pInod
e190: 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49  e->pUnused;.  pI
e1a0: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  node->pUnused = 
e1b0: 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20  p;.  pFile->h = 
e1c0: 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e  -1;.  pFile->pUn
e1d0: 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  used = 0;.}../*.
e1e0: 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
e1f0: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
e200: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
e210: 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
e220: 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
e230: 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
e240: 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
e250: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
e260: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
e270: 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
e280: 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
e290: 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
e2a0: 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
e2b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
e2c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
e2d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20  a no-op..** .** 
e2e0: 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  If handleNFSUnlo
e2f0: 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ck is true, then
e300: 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20   on downgrading 
e310: 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  an EXCLUSIVE_LOC
e320: 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74  K to SHARED.** t
e330: 68 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73  he byte range is
e340: 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20   divided into 2 
e350: 70 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69  parts and the fi
e360: 72 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f  rst part is unlo
e370: 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74  cked then.** set
e380: 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c   to a read lock,
e390: 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20   then the other 
e3a0: 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75  part is simply u
e3b0: 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77  nlocked.  This w
e3c0: 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20  orks .** around 
e3d0: 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53  a bug in BSD NFS
e3e0: 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65   lockd (also see
e3f0: 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33  n on MacOSX 10.3
e400: 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f  +) that fails to
e410: 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20   .** remove the 
e420: 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20  write lock on a 
e430: 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65  region when a re
e440: 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a  ad lock is set..
e450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
e460: 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  sixUnlock(sqlite
e470: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e480: 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68  eFileLock, int h
e490: 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b  andleNFSUnlock){
e4a0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e4b0: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e4c0: 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
e4d0: 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73  nfo *pInode;.  s
e4e0: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
e4f0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e500: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
e510: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
e520: 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
e530: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c  %d %d was %d(%d,
e540: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
e550: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
e560: 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
e570: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
e580: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
e590: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
e5a0: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
e5b0: 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
e5c0: 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73  pid(0)));..  ass
e5d0: 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
e5e0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
e5f0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
e600: 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b  eLock<=eFileLock
e610: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e620: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e630: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
e640: 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
e650: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
e660: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
e670: 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  hared!=0 );.  if
e680: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e690: 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
e6a0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  {.    assert( pI
e6b0: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
e6c0: 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  =pFile->eFileLoc
e6d0: 6b 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  k );..#ifdef SQL
e6e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
e6f0: 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
e700: 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
e710: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
e720: 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
e730: 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
e740: 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
e750: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
e760: 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
e770: 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
e780: 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
e790: 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
e7a0: 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
e7b0: 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
e7c0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e7d0: 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
e7e0: 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
e7f0: 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
e800: 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
e810: 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
e820: 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
e830: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
e840: 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
e850: 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
e860: 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
e870: 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
e880: 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
e890: 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
e8a0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
e8b0: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
e8c0: 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61    pFile->inNorma
e8d0: 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64  lWrite = 0;.#end
e8e0: 69 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67  if..    /* downg
e8f0: 72 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72  rading to a shar
e900: 65 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69  ed lock on NFS i
e910: 6e 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67  nvolves clearing
e920: 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a   the write lock.
e930: 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73      ** before es
e940: 74 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72  tablishing the r
e950: 65 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f  eadlock - to avo
e960: 69 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  id a race condit
e970: 69 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65  ion we downgrade
e980: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
e990: 20 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f   in 2 blocks, so
e9a0: 20 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68   that part of th
e9b0: 65 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20  e range will be 
e9c0: 63 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20  covered by a .  
e9d0: 20 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20    ** write lock 
e9e0: 75 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69  until the rest i
e9f0: 73 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72  s covered by a r
ea00: 65 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a  ead lock:.    **
ea10: 20 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20    1:   [WWWWW]. 
ea20: 20 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e     **  2:   [...
ea30: 2e 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20  .W].    **  3:  
ea40: 20 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20   [RRRRW].    ** 
ea50: 20 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20   4:   [RRRR.].  
ea60: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69    */.    if( eFi
ea70: 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
ea80: 4f 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69  OCK ){.#if !defi
ea90: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
eaa0: 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
eab0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
eac0: 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
ead0: 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
eae0: 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
eaf0: 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
eb00: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
eb10: 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
eb20: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
eb30: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
eb40: 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
eb50: 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
eb60: 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20    int tErrno;   
eb70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
eb80: 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73  rror code from s
eb90: 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72  ystem call error
eba0: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66  s */.        off
ebb0: 5f 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41  _t divSize = SHA
ebc0: 52 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20  RED_SIZE - 1;.  
ebd0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c        .        l
ebe0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
ebf0: 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  NLCK;.        lo
ec00: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ec10: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ec20: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ec30: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ec40: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ec50: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
ec60: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
ec70: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
ec80: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
ec90: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
eca0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
ecb0: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
ecc0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
ecd0: 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
ece0: 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
ecf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
ed00: 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
ed10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c       }.        l
ed20: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52  ock.l_type = F_R
ed30: 44 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f  DLCK;.        lo
ed40: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
ed50: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20  EK_SET;.        
ed60: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
ed70: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
ed80: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
ed90: 3d 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  = divSize;.     
eda0: 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
edb0: 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
edc0: 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  )==(-1) ){.     
edd0: 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72       tErrno = er
ede0: 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 72  rno;.          r
edf0: 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
ee00: 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
ee10: 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
ee20: 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_RDLOCK);.    
ee30: 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
ee40: 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
ee50: 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
ee60: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
ee70: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
ee80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ee90: 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
eea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
eeb0: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
eec0: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20   F_UNLCK;.      
eed0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
eee0: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
eef0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
ef00: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b   = SHARED_FIRST+
ef10: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
ef20: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
ef30: 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69 7a  ARED_SIZE-divSiz
ef40: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  e;.        if( u
ef50: 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
ef60: 65 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31 29 20  e, &lock)==(-1) 
ef70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72  ){.          tEr
ef80: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
ef90: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
efa0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
efb0: 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
efc0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
efd0: 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
efe0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c      goto end_unl
eff0: 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ock;.        }. 
f000: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
f010: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
f020: 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
f030: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
f040: 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20 20 20  _STYLE */.      
f050: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  {.        lock.l
f060: 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
f070: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
f080: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f090: 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
f0a0: 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44  l_start = SHARED
f0b0: 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20  _FIRST;.        
f0c0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
f0d0: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
f0e0: 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
f0f0: 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29  ck(pFile, &lock)
f100: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
f110: 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
f120: 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
f130: 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
f140: 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
f150: 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
f160: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
f170: 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
f180: 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
f190: 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
f1a0: 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
f1b0: 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
f1c0: 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
f1d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
f1e0: 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
f1f0: 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
f200: 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
f210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
f220: 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
f230: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
f240: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
f250: 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
f260: 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
f270: 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
f280: 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
f290: 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
f2a0: 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
f2b0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
f2c0: 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
f2d0: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
f2e0: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
f2f0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  o);.          go
f300: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
f310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
f320: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e  .    }.    lock.
f330: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
f340: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
f350: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
f360: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
f370: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
f380: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
f390: 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50  = 2L;  assert( P
f3a0: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52  ENDING_BYTE+1==R
f3b0: 45 53 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a  ESERVED_BYTE );.
f3c0: 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
f3d0: 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
f3e0: 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  k)==0 ){.      p
f3f0: 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
f400: 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
f410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f420: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
f430: 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
f440: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
f450: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
f460: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
f470: 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
f480: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
f490: 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
f4a0: 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
f4b0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
f4c0: 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
f4d0: 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
f4e0: 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
f4f0: 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
f500: 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
f510: 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
f520: 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
f530: 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
f540: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
f550: 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
f560: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
f570: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
f580: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
f590: 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
f5a0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
f5b0: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
f5c0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
f5d0: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
f5e0: 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
f5f0: 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 29 3d 3d 30  pFile, &lock)==0
f600: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
f610: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
f620: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
f630: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        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: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
f670: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
f680: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
f690: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
f6a0: 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  K;.        pFile
f6b0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
f6c0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  _LOCK;.      }. 
f6d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
f6e0: 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74  rement the count
f6f0: 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73   of locks agains
f700: 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65  t this same file
f710: 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20  .  When the.    
f720: 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ** count reaches
f730: 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79   zero, close any
f740: 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
f750: 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c  riptors whose cl
f760: 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64  ose.    ** was d
f770: 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20  eferred because 
f780: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  of outstanding l
f790: 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ocks..    */.   
f7a0: 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d   pInode->nLock--
f7b0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
f7c0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
f7d0: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
f7e0: 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->nLock==0 ){.  
f7f0: 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67      closePending
f800: 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  Fds(pFile);.    
f810: 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63  }.  }..end_unloc
f820: 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
f830: 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d  tex();.  if( rc=
f840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69  =SQLITE_OK ) pFi
f850: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
f860: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74  eFileLock;.  ret
f870: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f880: 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
f890: 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
f8a0: 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
f8b0: 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
f8c0: 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
f8d0: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
f8e0: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
f8f0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
f900: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
f910: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
f920: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
f930: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
f940: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
f950: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
f960: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
f970: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f980: 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28   int unixUnlock(
f990: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f9a0: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
f9b0: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
f9c0: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61  _MMAP_SIZE>0.  a
f9d0: 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
f9e0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
f9f0: 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64   ((unixFile *)id
fa00: 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  )->nFetchOut==0 
fa10: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
fa20: 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69  rn posixUnlock(i
fa30: 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29  d, eFileLock, 0)
fa40: 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  ;.}..#if SQLITE_
fa50: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
fa60: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
fa70: 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
fa80: 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29  *pFd, i64 nByte)
fa90: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  ;.static void un
faa0: 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78  ixUnmapfile(unix
fab0: 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64  File *pFd);.#end
fac0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  if../*.** This f
fad0: 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73  unction performs
fae0: 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74 68   the parts of th
faf0: 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f  e "close file" o
fb00: 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d  peration .** com
fb10: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69  mon to all locki
fb20: 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20 63  ng schemes. It c
fb30: 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63 74  loses the direct
fb40: 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20  ory and file.** 
fb50: 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65 79  handles, if they
fb60: 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64 20   are valid, and 
fb70: 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73 20  sets all fields 
fb80: 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 0a  of the unixFile.
fb90: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ** structure to 
fba0: 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a  0..**.** It is *
fbb0: 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20 74  not* necessary t
fbc0: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78  o hold the mutex
fbd0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
fbe0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  ne is called,.**
fbf0: 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73   even on VxWorks
fc00: 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c 20  .  A mutex will 
fc10: 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20 56  be acquired on V
fc20: 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a  xWorks by the.**
fc30: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
fc40: 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65 2e  ileId() routine.
fc50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
fc60: 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71 6c  loseUnixFile(sql
fc70: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
fc80: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fc90: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fca0: 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  d;.#if SQLITE_MA
fcb0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
fcc0: 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
fcd0: 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69  ile);.#endif.  i
fce0: 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29  f( pFile->h>=0 )
fcf0: 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f  {.    robust_clo
fd00: 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d  se(pFile, pFile-
fd10: 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
fd20: 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31     pFile->h = -1
fd30: 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57  ;.  }.#if OS_VXW
fd40: 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c 65  ORKS.  if( pFile
fd50: 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66 28  ->pId ){.    if(
fd60: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
fd70: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  s & UNIXFILE_DEL
fd80: 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73 55  ETE ){.      osU
fd90: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
fda0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
fdb0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78 77  );.    }.    vxw
fdc0: 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49  orksReleaseFileI
fdd0: 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20  d(pFile->pId);. 
fde0: 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20     pFile->pId = 
fdf0: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  0;.  }.#endif.#i
fe00: 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49  fdef SQLITE_UNLI
fe10: 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20  NK_AFTER_CLOSE. 
fe20: 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
fe30: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
fe40: 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f  _DELETE ){.    o
fe50: 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a  sUnlink(pFile->z
fe60: 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74  Path);.    sqlit
fe70: 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a 2a  e3_free(*(char**
fe80: 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  )&pFile->zPath);
fe90: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74  .    pFile->zPat
fea0: 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  h = 0;.  }.#endi
feb0: 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43 4c  f.  OSTRACE(("CL
fec0: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  OSE   %-3d\n", p
fed0: 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65  File->h));.  Ope
fee0: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
fef0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69  sqlite3_free(pFi
ff00: 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20  le->pUnused);.  
ff10: 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30 2c  memset(pFile, 0,
ff20: 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65   sizeof(unixFile
ff30: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
ff40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ff50: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
ff60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
ff70: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
ff80: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
ff90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ffa0: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
ffb0: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  e = (unixFile *)
ffc0: 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46 69  id;.  verifyDbFi
ffd0: 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69  le(pFile);.  uni
ffe0: 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  xUnlock(id, NO_L
fff0: 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  OCK);.  unixEnte
10000 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20  rMutex();..  /* 
10010 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20  unixFile.pInode 
10020 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
10030 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  here. Otherwise,
10040 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c 6f   a different clo
10050 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  se.  ** routine 
10060 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  (e.g. nolockClos
10070 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63 61  e()) would be ca
10080 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  lled instead..  
10090 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
100a0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  le->pInode->nLoc
100b0 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49  k>0 || pFile->pI
100c0 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
100d0 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 41  ck==0 );.  if( A
100e0 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e  LWAYS(pFile->pIn
100f0 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e 70  ode) && pFile->p
10100 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
10110 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
10120 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
10130 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
10140 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
10150 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a   file just.    *
10160 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
10170 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
10180 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
10190 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
101a0 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72 69  le.    ** descri
101b0 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
101c0 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20 49  pUnused list.  I
101d0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
101e0 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a  tically closed .
101f0 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20      ** when the 
10200 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
10210 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
10220 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46   setPendingFd(pF
10230 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65  ile);.  }.  rele
10240 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
10250 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73  le);.  rc = clos
10260 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
10270 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
10280 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10290 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
102a0 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70 6f  ** End of the po
102b0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
102c0 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
102d0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
102e0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
102f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10330 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
10340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10380 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
10390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103a0 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67  ** No-op Locking
103b0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
103c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
103d0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65  ***.**.** Of the
103e0 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67   various locking
103f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
10400 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69 73   available, this
10410 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a 2a   is by far the.*
10420 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63  * simplest:  loc
10430 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64 2e  king is ignored.
10440 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73 20    No attempt is 
10450 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65  made to lock the
10460 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
10470 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72  e for reading or
10480 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   writing..**.** 
10490 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64  This locking mod
104a0 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65  e is appropriate
104b0 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61 64   for use on read
104c0 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73 0a  -only databases.
104d0 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73 65  ** (ex: database
104e0 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e 65  s that are burne
104f0 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66  d into CD-ROM, f
10500 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49 74  or example.)  It
10510 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20   can.** also be 
10520 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70 6c  used if the appl
10530 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20  ication employs 
10540 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d 65  some external me
10550 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72  chanism to.** pr
10560 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f  event simultaneo
10570 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68 65  us access of the
10580 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 62   same database b
10590 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y two or more.**
105a0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
105b0 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65 72  tions.  But ther
105c0 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20 72  e is a serious r
105d0 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 0a  isk of database.
105e0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 66  ** corruption if
105f0 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   this locking mo
10600 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73 69  de is used in si
10610 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20 6d  tuations where m
10620 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62  ultiple.** datab
10630 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
10640 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  are accessing th
10650 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
10660 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65  file at the same
10670 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65  .** time and one
10680 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73   or more of thos
10690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72  e connections ar
106a0 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73  e writing..*/..s
106b0 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
106c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
106d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
106e0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70 52  NotUsed, int *pR
106f0 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45 44  esOut){.  UNUSED
10700 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
10710 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20  ed);.  *pResOut 
10720 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 0;.  return SQ
10730 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
10740 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b  c int nolockLock
10750 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e  (sqlite3_file *N
10760 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
10770 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed2){.  UNUSED_
10780 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55 73  PARAMETER2(NotUs
10790 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20  ed, NotUsed2);. 
107a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
107b0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
107c0 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  nolockUnlock(sql
107d0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
107e0 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32  ed, int NotUsed2
107f0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
10800 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20  METER2(NotUsed, 
10810 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74  NotUsed2);.  ret
10820 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10830 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
10840 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
10850 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73  c int nolockClos
10860 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
10870 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 63  id) {.  return c
10880 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
10890 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
108a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
108b0 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20   the no-op lock 
108c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a  implementation *
108d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108e0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
108f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10930 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
10940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10980 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
10990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
109a0 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c  Begin dot-file L
109b0 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
109c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
109d0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20  *****.**.** The 
109e0 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  dotfile locking 
109f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
10a00 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e 63  ses the existenc
10a10 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f  e of separate lo
10a20 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61  ck.** files (rea
10a30 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79 29  lly a directory)
10a40 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65   to control acce
10a50 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ss to the databa
10a60 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a  se.  This works.
10a70 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74  ** on just about
10a80 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74 65   every filesyste
10a90 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42  m imaginable.  B
10aa0 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65 72  ut there are ser
10ab0 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a  ious downsides:.
10ac0 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
10ad0 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63  ere is zero conc
10ae0 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67  urrency.  A sing
10af0 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73  le reader blocks
10b00 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20   all other.**   
10b10 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e        connection
10b20 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f  s from reading o
10b30 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61  r writing the da
10b40 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  tabase..**.**   
10b50 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61   (2)  An applica
10b60 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f  tion crash or po
10b70 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61  wer loss can lea
10b80 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69  ve stale lock fi
10b90 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73  les.**         s
10ba0 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68  itting around th
10bb0 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c  at need to be cl
10bc0 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a  eared manually..
10bd0 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65  **.** Neverthele
10be0 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73  ss, a dotlock is
10bf0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
10c00 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72  locking mode for
10c10 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74   use if no.** ot
10c20 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  her locking stra
10c30 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c  tegy is availabl
10c40 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65  e..**.** Dotfile
10c50 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62   locking works b
10c60 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75 62  y creating a sub
10c70 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65  directory in the
10c80 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20   same directory 
10c90 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  as.** the databa
10ca0 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65 20  se and with the 
10cb0 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69  same name but wi
10cc0 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74  th a ".lock" ext
10cd0 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a  ension added..**
10ce0 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   The existence o
10cf0 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  f a lock directo
10d00 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58  ry implies an EX
10d10 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41  CLUSIVE lock.  A
10d20 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b  ll other.** lock
10d30 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c 20   types (SHARED, 
10d40 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e  RESERVED, PENDIN
10d50 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e  G) are mapped in
10d60 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f  to EXCLUSIVE..*/
10d70 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ../*.** The file
10d80 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74 6f   suffix added to
10d90 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20 66   the data base f
10da0 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72  ilename in order
10db0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a   to create the.*
10dc0 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  * lock directory
10dd0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54  ..*/.#define DOT
10de0 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f  LOCK_SUFFIX ".lo
10df0 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ck"../*.** This 
10e00 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
10e10 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
10e20 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
10e30 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
10e40 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
10e50 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
10e60 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
10e70 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
10e80 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
10e90 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
10ea0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
10eb0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
10ec0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
10ed0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
10ee0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
10ef0 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
10f00 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
10f10 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
10f20 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65  **.** In dotfile
10f30 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72   locking, either
10f40 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f   a lock exists o
10f50 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20  r it does not.  
10f60 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61  So in this.** va
10f70 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b  riation of Check
10f80 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20  ReservedLock(), 
10f90 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
10fa0 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c  to true if any l
10fb0 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f  ock.** is held o
10fc0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66  n the file and f
10fd0 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c 65  alse if the file
10fe0 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f   is unlocked..*/
10ff0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
11000 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
11010 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
11020 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73  e *id, int *pRes
11030 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  Out) {.  int rc 
11040 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
11050 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
11060 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
11070 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
11080 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
11090 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
110a0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
110b0 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
110c0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
110d0 46 69 6c 65 20 29 3b 0a 20 20 72 65 73 65 72 76  File );.  reserv
110e0 65 64 20 3d 20 6f 73 41 63 63 65 73 73 28 28 63  ed = osAccess((c
110f0 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65  onst char*)pFile
11100 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
11110 2c 20 30 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41  , 0)==0;.  OSTRA
11120 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
11130 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
11140 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
11150 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
11160 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
11170 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
11180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11190 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
111a0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
111b0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
111c0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
111d0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
111e0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
111f0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
11200 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
11210 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
11220 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
11230 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
11240 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
11250 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
11260 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
11270 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
11280 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
11290 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
112a0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
112b0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
112c0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
112d0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
112e0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
112f0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
11300 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
11310 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
11320 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
11330 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
11340 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
11350 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
11360 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
11370 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
11380 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
11390 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
113a0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
113b0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
113c0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
113d0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
113e0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
113f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
11400 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
11410 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
11420 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
11430 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
11440 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11450 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
11460 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
11470 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
11480 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
11490 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
114a0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
114b0 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
114c0 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
114d0 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
114e0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
114f0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
11500 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
11510 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
11520 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
11530 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
11540 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
11550 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
11560 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
11570 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11580 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
11590 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
115a0 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
115b0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
115c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
115d0 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
115e0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
115f0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
11600 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
11610 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
11620 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
11630 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
11640 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
11650 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
11660 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
11670 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
11680 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11690 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
116a0 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
116b0 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
116c0 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
116d0 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
116e0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
116f0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
11700 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
11710 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
11720 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
11730 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
11740 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
11750 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
11760 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
11770 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
11780 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
11790 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
117a0 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
117b0 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
117c0 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
117d0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
117e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
117f0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
11800 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
11810 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
11820 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
11830 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11840 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11850 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11860 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
11870 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11880 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
11890 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
118a0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
118b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
118c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
118d0 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
118e0 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
118f0 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
11900 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11910 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
11920 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
11930 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
11940 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
11950 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11960 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
11970 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
11980 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
11990 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
119a0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
119b0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
119c0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
119d0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
119e0 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
119f0 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
11a00 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
11a10 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11a20 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
11a30 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
11a40 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
11a50 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
11a60 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
11a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
11a80 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
11a90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
11aa0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
11ab0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
11ac0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
11ad0 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
11ae0 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
11af0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
11b00 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
11b10 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
11b20 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
11b30 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
11b40 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
11b50 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
11b60 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
11b70 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
11b80 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
11b90 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
11ba0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
11bb0 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
11bc0 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
11bd0 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
11be0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11bf0 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
11c00 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11c10 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
11c20 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
11c30 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
11c40 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
11c50 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
11c60 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
11c70 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
11c80 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
11c90 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
11ca0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
11cb0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
11cc0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
11cd0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
11ce0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11cf0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
11d00 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
11d10 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
11d20 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
11d30 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
11d40 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
11d50 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
11d60 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
11d70 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
11d80 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
11d90 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69  o = errno;.    i
11da0 66 28 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e  f( tErrno==ENOEN
11db0 54 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  T ){.      rc = 
11dc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
11dd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
11de0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11df0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72  LOCK;.      stor
11e00 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11e10 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
11e20 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
11e30 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
11e40 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
11e50 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
11e60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11e70 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
11e80 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
11e90 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
11ea0 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
11eb0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
11ec0 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
11ed0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
11ee0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
11ef0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11f00 2a 29 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20  *)id;.  assert( 
11f10 69 64 21 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f  id!=0 );.  dotlo
11f20 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
11f30 4c 4f 43 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33  LOCK);.  sqlite3
11f40 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63  _free(pFile->loc
11f50 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20  kingContext);.  
11f60 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78  return closeUnix
11f70 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a  File(id);.}./***
11f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
11f90 45 6e 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66  End of the dot-f
11fa0 69 6c 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ile lock impleme
11fb0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
11fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
11fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
11ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
12020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
12070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
12080 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c  ******* Begin fl
12090 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ock Locking ****
120a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
120b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
120c0 2a 2a 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b  ** Use the flock
120d0 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74  () system call t
120e0 6f 20 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  o do file lockin
120f0 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29  g..**.** flock()
12100 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
12110 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e   dot-file lockin
12120 67 20 69 6e 20 74 68 61 74 20 74 68 65 20 76 61  g in that the va
12130 72 69 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72  rious.** fine-gr
12140 61 69 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  ain locking leve
12150 6c 73 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ls supported by 
12160 53 51 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61  SQLite are colla
12170 70 73 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73  psed into.** a s
12180 69 6e 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20  ingle exclusive 
12190 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20  lock.  In other 
121a0 77 6f 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52  words, SHARED, R
121b0 45 53 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20  ESERVED, and.** 
121c0 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72  PENDING locks ar
121d0 65 20 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67  e the same thing
121e0 20 61 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45   as an EXCLUSIVE
121f0 20 6c 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a   lock.  SQLite.*
12200 2a 20 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68  * still works wh
12210 65 6e 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20  en you do this, 
12220 62 75 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20  but concurrency 
12230 69 73 20 72 65 64 75 63 65 64 20 73 69 6e 63 65  is reduced since
12240 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  .** only a singl
12250 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65  e process can be
12260 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
12270 61 62 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e  abase at a time.
12280 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73  .**.** Omit this
12290 20 73 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49   section if SQLI
122a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
122b0 47 5f 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65  G_STYLE is turne
122c0 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c  d off.*/.#if SQL
122d0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
122e0 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20  NG_STYLE../*.** 
122f0 52 65 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61  Retry flock() ca
12300 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 77 69  lls that fail wi
12310 74 68 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64  th EINTR.*/.#ifd
12320 65 66 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20  ef EINTR.static 
12330 69 6e 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  int robust_flock
12340 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29  (int fd, int op)
12350 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  {.  int rc;.  do
12360 7b 20 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c  { rc = flock(fd,
12370 6f 70 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  op); }while( rc<
12380 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
12390 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
123a0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
123b0 6e 65 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  ne robust_flock(
123c0 61 2c 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a  a,b) flock(a,b).
123d0 23 65 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a  #endif.     ../*
123e0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
123f0 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
12400 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
12410 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
12420 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
12430 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
12440 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
12450 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
12460 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
12470 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
12480 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
12490 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
124a0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
124b0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
124c0 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
124d0 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
124e0 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
124f0 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
12500 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
12510 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63  ic int flockChec
12520 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
12530 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
12540 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
12550 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12560 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
12570 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
12580 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
12590 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20  ixFile*)id;.  . 
125a0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
125b0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
125c0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
125d0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
125e0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
125f0 3b 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20  ;.  .  /* Check 
12600 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
12610 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
12620 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
12630 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
12640 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
12650 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
12660 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
12670 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
12680 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
12690 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
126a0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
126b0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  erved ){.    /* 
126c0 61 74 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74  attempt to get t
126d0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69  he lock */.    i
126e0 6e 74 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f  nt lrc = robust_
126f0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
12700 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e  LOCK_EX | LOCK_N
12710 42 29 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63  B);.    if( !lrc
12720 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74   ){.      /* got
12730 20 74 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63   the lock, unloc
12740 6b 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72  k it */.      lr
12750 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  c = robust_flock
12760 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
12770 55 4e 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20  UN);.      if ( 
12780 6c 72 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20  lrc ) {.        
12790 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
127a0 6e 6f 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75  no;.        /* u
127b0 6e 6c 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74  nlock failed wit
127c0 68 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  h an error */.  
127d0 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
127e0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
127f0 20 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c   .        storeL
12800 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12810 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
12820 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
12830 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
12840 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
12850 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12860 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
12870 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65      /* someone e
12880 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69  lse might have i
12890 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20  t reserved */.  
128a0 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65      lrc = sqlite
128b0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
128c0 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
128d0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20  TE_IOERR_LOCK); 
128e0 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
128f0 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b  CK_ERROR(lrc) ){
12900 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
12910 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12920 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
12930 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20  rc = lrc;.      
12940 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  }.    }.  }.  OS
12950 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
12960 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66  LOCK %d %d %d (f
12970 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
12980 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
12990 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ));..#ifdef SQLI
129a0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
129b0 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66  LOCK_ERRORS.  if
129c0 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49  ( (rc & SQLITE_I
129d0 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f  OERR) == SQLITE_
129e0 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20  IOERR ){.    rc 
129f0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
12a00 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d   reserved=1;.  }
12a10 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
12a20 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
12a30 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
12a40 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
12a50 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
12a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
12a70 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
12a80 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
12a90 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
12aa0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
12ab0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12ac0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
12ad0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
12ae0 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
12af0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
12b00 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
12b10 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
12b20 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
12b30 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
12b40 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
12b50 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
12b60 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
12b70 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
12b80 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
12b90 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
12ba0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
12bb0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
12bc0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
12bd0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
12be0 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
12bf0 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
12c00 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
12c10 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
12c20 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
12c30 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
12c40 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
12c50 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
12c60 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
12c70 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
12c80 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
12c90 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
12ca0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
12cb0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
12cc0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
12cd0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
12ce0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
12cf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
12d00 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
12d10 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c  CLUSIVE.**.** fl
12d20 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c  ock() only reall
12d30 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
12d40 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
12d50 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
12d60 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
12d70 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
12d80 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
12d90 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
12da0 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
12db0 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
12dc0 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
12dd0 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
12de0 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
12df0 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
12e00 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
12e10 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
12e20 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
12e30 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
12e40 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
12e50 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
12e60 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
12e70 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
12e80 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74   flockLock(sqlit
12e90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12ea0 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
12eb0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12ec0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
12ed0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
12ee0 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  e*)id;..  assert
12ef0 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
12f00 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
12f10 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
12f20 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
12f30 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
12f40 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
12f50 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
12f60 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
12f70 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
12f80 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
12f90 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
12fa0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
12fb0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
12fc0 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
12fd0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
12fe0 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75  */.  .  if (robu
12ff0 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
13000 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43  h, LOCK_EX | LOC
13010 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74  K_NB)) {.    int
13020 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
13030 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67  .    /* didn't g
13040 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79  et, must be busy
13050 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
13060 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
13070 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
13080 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
13090 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  );.    if( IS_LO
130a0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
130b0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
130c0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
130d0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  no);.    }.  } e
130e0 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74  lse {.    /* got
130f0 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70   it, set the typ
13100 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20  e and return ok 
13110 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  */.    pFile->eF
13120 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
13130 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ock;.  }.  OSTRA
13140 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20  CE(("LOCK    %d 
13150 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22  %s %s (flock)\n"
13160 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69  , pFile->h, azFi
13170 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
13180 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72  ), .           r
13190 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
131a0 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
131b0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
131c0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
131d0 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28  K_ERRORS.  if( (
131e0 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc & SQLITE_IOER
131f0 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45  R) == SQLITE_IOE
13200 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  RR ){.    rc = S
13210 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
13220 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
13230 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
13240 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72  CK_ERRORS */.  r
13250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
13260 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
13270 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
13280 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
13290 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
132a0 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
132b0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
132c0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
132d0 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
132e0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
132f0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
13300 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
13310 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
13320 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
13330 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
13340 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13350 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
13360 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c  tic int flockUnl
13370 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
13380 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
13390 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
133a0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
133b0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61  File*)id;.  .  a
133c0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
133d0 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
133e0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
133f0 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c   pid=%d (flock)\
13400 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
13410 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
13420 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
13430 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
13440 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
13450 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
13460 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
13470 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
13480 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
13490 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
134a0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
134b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
134c0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
134d0 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
134e0 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
134f0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
13500 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
13510 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
13520 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
13530 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
13540 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
13550 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13560 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
13570 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63  o, really, unloc
13580 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62 75  k. */.  if( robu
13590 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e  st_flock(pFile->
135a0 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23  h, LOCK_UN) ){.#
135b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
135c0 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
135d0 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72 6e  RRORS.    return
135e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
135f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
13600 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45  ORE_FLOCK_LOCK_E
13610 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65 74  RRORS */.    ret
13620 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13630 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65  _UNLOCK;.  }else
13640 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
13650 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
13660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13670 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
13680 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
13690 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
136a0 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69   flockClose(sqli
136b0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
136c0 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
136d0 29 3b 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  );.  flockUnlock
136e0 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
136f0 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69   return closeUni
13700 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a 23 65  xFile(id);.}..#e
13710 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
13720 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
13730 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
13740 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  K */../*********
13750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
13760 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b  f the flock lock
13770 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137e0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13830 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13850 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61  Begin Named Sema
13860 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a  phore Locking **
13870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13880 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d  ******.**.** Nam
13890 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ed semaphore loc
138a0 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70  king is only sup
138b0 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b  ported on VxWork
138c0 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  s..**.** Semapho
138d0 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69  re locking is li
138e0 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20  ke dot-lock and 
138f0 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74  flock in that it
13900 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20   really only.** 
13910 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49  supports EXCLUSI
13920 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c  VE locking.  Onl
13930 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
13940 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77  ss can read or w
13950 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  rite.** the data
13960 62 61 73 65 20 66 69 6c 65 20 61 74 20 61 20 74  base file at a t
13970 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64 75 63  ime.  This reduc
13980 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e  es potential con
13990 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a  currency, but.**
139a0 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20   makes the lock 
139b0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
139c0 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23  uch easier..*/.#
139d0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  if OS_VXWORKS../
139e0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
139f0 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
13a00 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
13a10 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
13a20 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
13a30 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
13a40 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
13a50 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
13a60 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
13a70 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
13a80 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
13a90 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
13aa0 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
13ab0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
13ac0 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
13ad0 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
13ae0 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
13af0 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
13b00 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
13b10 74 69 63 20 69 6e 74 20 73 65 6d 58 43 68 65 63  tic int semXChec
13b20 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
13b30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13b40 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a  int *pResOut) {.
13b50 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13b60 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65  E_OK;.  int rese
13b70 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78  rved = 0;.  unix
13b80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13b90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20  nixFile*)id;..  
13ba0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
13bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
13bc0 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
13bd0 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20  EDLOCK; );.  .  
13be0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
13bf0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
13c00 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
13c10 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
13c20 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
13c30 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
13c40 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
13c50 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
13c60 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
13c70 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
13c80 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
13c90 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
13ca0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
13cb0 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20  ed ){.    sem_t 
13cc0 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
13cd0 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
13ce0 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
13cf0 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
13d00 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
13d10 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69  = errno;.      i
13d20 66 28 20 45 41 47 41 49 4e 20 21 3d 20 74 45 72  f( EAGAIN != tEr
13d30 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 72  rno ){.        r
13d40 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
13d50 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
13d60 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
13d70 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
13d80 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73  LOCK);.        s
13d90 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
13da0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
13db0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
13dc0 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
13dd0 65 6c 73 65 20 68 61 73 20 74 68 65 20 6c 6f 63  else has the loc
13de0 6b 20 77 68 65 6e 20 77 65 20 61 72 65 20 69 6e  k when we are in
13df0 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20   NO_LOCK */.    
13e00 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 28      reserved = (
13e10 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
13e20 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b   < SHARED_LOCK);
13e30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
13e40 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 77 65 20  se{.      /* we 
13e50 63 6f 75 6c 64 20 68 61 76 65 20 69 74 20 69 66  could have it if
13e60 20 77 65 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20   we want it */. 
13e70 20 20 20 20 20 73 65 6d 5f 70 6f 73 74 28 70 53       sem_post(pS
13e80 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  em);.    }.  }. 
13e90 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
13ea0 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
13eb0 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65   (sem)\n", pFile
13ec0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
13ed0 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74  d));..  *pResOut
13ee0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
13ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13f00 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
13f10 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
13f20 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
13f30 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
13f40 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
13f50 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
13f60 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
13f70 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
13f80 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
13f90 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
13fa0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
13fb0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
13fc0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
13fd0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
13fe0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
13ff0 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
14000 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
14010 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
14020 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
14030 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
14040 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
14050 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
14060 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
14070 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
14080 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
14090 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
140a0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
140b0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
140c0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
140d0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
140e0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
140f0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
14100 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
14110 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
14120 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
14130 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
14140 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
14150 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
14160 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
14170 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
14180 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
14190 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
141a0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
141b0 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20  **.** Semaphore 
141c0 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c  locks only reall
141d0 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53  y support EXCLUS
141e0 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74  IVE locks.  We t
141f0 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74  rack intermediat
14200 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73  e.** lock states
14210 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f   in the sqlite3_
14220 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20  file structure, 
14230 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48  but all locks SH
14240 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65  ARED or.** above
14250 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c   are really EXCL
14260 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20  USIVE locks and 
14270 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65  exclude all othe
14280 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d  r processes from
14290 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66  .** access the f
142a0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ile..**.** This 
142b0 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
142c0 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
142d0 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
142e0 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
142f0 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
14300 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
14310 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
14320 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c 69 74 65   semXLock(sqlite
14330 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
14340 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
14350 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
14360 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
14370 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
14380 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
14390 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  Sem;.  int rc = 
143a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
143b0 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   if we already h
143c0 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69  ave a lock, it i
143d0 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20  s exclusive.  . 
143e0 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20   ** Just adjust 
143f0 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f  level and punt o
14400 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f  n outta here. */
14410 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46  .  if (pFile->eF
14420 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43  ileLock > NO_LOC
14430 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
14440 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
14450 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20  eLock;.    rc = 
14460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67  SQLITE_OK;.    g
14470 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14480 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f  ;.  }.  .  /* lo
14490 63 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77  ck semaphore now
144a0 20 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68   but bail out wh
144b0 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65  en already locke
144c0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f  d. */.  if( sem_
144d0 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
144e0 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
144f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
14500 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  oto sem_end_lock
14510 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20  ;.  }..  /* got 
14520 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
14530 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
14540 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  /.  pFile->eFile
14550 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
14560 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b  ;.. sem_end_lock
14570 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
14580 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
14590 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
145a0 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
145b0 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
145c0 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
145d0 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
145e0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
145f0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
14600 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
14610 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
14620 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
14630 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
14640 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
14650 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
14660 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
14670 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
14680 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58  .static int semX
14690 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
146a0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
146b0 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
146c0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
146d0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
146e0 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69  em_t *pSem = pFi
146f0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  le->pInode->pSem
14700 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
14710 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  le );.  assert( 
14720 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43  pSem );.  OSTRAC
14730 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
14740 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
14750 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (sem)\n", pFile-
14760 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
14770 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
14780 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65  >eFileLock, osGe
14790 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73  tpid(0)));.  ass
147a0 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d  ert( eFileLock<=
147b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
147c0 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20   .  /* no-op if 
147d0 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66  possible */.  if
147e0 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
147f0 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck==eFileLock ){
14800 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
14810 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
14820 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75  /* shared can ju
14830 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73  st be set becaus
14840 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65  e we always have
14850 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f   an exclusive */
14860 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b  .  if (eFileLock
14870 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b  ==SHARED_LOCK) {
14880 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
14890 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
148a0 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  k;.    return SQ
148b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
148c0 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 20    /* no, really 
148d0 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 20  unlock. */.  if 
148e0 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29  ( sem_post(pSem)
148f0 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74  ==-1 ) {.    int
14900 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72   rc, tErrno = er
14910 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  rno;.    rc = sq
14920 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
14930 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
14940 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
14950 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53  OCK);.    if( IS
14960 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
14970 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
14980 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
14990 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
149a0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
149b0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
149c0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
149d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
149e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
149f0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
14a00 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
14a10 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
14a20 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
14a30 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
14a40 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14a50 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
14a60 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  mXUnlock(id, NO_
14a70 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72  LOCK);.    asser
14a80 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20  t( pFile );.    
14a90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
14aa0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f  ;.    releaseIno
14ab0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
14ac0 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
14ad0 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e  x();.    closeUn
14ae0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a  ixFile(id);.  }.
14af0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14b00 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  OK;.}..#endif /*
14b10 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f   OS_VXWORKS */./
14b20 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70  *.** Named semap
14b30 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
14b40 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
14b50 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a  n VxWorks..**.**
14b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
14b70 64 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73  d of the named s
14b80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d  emaphore lock im
14b90 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
14bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
14c00 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
14c70 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a  n AFP Locking **
14c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
14ca0 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65  **.** AFP is the
14cb0 20 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72   Apple Filing Pr
14cc0 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20  otocol.  AFP is 
14cd0 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79  a network filesy
14ce0 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e  stem found.** on
14cf0 20 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68   Apple Macintosh
14d00 20 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74   computers - bot
14d10 68 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a  h OS9 and OSX..*
14d20 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79  *.** Third-party
14d30 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73   implementations
14d40 20 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69   of AFP are avai
14d50 6c 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73  lable.  But this
14d60 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e   code here.** on
14d70 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e  ly works on OSX.
14d80 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  .*/..#if defined
14d90 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
14da0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
14db0 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a  KING_STYLE./*.**
14dc0 20 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43   The afpLockingC
14dd0 6f 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65  ontext structure
14de0 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66   contains all af
14df0 70 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20  p lock specific 
14e00 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66  state.*/.typedef
14e10 20 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69   struct afpLocki
14e20 6e 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63  ngContext afpLoc
14e30 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72  kingContext;.str
14e40 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  uct afpLockingCo
14e50 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65  ntext {.  int re
14e60 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20  served;.  const 
14e70 63 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20  char *dbPath;   
14e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
14e90 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69  e of the open fi
14ea0 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74  le */.};..struct
14eb0 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42   ByteRangeLockPB
14ec0 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c  2.{.  unsigned l
14ed0 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b  ong long offset;
14ee0 20 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65          /* offse
14ef0 74 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20  t to first byte 
14f00 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73  to lock */.  uns
14f10 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
14f20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f  length;        /
14f30 2a 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74  * nbr of bytes t
14f40 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
14f50 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72  gned long long r
14f60 65 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a  etRangeStart; /*
14f70 20 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65   nbr of 1st byte
14f80 20 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65   locked if succe
14f90 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67  ssful */.  unsig
14fa0 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46  ned char unLockF
14fb0 6c 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  lag;         /* 
14fc0 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20  1 = unlock, 0 = 
14fd0 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  lock */.  unsign
14fe0 65 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64  ed char startEnd
14ff0 46 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31  Flag;       /* 1
15000 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66  =rel to end of f
15010 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74  ork, 0=rel to st
15020 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b  art */.  int fd;
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
15050 6c 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63  le desc to assoc
15060 20 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20   this lock with 
15070 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61  */.};..#define a
15080 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63  fpfsByteRangeLoc
15090 6b 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f  k2FSCTL        _
150a0 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74  IOWR('z', 23, st
150b0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
150c0 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  ckPB2)../*.** Th
150d0 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20  is is a utility 
150e0 66 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63  for setting or c
150f0 6c 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61  learing a bit-ra
15100 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a  nge lock on an.*
15110 2a 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d  * AFP filesystem
15120 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20  ..** .** Return 
15130 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
15140 63 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53  cess, SQLITE_BUS
15150 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  Y on failure..*/
15160 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53  .static int afpS
15170 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20  etLock(.  const 
15180 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20  char *path,     
15190 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
151a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
151b0 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c  be locked or unl
151c0 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46  ocked */.  unixF
151d0 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
151e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
151f0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
15200 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75  r on path */.  u
15210 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
15220 67 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a  g offset,     /*
15230 20 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62   First byte to b
15240 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  e locked */.  un
15250 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
15260 20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20   length,     /* 
15270 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
15280 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74  to lock */.  int
15290 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20   setLockFlag    
152a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
152b0 72 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e  rue to set lock.
152c0 20 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72    False to clear
152d0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74   lock */.){.  st
152e0 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f  ruct ByteRangeLo
152f0 63 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20  ckPB2 pb;.  int 
15300 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c  err;.  .  pb.unL
15310 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63  ockFlag = setLoc
15320 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20  kFlag ? 0 : 1;. 
15330 20 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67   pb.startEndFlag
15340 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65   = 0;.  pb.offse
15350 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62  t = offset;.  pb
15360 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68  .length = length
15370 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69  ; .  pb.fd = pFi
15380 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52  le->h;.  .  OSTR
15390 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b  ACE(("AFPSETLOCK
153a0 20 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69   [%s] for %d%s i
153b0 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c  n range %llx:%ll
153c0 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c  x\n", .    (setL
153d0 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46  ockFlag?"ON":"OF
153e0 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28  F"), pFile->h, (
153f0 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74  pb.fd==-1?"[test
15400 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20  val-1]":""),.   
15410 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29   offset, length)
15420 29 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c  );.  err = fsctl
15430 28 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65  (path, afpfsByte
15440 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c  RangeLock2FSCTL,
15450 20 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28   &pb, 0);.  if (
15460 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20   err==-1 ) {.   
15470 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74   int rc;.    int
15480 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
15490 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41  .    OSTRACE(("A
154a0 46 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64  FPSETLOCK failed
154b0 20 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27   to fsctl() '%s'
154c0 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
154d0 20 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45          path, tE
154e0 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74  rrno, strerror(t
154f0 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66  Errno)));.#ifdef
15500 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
15510 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  FP_LOCK_ERRORS. 
15520 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
15530 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72  USY;.#else.    r
15540 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
15550 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
15560 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20  rrno,.          
15570 20 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63            setLoc
15580 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49  kFlag ? SQLITE_I
15590 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49  OERR_LOCK : SQLI
155a0 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
155b0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
155c0 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f  TE_IGNORE_AFP_LO
155d0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20  CK_ERRORS */.   
155e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
155f0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15600 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
15610 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
15620 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
15630 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  rc;.  } else {. 
15640 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15650 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
15660 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
15670 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
15680 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15690 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
156a0 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
156b0 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
156c0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
156d0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
156e0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
156f0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15700 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15710 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15720 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15730 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15740 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15750 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15760 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
15770 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
15780 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
15790 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73   int afpCheckRes
157a0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
157b0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
157c0 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
157d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
157e0 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
157f0 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
15800 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15810 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63  le*)id;.  afpLoc
15820 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e  kingContext *con
15830 74 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c  text;.  .  Simul
15840 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
15850 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
15860 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
15870 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72  K; );.  .  asser
15880 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f  t( pFile );.  co
15890 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
158a0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
158b0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
158c0 65 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65  ext;.  if( conte
158d0 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a  xt->reserved ){.
158e0 20 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31      *pResOut = 1
158f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15900 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
15910 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
15920 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65  /* Because pFile
15930 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
15940 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
15950 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65  s */.  .  /* Che
15960 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
15970 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
15980 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
15990 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
159a0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
159b0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  ck>SHARED_LOCK )
159c0 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  {.    reserved =
159d0 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   1;.  }.  .  /* 
159e0 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66  Otherwise see if
159f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
15a00 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20  ess holds it..  
15a10 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
15a20 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f  ved ){.    /* lo
15a30 63 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ck the RESERVED 
15a40 62 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  byte */.    int 
15a50 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
15a60 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
15a70 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
15a80 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a  D_BYTE, 1,1);  .
15a90 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f      if( SQLITE_O
15aa0 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20  K==lrc ){.      
15ab0 2f 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64  /* if we succeed
15ac0 65 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65  ed in taking the
15ad0 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20   reserved lock, 
15ae0 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73  unlock it to res
15af0 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  tore.      ** th
15b00 65 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  e original state
15b10 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
15b20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
15b30 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
15b40 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
15b50 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65  , 1, 0);.    } e
15b60 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69  lse {.      /* i
15b70 66 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67  f we failed to g
15b80 65 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e  et the lock then
15b90 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75   someone else mu
15ba0 73 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20  st have it */.  
15bb0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
15bc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
15bd0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
15be0 63 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  c) ){.      rc=l
15bf0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
15c00 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
15c10 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
15c20 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
15c30 20 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c   %d %d (afp)\n",
15c40 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
15c50 65 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20  eserved));.  .  
15c60 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72  *pResOut = reser
15c70 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ved;.  return rc
15c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20  ;.}../*.** Lock 
15c90 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68  the file with th
15ca0 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64  e lock specified
15cb0 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46   by parameter eF
15cc0 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a  ileLock - one.**
15cd0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
15ce0 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29  g:.**.**     (1)
15cf0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20   SHARED_LOCK.** 
15d00 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44      (2) RESERVED
15d10 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29  _LOCK.**     (3)
15d20 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a   PENDING_LOCK.**
15d30 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49       (4) EXCLUSI
15d40 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f  VE_LOCK.**.** So
15d50 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71  metimes when req
15d60 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b  uesting one lock
15d70 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e   state, addition
15d80 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a  al lock states.*
15d90 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69  * are inserted i
15da0 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20  n between.  The 
15db0 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61  locking might fa
15dc0 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  il on one of the
15dd0 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69   later.** transi
15de0 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68  tions leaving th
15df0 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66  e lock state dif
15e00 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74  ferent from what
15e10 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a   it started but.
15e20 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f  ** still short o
15e30 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65  f its goal.  The
15e40 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74   following chart
15e50 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77   shows the allow
15e60 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e  ed.** transition
15e70 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74  s and the insert
15e80 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  ed intermediate 
15e90 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
15ea0 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41   UNLOCKED -> SHA
15eb0 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  RED.**    SHARED
15ec0 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20   -> RESERVED.** 
15ed0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45     SHARED -> (PE
15ee0 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
15ef0 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56  IVE.**    RESERV
15f00 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
15f10 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
15f20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58     PENDING -> EX
15f30 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68  CLUSIVE.**.** Th
15f40 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
15f50 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
15f60 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
15f70 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
15f80 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
15f90 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
15fa0 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
15fb0 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69  int afpLock(sqli
15fc0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15fd0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
15fe0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15ff0 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  OK;.  unixFile *
16000 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
16010 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f  e*)id;.  unixIno
16020 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
16030 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
16040 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
16050 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28  ext *context = (
16060 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
16070 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  t *) pFile->lock
16080 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  ingContext;.  . 
16090 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
160a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
160b0 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
160c0 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
160d0 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
160e0 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
160f0 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
16100 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63  Lock), azFileLoc
16110 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  k(pFile->eFileLo
16120 63 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ck),.           
16130 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64  azFileLock(pInod
16140 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70  e->eFileLock), p
16150 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c  Inode->nShared ,
16160 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
16170 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
16180 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
16190 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
161a0 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
161b0 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e  e on the.  ** un
161c0 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69  ixFile, do nothi
161d0 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68  ng. Don't use th
161e0 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20  e afp_end_lock: 
161f0 65 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20  exit path, as.  
16200 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  ** unixEnterMute
16210 78 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20  x() hasn't been 
16220 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f  called yet..  */
16230 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
16240 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f  ileLock>=eFileLo
16250 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43  ck ){.    OSTRAC
16260 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16270 73 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65  s ok (already he
16280 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  ld) (afp)\n", pF
16290 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
162a0 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
162b0 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20  ileLock)));.    
162c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
162d0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
162e0 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e   sure the lockin
162f0 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63 6f  g sequence is co
16300 72 72 65 63 74 0a 20 20 2a 2a 20 20 28 31 29 20  rrect.  **  (1) 
16310 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72  We never move fr
16320 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61  om unlocked to a
16330 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72 20 74  nything higher t
16340 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e  han shared lock.
16350 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74  .  **  (2) SQLit
16360 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74  e never explicit
16370 6c 79 20 72 65 71 75 65 73 74 73 20 61 20 70 65  ly requests a pe
16380 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ndig lock..  ** 
16390 20 28 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f   (3) A shared lo
163a0 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c  ck is always hel
163b0 64 20 77 68 65 6e 20 61 20 72 65 73 65 72 76 65  d when a reserve
163c0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
163d0 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
163e0 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
163f0 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20  ock!=NO_LOCK || 
16400 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
16410 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
16420 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50  rt( eFileLock!=P
16430 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20  ENDING_LOCK );. 
16440 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
16450 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck!=RESERVED_LOC
16460 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K || pFile->eFil
16470 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
16480 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54 68  CK );.  .  /* Th
16490 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
164a0 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
164b0 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
164c0 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
164d0 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
164e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
164f0 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
16500 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
16510 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
16520 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
16530 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
16540 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
16550 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
16560 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
16570 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
16580 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
16590 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
165a0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
165b0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
165c0 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
165d0 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47  ileLock>=PENDING
165e0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
165f0 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29  ck>SHARED_LOCK))
16600 0a 20 20 20 20 20 29 7b 0a 20 20 20 20 72 63 20  .     ){.    rc 
16610 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
16620 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
16630 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  lock;.  }.  .  /
16640 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
16650 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
16660 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
16670 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
16680 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
16690 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
166a0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
166b0 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
166c0 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
166d0 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
166e0 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
166f0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
16700 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
16710 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
16720 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
16730 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
16740 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
16750 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
16760 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
16770 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16780 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
16790 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
167a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
167b0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
167c0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
167d0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
167e0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
167f0 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
16800 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
16810 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70  ++;.    goto afp
16820 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
16830 20 20 20 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49     .  /* A PENDI
16840 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
16850 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
16860 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
16870 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
16880 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
16890 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
168a0 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
168b0 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
168c0 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
168d0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  eased..  */.  if
168e0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
168f0 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20  RED_LOCK .      
16900 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  || (eFileLock==E
16910 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
16920 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16930 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a  k<PENDING_LOCK).
16940 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 61 69    ){.    int fai
16950 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c 65 64 20  led;.    failed 
16960 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
16970 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
16980 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
16990 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69 66  E, 1, 1);.    if
169a0 20 28 66 61 69 6c 65 64 29 20 7b 0a 20 20 20 20   (failed) {.    
169b0 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
169c0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
169d0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
169e0 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 63 6f 6e  }.  .  /* If con
169f0 74 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69  trol gets to thi
16a00 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63  s point, then ac
16a10 74 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20  tually go ahead 
16a20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70  and make.  ** op
16a30 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
16a40 61 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65  alls for the spe
16a50 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  cified lock..  *
16a60 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
16a70 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
16a80 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63 31 2c 20  {.    int lrc1, 
16a90 6c 72 63 32 2c 20 6c 72 63 31 45 72 72 6e 6f 20  lrc2, lrc1Errno 
16aa0 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b  = 0;.    long lk
16ab0 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a 20 20 20  , mask;.    .   
16ac0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
16ad0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
16ae0 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
16af0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
16b00 29 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  );.        .    
16b10 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f 66 28 6c  mask = (sizeof(l
16b20 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41 52 47 45  ong)==8) ? LARGE
16b30 53 54 5f 49 4e 54 36 34 20 3a 20 30 78 37 66 66  ST_INT64 : 0x7ff
16b40 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f  fffff;.    /* No
16b50 77 20 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c  w get the read-l
16b60 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock SHARED_LOCK 
16b70 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74 65 20 74  */.    /* note t
16b80 68 61 74 20 74 68 65 20 71 75 61 6c 69 74 79 20  hat the quality 
16b90 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  of the randomnes
16ba0 73 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  s doesn't matter
16bb0 20 74 68 61 74 20 6d 75 63 68 20 2a 2f 0a 20 20   that much */.  
16bc0 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d 28 29 3b    lk = random();
16bd0 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68   .    pInode->sh
16be0 61 72 65 64 42 79 74 65 20 3d 20 28 6c 6b 20 26  aredByte = (lk &
16bf0 20 6d 61 73 6b 29 25 28 53 48 41 52 45 44 5f 53   mask)%(SHARED_S
16c00 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20 6c 72  IZE - 1);.    lr
16c10 63 31 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c1 = afpSetLock(
16c20 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
16c30 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20   pFile, .       
16c40 20 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b     SHARED_FIRST+
16c50 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
16c60 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 69  te, 1, 1);.    i
16c70 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16c80 28 6c 72 63 31 29 20 29 7b 0a 20 20 20 20 20 20  (lrc1) ){.      
16c90 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70 46 69 6c  lrc1Errno = pFil
16ca0 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20  e->lastErrno;.  
16cb0 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20    }.    /* Drop 
16cc0 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
16cd0 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
16ce0 20 20 6c 72 63 32 20 3d 20 61 66 70 53 65 74 4c    lrc2 = afpSetL
16cf0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
16d00 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
16d10 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
16d20 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 49 53  .    .    if( IS
16d30 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31  _LOCK_ERROR(lrc1
16d40 29 20 29 20 7b 0a 20 20 20 20 20 20 73 74 6f 72  ) ) {.      stor
16d50 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
16d60 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b 0a 20 20  , lrc1Errno);.  
16d70 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20      rc = lrc1;. 
16d80 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16d90 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
16da0 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45  se if( IS_LOCK_E
16db0 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a 20 20  RROR(lrc2) ){.  
16dc0 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b 0a 20      rc = lrc2;. 
16dd0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
16de0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20 65 6c  d_lock;.    } el
16df0 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d 20 53  se if( lrc1 != S
16e00 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20  QLITE_OK ) {.   
16e10 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20     rc = lrc1;.  
16e20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
16e30 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16e40 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
16e50 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
16e60 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49  Lock++;.      pI
16e70 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20  node->nShared = 
16e80 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
16e90 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
16ea0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26  EXCLUSIVE_LOCK &
16eb0 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  & pInode->nShare
16ec0 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65  d>1 ){.    /* We
16ed0 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20   are trying for 
16ee0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
16ef0 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68  k but another th
16f00 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20  read in this.   
16f10 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73    ** same proces
16f20 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69  s is still holdi
16f30 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b  ng a shared lock
16f40 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51  . */.    rc = SQ
16f50 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c  LITE_BUSY;.  }el
16f60 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
16f70 65 71 75 65 73 74 20 77 61 73 20 66 6f 72 20 61  equest was for a
16f80 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
16f90 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74  LUSIVE lock.  It
16fa0 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d   is.    ** assum
16fb0 65 64 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ed that there is
16fc0 20 61 20 53 48 41 52 45 44 20 6f 72 20 67 72 65   a SHARED or gre
16fd0 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
16fe0 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72   file.    ** alr
16ff0 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
17000 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20 30 3b   int failed = 0;
17010 0a 20 20 20 20 61 73 73 65 72 74 28 20 30 21 3d  .    assert( 0!=
17020 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17030 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46 69 6c   );.    if (eFil
17040 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52 56 45  eLock >= RESERVE
17050 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  D_LOCK && pFile-
17060 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52 45 53  >eFileLock < RES
17070 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  ERVED_LOCK) {.  
17080 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72 65        /* Acquire
17090 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
170a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c   */.        fail
170b0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
170c0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
170d0 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
170e0 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20 20 20  _BYTE, 1,1);.   
170f0 20 20 20 69 66 28 20 21 66 61 69 6c 65 64 20 29     if( !failed )
17100 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  {.        contex
17110 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 31 3b  t->reserved = 1;
17120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17130 20 20 20 69 66 20 28 21 66 61 69 6c 65 64 20 26     if (!failed &
17140 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45  & eFileLock == E
17150 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 20 7b  XCLUSIVE_LOCK) {
17160 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69 72  .      /* Acquir
17170 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  e an EXCLUSIVE l
17180 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 0a  ock */.        .
17190 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20        /* Remove 
171a0 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
171b0 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20 74 68  before trying th
171c0 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c 6c 20  e range.  we'll 
171d0 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20 20 2a  need to .      *
171e0 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  * reestablish th
171f0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 66  e shared lock if
17200 20 77 65 20 63 61 6e 27 74 20 67 65 74 20 74 68   we can't get th
17210 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20 20 20  e  afpUnlock.   
17220 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
17230 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65  !(failed = afpSe
17240 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
17250 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
17260 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20 20 20  ARED_FIRST +.   
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 73 68        pInode->sh
17290 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30 29 29  aredByte, 1, 0))
172a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
172b0 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49 54 45  failed2 = SQLITE
172c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  _OK;.        /* 
172d0 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74 6f 20  now attemmpt to 
172e0 67 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  get the exclusiv
172f0 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a  e lock range */.
17300 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
17310 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
17320 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
17330 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  le, SHARED_FIRST
17340 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
17350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17360 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 31    SHARED_SIZE, 1
17370 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 66  );.        if( f
17380 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c 65 64  ailed && (failed
17390 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  2 = afpSetLock(c
173a0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
173b0 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20 20 20  pFile, .        
173c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
173d0 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 49  HARED_FIRST + pI
173e0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
173f0 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20 20 20  , 1, 1)) ){.    
17400 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74 20 72        /* Can't r
17410 65 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  eestablish the s
17420 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53 71 6c  hared lock.  Sql
17430 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c 2c 20  ite can't deal, 
17440 74 68 69 73 20 69 73 0a 20 20 20 20 20 20 20 20  this is.        
17450 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61 6c 20    ** a critical 
17460 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20 20 20  I/O error.      
17470 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
17480 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64 20 26   rc = ((failed &
17490 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d   SQLITE_IOERR) =
174a0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20  = SQLITE_IOERR) 
174b0 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20 20  ? failed2 : .   
174c0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
174d0 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20  TE_IOERR_LOCK;. 
174e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61 66           goto af
174f0 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  p_end_lock;.    
17500 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65 6c      } .      }el
17510 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
17520 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20 20   failed; .      
17530 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17540 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  failed ){.      
17550 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20  rc = failed;.   
17560 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20   }.  }.  .  if( 
17570 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17580 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
17590 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
175a0 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65  k;.    pInode->e
175b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
175c0 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Lock;.  }else if
175d0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  ( eFileLock==EXC
175e0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
175f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17600 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
17610 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
17620 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44  eFileLock = PEND
17630 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  ING_LOCK;.  }.  
17640 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20  .afp_end_lock:. 
17650 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
17660 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
17670 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20  OCK    %d %s %s 
17680 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
17690 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
176a0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
176b0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
176c0 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
176d0 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e  led"));.  return
176e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
176f0 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
17700 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
17710 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
17720 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
17730 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
17740 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
17750 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
17760 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
17770 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
17780 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
17790 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
177a0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
177b0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
177c0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
177d0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
177e0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
177f0 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c 69  t afpUnlock(sqli
17800 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
17810 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
17820 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17830 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
17840 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
17850 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
17860 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
17870 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
17880 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20  text *context = 
17890 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
178a0 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63  xt *) pFile->loc
178b0 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69  kingContext;.  i
178c0 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d 20  nt skipShared = 
178d0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
178e0 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d 20  _TEST.  int h = 
178f0 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69 66  pFile->h;.#endif
17900 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
17910 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
17920 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
17930 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
17940 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
17950 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
17960 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
17970 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
17980 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
17990 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
179a0 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64  >pInode->nShared
179b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73 47  ,.           osG
179c0 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 61  etpid(0)));..  a
179d0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
179e0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
179f0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
17a00 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
17a10 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
17a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17a30 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
17a40 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
17a50 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
17a60 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
17a70 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
17a80 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
17a90 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
17aa0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17ab0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
17ac0 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
17ad0 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
17ae0 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
17af0 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
17b00 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
17b10 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
17b20 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
17b30 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
17b40 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
17b50 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
17b60 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
17b70 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
17b80 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
17b90 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
17ba0 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
17bb0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
17bc0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
17bd0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
17be0 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
17bf0 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
17c00 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
17c10 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
17c20 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
17c30 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
17c40 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
17c50 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
17c60 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
17c70 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
17c80 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
17c90 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
17ca0 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
17cb0 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
17cc0 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
17cd0 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
17ce0 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
17cf0 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
17d00 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
17d10 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
17d20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
17d30 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
17d40 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
17d50 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
17d60 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
17d70 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
17d80 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20  rChng==1 );.    
17d90 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
17da0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
17db0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
17dc0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
17dd0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
17de0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
17df0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
17e00 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
17e10 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
17e20 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
17e30 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
17e40 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
17e50 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
17e60 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
17e70 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20  ared>1) ){.     
17e80 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
17e90 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
17ea0 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
17eb0 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
17ec0 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
17ed0 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
17ee0 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
17ef0 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
17f00 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
17f10 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
17f20 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
17f30 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
17f40 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
17f50 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d      skipShared =
17f60 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17f70 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
17f80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
17f90 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
17fa0 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
17fb0 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
17fc0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
17fd0 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
17fe0 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
17ff0 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
18000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18010 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
18020 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
18030 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  && context->rese
18040 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  rved ){.      rc
18050 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
18060 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
18070 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
18080 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
18090 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20    if( !rc ){ .  
180a0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
180b0 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20  eserved = 0; .  
180c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
180d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
180e0 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
180f0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
18100 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
18110 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  1)){.      pInod
18120 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
18130 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
18140 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
18150 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69  SQLITE_OK && eFi
18160 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
18170 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
18180 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
18190 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
181a0 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
181b0 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
181c0 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
181d0 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
181e0 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
181f0 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
18200 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
18210 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
18220 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18230 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
18240 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
18250 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
18260 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
18270 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
18280 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
18290 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d  ==0 ){.      Sim
182a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
182b0 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
182c0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
182d0 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
182e0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
182f0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
18300 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a   !skipShared ){.
18310 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
18320 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
18330 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
18340 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
18350 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
18360 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
18370 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
18380 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
18390 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
183a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
183b0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
183c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
183d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
183e0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
183f0 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
18400 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
18410 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
18420 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
18430 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
18440 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
18450 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
18460 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
18470 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
18480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18490 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
184a0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
184b0 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
184c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
184d0 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
184e0 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
184f0 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
18500 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
18510 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
18520 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
18530 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18540 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18550 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18560 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
18570 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f 63  =0 );.  afpUnloc
18580 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18590 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
185a0 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  ();.  if( pFile-
185b0 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c 65  >pInode && pFile
185c0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20  ->pInode->nLock 
185d0 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
185e0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
185f0 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
18600 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
18610 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
18620 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
18630 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
18640 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
18650 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
18660 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
18670 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
18680 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
18690 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
186a0 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
186b0 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61  en.    ** the la
186c0 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
186d0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ed..    */.    s
186e0 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
186f0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  e);.  }.  releas
18700 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65  eInodeInfo(pFile
18710 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18720 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
18730 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20 3d  Context);.  rc =
18740 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
18750 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  d);.  unixLeaveM
18760 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
18770 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
18780 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  * defined(__APPL
18790 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
187a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
187b0 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65  YLE */./*.** The
187c0 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74   code above is t
187d0 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c  he AFP lock impl
187e0 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65  ementation.  The
187f0 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66 69   code is specifi
18800 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61  c.** to MacOSX a
18810 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  nd does not work
18820 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70   on other unix p
18830 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c  latforms.  No al
18840 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20  ternative.** is 
18850 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79  available.  If y
18860 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65  ou don't compile
18870 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e   for a mac, then
18880 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a   the "unix-afp".
18890 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76  ** VFS is not av
188a0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ailable..**.****
188b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
188c0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50  * End of the AFP
188d0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
188e0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
188f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
18900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
18950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
189a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189b0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
189c0 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  FS Locking *****
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69  ***********/..#i
189f0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18a00 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18a10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18a20 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72  YLE./*. ** Lower
18a30 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
18a40 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
18a50 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
18a60 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
18a70 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65  Lock. ** must be
18a80 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
18a90 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
18aa0 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c   **. ** If the l
18ab0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
18ac0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
18ad0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
18ae0 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74  t or below. ** t
18af0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
18b00 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
18b10 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
18b20 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  -op.. */.static 
18b30 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71  int nfsUnlock(sq
18b40 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
18b50 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a  int eFileLock){.
18b60 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
18b70 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
18b80 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ck, 1);.}..#endi
18b90 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
18ba0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
18bb0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
18bc0 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20  _STYLE */./*.** 
18bd0 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69  The code above i
18be0 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69  s the NFS lock i
18bf0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
18c00 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65 63  The code is spec
18c10 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53  ific.** to MacOS
18c20 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77  X and does not w
18c30 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69  ork on other uni
18c40 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f  x platforms.  No
18c50 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20   alternative.** 
18c60 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a  is available.  .
18c70 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18c80 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
18c90 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
18ca0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
18cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cc0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
18cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d10 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
18d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18d60 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18d70 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67  **** Non-locking
18d80 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65   sqlite3_file me
18d90 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
18da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18db0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65  ***.**.** The ne
18dc0 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74  xt division cont
18dd0 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ains implementat
18de0 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74  ions for all met
18df0 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  hods of the .** 
18e00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
18e10 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ect other than t
18e20 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  he locking metho
18e30 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  ds.  The locking
18e40 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65  .** methods were
18e50 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69   defined in divi
18e60 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65  sions above (one
18e70 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
18e80 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29  per.** division)
18e90 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73  .  Those methods
18ea0 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
18eb0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
18ec0 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74  modes.** are gat
18ed0 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74  her together int
18ee0 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e  o this division.
18ef0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .*/../*.** Seek 
18f00 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70 61  to the offset pa
18f10 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
18f20 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65  nd argument, the
18f30 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62  n read cnt .** b
18f40 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20  ytes into pBuf. 
18f50 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
18f60 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61  r of bytes actua
18f70 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  lly read..**.** 
18f80 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69  NB:  If you defi
18f90 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20  ne USE_PREAD or 
18fa0 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65  USE_PREAD64, the
18fb0 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a  n it might also.
18fc0 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79 20  ** be necessary 
18fd0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
18fe0 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30  _SOURCE to be 50
18ff0 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73 20  0.  This varies 
19000 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74  from.** one syst
19010 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20  em to another.  
19020 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65  Since SQLite doe
19030 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45  s not define USE
19040 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79  _PREAD.** in any
19050 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74   form by default
19060 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74  , we will not at
19070 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20  tempt to define 
19080 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a  _XOPEN_SOURCE..*
19090 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23 32  * See tickets #2
190a0 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a  741 and #2681..*
190b0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
190c0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
190d0 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
190e0 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73 74  ed read the last
190f0 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69  Errno value.** i
19100 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65 74  s set before ret
19110 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
19120 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61  c int seekAndRea
19130 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20  d(unixFile *id, 
19140 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66  sqlite3_int64 of
19150 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66  fset, void *pBuf
19160 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e  , int cnt){.  in
19170 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69  t got;.  int pri
19180 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65  or = 0;.#if (!de
19190 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
191a0 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53 45   && !defined(USE
191b0 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36 34  _PREAD64)).  i64
191c0 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64   newOffset;.#end
191d0 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  if.  TIMER_START
191e0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  ;.  assert( cnt=
191f0 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20 29  =(cnt&0x1ffff) )
19200 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  ;.  assert( id->
19210 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69 66  h>2 );.  do{.#if
19220 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
19230 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
19240 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
19250 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
19260 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
19270 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
19280 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
19290 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
192a0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
192b0 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
192c0 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
192d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
192e0 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
192f0 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
19300 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
19310 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
19320 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
19330 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
19340 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66  t = -1 );.    if
19350 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29 7b  ( newOffset<0 ){
19360 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
19370 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a  Errno((unixFile*
19380 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  )id, errno);.   
19390 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
193a0 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73    }.    got = os
193b0 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66  Read(id->h, pBuf
193c0 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20  , cnt);.#endif. 
193d0 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20     if( got==cnt 
193e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
193f0 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20   got<0 ){.      
19400 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52  if( errno==EINTR
19410 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e   ){ got = 1; con
19420 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70  tinue; }.      p
19430 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  rior = 0;.      
19440 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
19450 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20 65  unixFile*)id,  e
19460 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72 65  rrno);.      bre
19470 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ak;.    }else if
19480 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20  ( got>0 ){.     
19490 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20   cnt -= got;.   
194a0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74     offset += got
194b0 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b 3d  ;.      prior +=
194c0 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75 66   got;.      pBuf
194d0 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b   = (void*)(got +
194e0 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a 20   (char*)pBuf);. 
194f0 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67     }.  }while( g
19500 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f  ot>0 );.  TIMER_
19510 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  END;.  OSTRACE((
19520 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25 35  "READ    %-3d %5
19530 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c  d %7lld %llu\n",
19540 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64 2d  .            id-
19550 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f  >h, got+prior, o
19560 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d  ffset-prior, TIM
19570 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20 20  ER_ELAPSED));.  
19580 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72  return got+prior
19590 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
195a0 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
195b0 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
195c0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
195d0 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
195e0 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
195f0 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
19600 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
19610 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
19620 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
19630 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73  nt unixRead(.  s
19640 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19650 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20   .  void *pBuf, 
19660 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71  .  int amt,.  sq
19670 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
19680 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  et.){.  unixFile
19690 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
196a0 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20  ile *)id;.  int 
196b0 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69  got;.  assert( i
196c0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  d );.  assert( o
196d0 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73  ffset>=0 );.  as
196e0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
196f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19700 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
19710 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
19720 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
19730 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
19740 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
19750 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
19760 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
19770 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
19780 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
19790 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
197a0 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
197b0 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
197c0 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
197d0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
197e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
197f0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20   );.#endif..#if 
19800 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
19810 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c  SIZE>0.  /* Deal
19820 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66   with as much of
19830 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75 65   this read reque
19840 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62  st as possible b
19850 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20  y transfering.  
19860 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  ** data from the
19870 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20   memory mapping 
19880 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20  using memcpy(). 
19890 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74   */.  if( offset
198a0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
198b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73   ){.    if( offs
198c0 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d  et+amt <= pFile-
198d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
198e0 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
198f0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
19900 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
19910 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20  set], amt);.    
19920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19930 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
19940 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
19950 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
19960 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20   - offset;.     
19970 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28   memcpy(pBuf, &(
19980 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
19990 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
199a0 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  t], nCopy);.    
199b0 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a    pBuf = &((u8 *
199c0 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20  )pBuf)[nCopy];. 
199d0 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70       amt -= nCop
199e0 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  y;.      offset 
199f0 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a  += nCopy;.    }.
19a00 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f    }.#endif..  go
19a10 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  t = seekAndRead(
19a20 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70  pFile, offset, p
19a30 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28  Buf, amt);.  if(
19a40 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
19a50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19a60 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67  K;.  }else if( g
19a70 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c  ot<0 ){.    /* l
19a80 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
19a90 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20  seekAndRead */. 
19aa0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19ab0 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d  _IOERR_READ;.  }
19ac0 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c  else{.    storeL
19ad0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
19ae0 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73  0);   /* not a s
19af0 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20  ystem error */. 
19b00 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72     /* Unread par
19b10 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ts of the buffer
19b20 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69   must be zero-fi
19b30 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  lled */.    mems
19b40 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75 66  et(&((char*)pBuf
19b50 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67  )[got], 0, amt-g
19b60 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ot);.    return 
19b70 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
19b80 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a  RT_READ;.  }.}..
19b90 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
19ba0 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64   seek the file-d
19bb0 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65 64  escriptor passed
19bc0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
19bd0 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73  gument to.** abs
19be0 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66  olute offset iOf
19bf0 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  f, then attempt 
19c00 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62 79  to write nBuf by
19c10 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d  tes of data from
19c20 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20  .** pBuf to it. 
19c30 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
19c40 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e  rs, return -1 an
19c50 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20  d set *piErrno. 
19c60 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72  Otherwise, .** r
19c70 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c  eturn the actual
19c80 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
19c90 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68 20   written (which 
19ca0 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e  may be less than
19cb0 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74  .** nBuf)..*/.st
19cc0 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
19cd0 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66  WriteFd(.  int f
19ce0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
19cf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
19d00 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
19d10 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
19d20 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20  64 iOff,        
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d40 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f  * File offset to
19d50 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61   begin writing a
19d60 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  t */.  const voi
19d70 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  d *pBuf,        
19d80 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64         /* Copy d
19d90 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75  ata from this bu
19da0 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65  ffer to the file
19db0 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20   */.  int nBuf, 
19dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
19de0 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e 20   buffer pBuf in 
19df0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  bytes */.  int *
19e00 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20  piErrno         
19e10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
19e20 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20  T: Error number 
19e30 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  if error occurs 
19e40 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
19e50 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19e60 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
19e70 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79 73   returned by sys
19e80 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61  tem call */..  a
19e90 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42  ssert( nBuf==(nB
19ea0 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20  uf&0x1ffff) );. 
19eb0 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b   assert( fd>2 );
19ec0 0a 20 20 61 73 73 65 72 74 28 20 70 69 45 72 72  .  assert( piErr
19ed0 6e 6f 21 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20  no!=0 );.  nBuf 
19ee0 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49  &= 0x1ffff;.  TI
19ef0 4d 45 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20  MER_START;..#if 
19f00 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
19f10 44 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69  D).  do{ rc = (i
19f20 6e 74 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20  nt)osPwrite(fd, 
19f30 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66  pBuf, nBuf, iOff
19f40 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
19f50 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
19f60 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
19f70 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
19f80 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73  do{ rc = (int)os
19f90 50 77 72 69 74 65 36 34 28 66 64 2c 20 70 42 75  Pwrite64(fd, pBu
19fa0 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d  f, nBuf, iOff);}
19fb0 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
19fc0 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65  rrno==EINTR);.#e
19fd0 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36  lse.  do{.    i6
19fe0 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28  4 iSeek = lseek(
19ff0 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53  fd, iOff, SEEK_S
1a000 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  ET);.    Simulat
1a010 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 20  eIOError( iSeek 
1a020 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20  = -1 );.    if( 
1a030 69 53 65 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20  iSeek<0 ){.     
1a040 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1a050 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1a060 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64   rc = osWrite(fd
1a070 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20  , pBuf, nBuf);. 
1a080 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1a090 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1a0a0 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52  .#endif..  TIMER
1a0b0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1a0c0 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
1a0d0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1a0e0 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20  , fd, rc, iOff, 
1a0f0 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b  TIMER_ELAPSED));
1a100 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 29 20 2a  ..  if( rc<0 ) *
1a110 70 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  piErrno = errno;
1a120 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a130 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20  ../*.** Seek to 
1a140 74 68 65 20 6f 66 66 73 65 74 20 69 6e 20 69 64  the offset in id
1a150 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e 20 72 65  ->offset then re
1a160 61 64 20 63 6e 74 20 62 79 74 65 73 20 69 6e 74  ad cnt bytes int
1a170 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72  o pBuf..** Retur
1a180 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1a190 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
1a1a0 65 61 64 2e 20 20 55 70 64 61 74 65 20 74 68 65  ead.  Update the
1a1b0 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54   offset..**.** T
1a1c0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
1a1d0 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
1a1e0 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 77 72 69   on a failed wri
1a1f0 74 65 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  te the lastErrno
1a200 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
1a210 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a220 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1a230 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 75 6e   seekAndWrite(un
1a240 69 78 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  ixFile *id, i64 
1a250 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f  offset, const vo
1a260 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e  id *pBuf, int cn
1a270 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 65 65  t){.  return see
1a280 6b 41 6e 64 57 72 69 74 65 46 64 28 69 64 2d 3e  kAndWriteFd(id->
1a290 68 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c  h, offset, pBuf,
1a2a0 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45   cnt, &id->lastE
1a2b0 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rrno);.}.../*.**
1a2c0 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f 6d   Write data from
1a2d0 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20 61   a buffer into a
1a2e0 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 53   file.  Return S
1a2f0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
1a300 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ess.** or some o
1a310 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
1a320 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73  on failure..*/.s
1a330 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 57 72  tatic int unixWr
1a340 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
1a350 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73  ile *id, .  cons
1a360 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20  t void *pBuf, . 
1a370 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
1a380 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
1a390 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20   .){.  unixFile 
1a3a0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1a3b0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 77 72  le*)id;.  int wr
1a3c0 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  ote = 0;.  asser
1a3d0 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65 72  t( id );.  asser
1a3e0 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
1a3f0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
1a400 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
1a410 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
1a420 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
1a430 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
1a440 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
1a450 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
1a460 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
1a470 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
1a480 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
1a490 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
1a4a0 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1a4b0 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1a4c0 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1a4d0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1a4e0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1a4f0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
1a500 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1a510 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
1a520 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
1a530 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
1a540 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
1a550 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  to.  ** doing a 
1a560 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1a570 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
1a580 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
1a590 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a 20 6e  er than a.  ** n
1a5a0 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66  ormal database f
1a5b0 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f 72 64  ile) then record
1a5c0 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
1a5d0 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
1a5e0 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 49   has changed.  I
1a5f0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1a600 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d 6f 64  n counter is mod
1a610 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20 74 68  ified, record th
1a620 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74 6f 6f  at.  ** fact too
1a630 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
1a640 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1a650 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  e ){.    pFile->
1a660 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20 20 2f  dbUpdate = 1;  /
1a670 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 68  * The database h
1a680 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
1a690 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66 66 73   */.    if( offs
1a6a0 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73 65 74  et<=24 && offset
1a6b0 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20 20 20  +amt>=27 ){.    
1a6c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
1a6d0 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b  char oldCntr[4];
1a6e0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1a6f0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1a700 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65 65 6b  .      rc = seek
1a710 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 32  AndRead(pFile, 2
1a720 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29 3b 0a  4, oldCntr, 4);.
1a730 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1a740 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1a750 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 34 20        if( rc!=4 
1a760 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43 6e 74  || memcmp(oldCnt
1a770 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42 75 66  r, &((char*)pBuf
1a780 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20 34 29  )[24-offset], 4)
1a790 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=0 ){.        p
1a7a0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
1a7b0 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65  hng = 1;  /* The
1a7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
1a7d0 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67 65 64  nter has changed
1a7e0 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
1a7f0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  }.  }.#endif..#i
1a800 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1a810 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 29  _MMAP_READWRITE)
1a820 20 26 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   && SQLITE_MAX_M
1a830 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20  MAP_SIZE>0.  /* 
1a840 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75 63  Deal with as muc
1a850 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65 20  h of this write 
1a860 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1a870 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1a880 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1a890 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1a8a0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1a8b0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1a8c0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1a8d0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1a8e0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1a8f0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1a900 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
1a910 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1a920 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1a930 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  et], pBuf, amt);
1a940 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1a950 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1a960 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1a970 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1a980 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1a990 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28 28        memcpy(&((
1a9a0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1a9b0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1a9c0 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29 3b  ], pBuf, nCopy);
1a9d0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1a9e0 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1a9f0 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1aa00 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1aa10 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1aa20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1aa30 20 0a 20 20 77 68 69 6c 65 28 20 28 77 72 6f 74   .  while( (wrot
1aa40 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65  e = seekAndWrite
1aa50 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1aa60 70 42 75 66 2c 20 61 6d 74 29 29 3c 61 6d 74 20  pBuf, amt))<amt 
1aa70 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20  && wrote>0 ){.  
1aa80 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
1aa90 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72      offset += wr
1aaa0 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
1aab0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
1aac0 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d  rote];.  }.  Sim
1aad0 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77  ulateIOError(( w
1aae0 72 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31  rote=(-1), amt=1
1aaf0 20 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44   ));.  SimulateD
1ab00 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77  iskfullError(( w
1ab10 72 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29  rote=0, amt=1 ))
1ab20 3b 0a 0a 20 20 69 66 28 20 61 6d 74 3e 77 72 6f  ;..  if( amt>wro
1ab30 74 65 20 29 7b 0a 20 20 20 20 69 66 28 20 77 72  te ){.    if( wr
1ab40 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d 3e  ote<0 && pFile->
1ab50 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53 50  lastErrno!=ENOSP
1ab60 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c 61  C ){.      /* la
1ab70 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73  stErrno set by s
1ab80 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a 20  eekAndWrite */. 
1ab90 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1aba0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
1abb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1abc0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1abd0 70 46 69 6c 65 2c 20 30 29 3b 20 2f 2a 20 6e 6f  pFile, 0); /* no
1abe0 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1abf0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1ac00 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
1ac10 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1ac20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ac30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
1ac40 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74  ST./*.** Count t
1ac50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c  he number of ful
1ac60 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61  lsyncs and norma
1ac70 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69  l syncs.  This i
1ac80 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a  s used to test.*
1ac90 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64  * that syncs and
1aca0 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f   fullsyncs are o
1acb0 63 63 75 72 72 69 6e 67 20 61 74 20 74 68 65 20  ccurring at the 
1acc0 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a  right times..*/.
1acd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63  int sqlite3_sync
1ace0 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20  _count = 0;.int 
1acf0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1ad00 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  _count = 0;.#end
1ad10 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64 6f 20  if../*.** We do 
1ad20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74 65 6d  not trust system
1ad30 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 77  s to provide a w
1ad40 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79 6e 63  orking fdatasync
1ad50 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a 2a 2a  ().  Some do..**
1ad60 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e 20 20   Others do no.  
1ad70 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65 20 77  To be safe, we w
1ad80 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68 20 74  ill stick with t
1ad90 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73 6c 6f  he (slightly slo
1ada0 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28 29 2e  wer).** fsync().
1adb0 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74 68 61   If you know tha
1adc0 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20 64 6f  t your system do
1add0 65 73 20 73 75 70 70 6f 72 74 20 66 64 61 74 61  es support fdata
1ade0 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74 6c 79  sync() correctly
1adf0 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70 6c 79  ,.** then simply
1ae00 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 2d 44   compile with -D
1ae10 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74 61 73  fdatasync=fdatas
1ae20 79 6e 63 20 6f 72 20 2d 44 48 41 56 45 5f 46 44  ync or -DHAVE_FD
1ae30 41 54 41 53 59 4e 43 0a 2a 2f 0a 23 69 66 20 21  ATASYNC.*/.#if !
1ae40 64 65 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e  defined(fdatasyn
1ae50 63 29 20 26 26 20 21 48 41 56 45 5f 46 44 41 54  c) && !HAVE_FDAT
1ae60 41 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 66  ASYNC.# define f
1ae70 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a 23  datasync fsync.#
1ae80 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  endif../*.** Def
1ae90 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59  ine HAVE_FULLFSY
1aea0 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65 70  NC to 0 or 1 dep
1aeb0 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
1aec0 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65 20  r or not.** the 
1aed0 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63 72  F_FULLFSYNC macr
1aee0 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20 46  o is defined.  F
1aef0 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63 75  _FULLFSYNC is cu
1af00 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79 20  rrently.** only 
1af10 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
1af20 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61 74   OS X.  But that
1af30 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a 2a   could change..*
1af40 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c 46  /.#ifdef F_FULLF
1af50 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48 41  SYNC.# define HA
1af60 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a 23  VE_FULLFSYNC 1.#
1af70 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48 41  else.# define HA
1af80 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a 23  VE_FULLFSYNC 0.#
1af90 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  endif.../*.** Th
1afa0 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
1afb0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
1afc0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
1afd0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
1afe0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
1aff0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
1b000 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
1b010 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
1b020 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
1b030 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
1b040 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
1b050 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
1b060 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
1b070 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
1b080 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
1b090 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
1b0a0 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
1b0b0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
1b0c0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
1b0d0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
1b0e0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
1b0f0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
1b100 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
1b110 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1b120 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
1b130 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
1b140 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
1b150 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
1b160 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1b170 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
1b180 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
1b190 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
1b1a0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1b1b0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1b1c0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
1b1d0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
1b1e0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
1b1f0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
1b200 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
1b210 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
1b220 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
1b230 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
1b240 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
1b250 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
1b260 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
1b270 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
1b280 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
1b290 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
1b2a0 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
1b2b0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
1b2c0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
1b2d0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
1b2e0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
1b2f0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
1b300 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1b310 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
1b320 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
1b330 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
1b340 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1b350 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
1b360 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
1b370 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
1b380 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
1b390 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
1b3a0 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
1b3b0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
1b3c0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1b3d0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
1b3e0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
1b3f0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
1b400 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
1b410 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
1b420 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
1b430 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
1b440 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
1b450 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
1b460 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
1b470 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
1b480 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
1b490 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
1b4a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
1b4b0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
1b4c0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
1b4d0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
1b4e0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
1b4f0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
1b500 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
1b510 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
1b520 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
1b530 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
1b540 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
1b550 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
1b560 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
1b570 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
1b580 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
1b590 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
1b5a0 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
1b5b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1b5c0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
1b5d0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1b5e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1b5f0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1b600 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1b610 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
1b620 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1b630 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1b640 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1b650 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
1b660 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1b670 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1b680 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1b690 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
1b6a0 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
1b6b0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
1b6c0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
1b6d0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
1b6e0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
1b6f0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
1b700 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
1b710 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
1b720 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
1b730 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
1b740 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
1b750 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1b760 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1b770 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
1b780 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1b790 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
1b7a0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
1b7b0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
1b7c0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
1b7d0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1b7e0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1b7f0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1b800 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
1b810 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1b820 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b830 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1b840 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
1b850 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
1b860 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55  osFcntl(fd, F_FU
1b870 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 20 20 7d  LLFSYNC, 0);.  }
1b880 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1b890 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
1b8a0 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
1b8b0 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
1b8c0 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
1b8d0 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
1b8e0 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
1b8f0 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
1b900 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
1b910 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
1b920 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
1b930 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
1b940 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
1b950 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
1b960 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
1b970 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
1b980 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
1b990 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
1b9a0 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
1b9b0 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
1b9c0 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
1b9d0 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
1b9e0 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
1b9f0 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
1ba00 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
1ba10 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
1ba20 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
1ba30 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
1ba40 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
1ba50 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
1ba60 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
1ba70 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
1ba80 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
1ba90 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
1baa0 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
1bab0 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
1bac0 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
1bad0 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
1bae0 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
1baf0 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
1bb00 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
1bb10 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
1bb20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
1bb30 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
1bb40 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
1bb50 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
1bb60 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
1bb70 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
1bb80 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
1bb90 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
1bba0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
1bbb0 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
1bbc0 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
1bbd0 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
1bbe0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
1bbf0 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
1bc00 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
1bc10 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
1bc20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1bc30 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
1bc40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1bc50 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1bc60 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a  ontaining file z
1bc70 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20  Filename..** If 
1bc80 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64  successful, *pFd
1bc90 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1bca0 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72  pened file descr
1bcb0 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c  iptor and.** SQL
1bcc0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1bcd0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
1bce0 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53  occurs, either S
1bcf0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f  QLITE_NOMEM.** o
1bd00 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r SQLITE_CANTOPE
1bd10 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  N is returned an
1bd20 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  d *pFd is set to
1bd30 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   an undefined.**
1bd40 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1bd50 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
1bd60 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75   descriptor is u
1bd70 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65  sed for only one
1bd80 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66   thing - to.** f
1bd90 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f  sync() a directo
1bda0 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ry to make sure 
1bdb0 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e  file creation an
1bdc0 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74  d deletion event
1bdd0 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64  s.** are flushed
1bde0 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20   to disk.  Such 
1bdf0 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e  fsyncs are not n
1be00 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a  eeded on newer.*
1be10 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c  * journaling fil
1be20 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72  esystems, but ar
1be30 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c  e required on ol
1be40 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  der filesystems.
1be50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1be60 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72  ine can be overr
1be70 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20  idden using the 
1be80 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65  xSetSysCall inte
1be90 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62  rface..** The ab
1bea0 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64  ility to overrid
1beb0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1bec0 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70  as added in supp
1bed0 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ort of the.** ch
1bee0 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20  romium sandbox. 
1bef0 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63   Opening a direc
1bf00 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69  tory is a securi
1bf10 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a  ty risk (we are.
1bf20 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69  ** told) so maki
1bf30 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62  ng it overrideab
1bf40 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68  le allows the ch
1bf50 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74  romium sandbox t
1bf60 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69  o.** replace thi
1bf70 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
1bf80 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
1bf90 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72    To make this r
1bfa0 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f  outine.** a no-o
1bfb0 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  p, replace it wi
1bfc0 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72  th a stub that r
1bfd0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1bfe0 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   but leaves.** *
1bff0 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67  pFd set to a neg
1c000 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  ative number..**
1c010 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1c020 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1c030 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1c040 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
1c050 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
1c060 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
1c070 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
1c080 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
1c090 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
1c0a0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1c0b0 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
1c0c0 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
1c0d0 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
1c0e0 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
1c0f0 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
1c100 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1c110 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
1c120 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
1c130 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
1c140 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
1c150 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
1c160 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
1c170 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
1c180 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
1c190 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
1c1a0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
1c1b0 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1c1c0 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1c1d0 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
1c1e0 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  0 ){.      OSTRA
1c1f0 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE(("OPENDIR %-3
1c200 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1c210 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  rname));.    }. 
1c220 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1c230 20 20 69 66 28 20 66 64 3e 3d 30 20 29 20 72 65    if( fd>=0 ) re
1c240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1c250 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
1c260 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
1c270 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
1c280 6e 44 69 72 65 63 74 6f 72 79 22 2c 20 7a 44 69  nDirectory", zDi
1c290 72 6e 61 6d 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rname);.}../*.**
1c2a0 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
1c2b0 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
1c2c0 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
1c2d0 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
1c2e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f  ..**.** If dataO
1c2f0 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68  nly==0 then both
1c300 20 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66   the file itself
1c310 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74   and its metadat
1c320 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c  a (file.** size,
1c330 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74   access time, et
1c340 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20  c) are synced.  
1c350 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74  If dataOnly!=0 t
1c360 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20  hen only the.** 
1c370 66 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e  file data is syn
1c380 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  ced..**.** Under
1c390 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
1c3a0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
1c3b0 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
1c3c0 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
1c3d0 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
1c3e0 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
1c3f0 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
1c400 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
1c410 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
1c420 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
1c430 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
1c440 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
1c450 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
1c460 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
1c470 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
1c480 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
1c490 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
1c4a0 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
1c4b0 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
1c4c0 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
1c4d0 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
1c4e0 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
1c4f0 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
1c500 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
1c510 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
1c520 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
1c530 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
1c540 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
1c550 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
1c560 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
1c570 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  rruption..*/.sta
1c580 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63  tic int unixSync
1c590 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
1c5a0 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  d, int flags){. 
1c5b0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46   int rc;.  unixF
1c5c0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
1c5d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69  ixFile*)id;..  i
1c5e0 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20  nt isDataOnly = 
1c5f0 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59  (flags&SQLITE_SY
1c600 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20  NC_DATAONLY);.  
1c610 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d  int isFullsync =
1c620 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1c630 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b  QLITE_SYNC_FULL;
1c640 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
1c650 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  t one of SQLITE_
1c660 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46  SYNC_NORMAL or F
1c670 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a  ULL was passed *
1c680 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67  /.  assert((flag
1c690 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
1c6a0 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20  SYNC_NORMAL.    
1c6b0 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46    || (flags&0x0F
1c6c0 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  )==SQLITE_SYNC_F
1c6d0 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55  ULL.  );..  /* U
1c6e0 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20  nix cannot, but 
1c6f0 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79  some systems may
1c700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1c710 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54  ULL from here. T
1c720 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73  his.  ** line is
1c730 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f   to test that do
1c740 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20  ing so does not 
1c750 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65  cause any proble
1c760 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c  ms..  */.  Simul
1c770 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72  ateDiskfullError
1c780 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
1c790 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72  FULL );..  asser
1c7a0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
1c7b0 54 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20  TRACE(("SYNC    
1c7c0 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
1c7d0 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c  h));.  rc = full
1c7e0 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c  _fsync(pFile->h,
1c7f0 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44   isFullsync, isD
1c800 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75  ataOnly);.  Simu
1c810 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
1c820 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  1 );.  if( rc ){
1c830 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
1c840 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
1c850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
1c860 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
1c870 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c 20 22  E_IOERR_FSYNC, "
1c880 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70 46 69  full_fsync", pFi
1c890 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 0a  le->zPath);.  }.
1c8a0 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79 6e 63  .  /* Also fsync
1c8b0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1c8c0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 66 69  ontaining the fi
1c8d0 6c 65 20 69 66 20 74 68 65 20 44 49 52 53 59 4e  le if the DIRSYN
1c8e0 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 73  C flag.  ** is s
1c8f0 65 74 2e 20 20 54 68 69 73 20 69 73 20 61 20 6f  et.  This is a o
1c900 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72 65 6e  ne-time occurren
1c910 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74 65 6d  ce.  Many system
1c920 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41 49 58  s (examples: AIX
1c930 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61 62 6c  ).  ** are unabl
1c940 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64 69 72  e to fsync a dir
1c950 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e 6f 72  ectory, so ignor
1c960 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68 65 20  e errors on the 
1c970 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20 69 66  fsync..  */.  if
1c980 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
1c990 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 49  gs & UNIXFILE_DI
1c9a0 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69 6e 74  RSYNC ){.    int
1c9b0 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53 54 52   dirfd;.    OSTR
1c9c0 41 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 73  ACE(("DIRSYNC %s
1c9d0 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e 63   (have_fullfsync
1c9e0 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64 29  =%d fullsync=%d)
1c9f0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  \n", pFile->zPat
1ca00 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 48  h,.            H
1ca10 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 69  AVE_FULLFSYNC, i
1ca20 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20 20 20  sFullsync));.   
1ca30 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65   rc = osOpenDire
1ca40 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a 50 61  ctory(pFile->zPa
1ca50 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20 20  th, &dirfd);.   
1ca60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ca70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c  OK ){.      full
1ca80 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c  _fsync(dirfd, 0,
1ca90 20 30 29 3b 0a 20 20 20 20 20 20 72 6f 62 75 73   0);.      robus
1caa0 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
1cab0 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
1cac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1cad0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
1cae0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b  LITE_CANTOPEN );
1caf0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
1cb00 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
1cb10 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
1cb20 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f 44  s &= ~UNIXFILE_D
1cb30 49 52 53 59 4e 43 3b 0a 20 20 7d 0a 20 20 72 65  IRSYNC;.  }.  re
1cb40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1cb50 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70  * Truncate an op
1cb60 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65  en file to a spe
1cb70 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73  cified size.*/.s
1cb80 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72  tatic int unixTr
1cb90 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
1cba0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e 42 79  ile *id, i64 nBy
1cbb0 74 65 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  te){.  unixFile 
1cbc0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1cbd0 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72  le *)id;.  int r
1cbe0 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  c;.  assert( pFi
1cbf0 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  le );.  Simulate
1cc00 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
1cc10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
1cc20 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  NCATE );..  /* I
1cc30 66 20 74 68 65 20 75 73 65 72 20 68 61 73 20 63  f the user has c
1cc40 6f 6e 66 69 67 75 72 65 64 20 61 20 63 68 75 6e  onfigured a chun
1cc50 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  k-size for this 
1cc60 66 69 6c 65 2c 20 74 72 75 6e 63 61 74 65 20 74  file, truncate t
1cc70 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20  he.  ** file so 
1cc80 74 68 61 74 20 69 74 20 63 6f 6e 73 69 73 74 73  that it consists
1cc90 20 6f 66 20 61 6e 20 69 6e 74 65 67 65 72 20 6e   of an integer n
1cca0 75 6d 62 65 72 20 6f 66 20 63 68 75 6e 6b 73 20  umber of chunks 
1ccb0 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61  (i.e. the.  ** a
1ccc0 63 74 75 61 6c 20 66 69 6c 65 20 73 69 7a 65 20  ctual file size 
1ccd0 61 66 74 65 72 20 74 68 65 20 6f 70 65 72 61 74  after the operat
1cce0 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61 72 67 65  ion may be large
1ccf0 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1cd00 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e  sted.  ** size).
1cd10 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
1cd20 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
1cd30 20 20 20 20 6e 42 79 74 65 20 3d 20 28 28 6e 42      nByte = ((nB
1cd40 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43  yte + pFile->szC
1cd50 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d  hunk - 1)/pFile-
1cd60 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c  >szChunk) * pFil
1cd70 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a  e->szChunk;.  }.
1cd80 0a 20 20 72 63 20 3d 20 72 6f 62 75 73 74 5f 66  .  rc = robust_f
1cd90 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e  truncate(pFile->
1cda0 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  h, nByte);.  if(
1cdb0 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
1cdc0 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1cdd0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
1cde0 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
1cdf0 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52  (SQLITE_IOERR_TR
1ce00 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e 63 61  UNCATE, "ftrunca
1ce10 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  te", pFile->zPat
1ce20 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66  h);.  }else{.#if
1ce30 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1ce40 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 61 72  .    /* If we ar
1ce50 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1ce60 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1ce70 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1ce80 70 6f 73 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  posed to.    ** 
1ce90 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1cea0 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1ceb0 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1cec0 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1ced0 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20  a.    ** normal 
1cee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 61  database file) a
1cef0 6e 64 20 77 65 20 74 72 75 6e 63 61 74 65 20 74  nd we truncate t
1cf00 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
1cf10 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a 2a 20 74  length,.    ** t
1cf20 68 61 74 20 65 66 66 65 63 74 69 76 65 6c 79 20  hat effectively 
1cf30 75 70 64 61 74 65 73 20 74 68 65 20 63 68 61 6e  updates the chan
1cf40 67 65 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ge counter.  Thi
1cf50 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 0a 20  s might happen. 
1cf60 20 20 20 2a 2a 20 77 68 65 6e 20 72 65 73 74 6f     ** when resto
1cf70 72 69 6e 67 20 61 20 64 61 74 61 62 61 73 65 20  ring a database 
1cf80 75 73 69 6e 67 20 74 68 65 20 62 61 63 6b 75 70  using the backup
1cf90 20 41 50 49 20 66 72 6f 6d 20 61 20 7a 65 72 6f   API from a zero
1cfa0 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a 2a 20 73  -length.    ** s
1cfb0 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ource..    */.  
1cfc0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1cfd0 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20 6e 42  ormalWrite && nB
1cfe0 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  yte==0 ){.      
1cff0 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
1d000 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Chng = 1;.    }.
1d010 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1d020 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1d030 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  >0.    /* If the
1d040 20 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 74   file was just t
1d050 72 75 6e 63 61 74 65 64 20 74 6f 20 61 20 73 69  runcated to a si
1d060 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  ze smaller than 
1d070 74 68 65 20 63 75 72 72 65 6e 74 6c 79 0a 20 20  the currently.  
1d080 20 20 2a 2a 20 6d 61 70 70 65 64 20 72 65 67 69    ** mapped regi
1d090 6f 6e 2c 20 72 65 64 75 63 65 20 74 68 65 20 65  on, reduce the e
1d0a0 66 66 65 63 74 69 76 65 20 6d 61 70 70 69 6e 67  ffective mapping
1d0b0 20 73 69 7a 65 20 61 73 20 77 65 6c 6c 2e 20 53   size as well. S
1d0c0 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20 20 20 2a  QLite will.    *
1d0d0 2a 20 75 73 65 20 72 65 61 64 28 29 20 61 6e 64  * use read() and
1d0e0 20 77 72 69 74 65 28 29 20 74 6f 20 61 63 63 65   write() to acce
1d0f0 73 73 20 64 61 74 61 20 62 65 79 6f 6e 64 20 74  ss data beyond t
1d100 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20 6e  his point from n
1d110 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20 2a 2f 0a  ow on.  .    */.
1d120 20 20 20 20 69 66 28 20 6e 42 79 74 65 3c 70 46      if( nByte<pF
1d130 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1d140 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d  .      pFile->mm
1d150 61 70 53 69 7a 65 20 3d 20 6e 42 79 74 65 3b 0a  apSize = nByte;.
1d160 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1d170 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d180 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
1d190 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63   Determine the c
1d1a0 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61  urrent size of a
1d1b0 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a   file in bytes.*
1d1c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d1d0 78 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65  xFileSize(sqlite
1d1e0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
1d1f0 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72  *pSize){.  int r
1d200 63 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  c;.  struct stat
1d210 20 62 75 66 3b 0a 20 20 61 73 73 65 72 74 28 20   buf;.  assert( 
1d220 69 64 20 29 3b 0a 20 20 72 63 20 3d 20 6f 73 46  id );.  rc = osF
1d230 73 74 61 74 28 28 28 75 6e 69 78 46 69 6c 65 2a  stat(((unixFile*
1d240 29 69 64 29 2d 3e 68 2c 20 26 62 75 66 29 3b 0a  )id)->h, &buf);.
1d250 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1d260 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
1d270 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
1d280 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1d290 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1d2a0 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  o);.    return S
1d2b0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
1d2c0 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20  T;.  }.  *pSize 
1d2d0 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 0a  = buf.st_size;..
1d2e0 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e    /* When openin
1d2f0 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20 64 61  g a zero-size da
1d300 74 61 62 61 73 65 2c 20 74 68 65 20 66 69 6e 64  tabase, the find
1d310 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72 6f 63  InodeInfo() proc
1d320 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69 74 65  edure.  ** write
1d330 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  s a single byte 
1d340 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65 20 69  into that file i
1d350 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72 6b 20  n order to work 
1d360 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20 20 2a  around a bug.  *
1d370 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20 6d 73  * in the OS-X ms
1d380 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d 2e 20  dos filesystem. 
1d390 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f   In order to avo
1d3a0 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  id problems with
1d3b0 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61 79 65   upper.  ** laye
1d3c0 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  rs, we need to r
1d3d0 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c 65 20  eport this file 
1d3e0 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65 76 65  size as zero eve
1d3f0 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73 0a 20  n though it is. 
1d400 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20 20 20   ** really 1.   
1d410 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a 20 20  Ticket #3260..  
1d420 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a 65 3d  */.  if( *pSize=
1d430 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20 30 3b  =1 ) *pSize = 0;
1d440 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ...  return SQLI
1d450 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  TE_OK;.}..#if SQ
1d460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1d470 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
1d480 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
1d490 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20 66 6f  /*.** Handler fo
1d4a0 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20  r proxy-locking 
1d4b0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76 65 72  file-control ver
1d4c0 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62 65 6c  bs.  Defined bel
1d4d0 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70 72 6f  ow in the.** pro
1d4e0 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 64 69  xying locking di
1d4f0 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  vision..*/.stati
1d500 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c 65 43  c int proxyFileC
1d510 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
1d520 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a 29 3b  ile*,int,void*);
1d530 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a 2a 2a 20  .#endif../* .** 
1d540 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1d550 20 63 61 6c 6c 65 64 20 74 6f 20 68 61 6e 64 6c   called to handl
1d560 65 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  e the SQLITE_FCN
1d570 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20 0a 2a 2a  TL_SIZE_HINT .**
1d580 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6f 70   file-control op
1d590 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c 61 72 67  eration.  Enlarg
1d5a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
1d5b0 6f 20 6e 42 79 74 65 73 20 69 6e 20 73 69 7a 65  o nBytes in size
1d5c0 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20 75 70 20  .** (rounded up 
1d5d0 74 6f 20 74 68 65 20 6e 65 78 74 20 63 68 75 6e  to the next chun
1d5e0 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20 74 68 65  k-size).  If the
1d5f0 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
1d600 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65 73 20 6f  eady.** nBytes o
1d610 72 20 6c 61 72 67 65 72 2c 20 74 68 69 73 20 72  r larger, this r
1d620 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1d630 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1d640 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 75   fcntlSizeHint(u
1d650 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
1d660 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 66  i64 nByte){.  if
1d670 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  ( pFile->szChunk
1d680 3e 30 20 29 7b 0a 20 20 20 20 69 36 34 20 6e 53  >0 ){.    i64 nS
1d690 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1d6a0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
1d6b0 72 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f  red file size */
1d6c0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
1d6d0 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
1d6e0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 68 6f     /* Used to ho
1d6f0 6c 64 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73  ld return values
1d700 20 6f 66 20 66 73 74 61 74 28 29 20 2a 2f 0a 20   of fstat() */. 
1d710 20 20 0a 20 20 20 20 69 66 28 20 6f 73 46 73 74    .    if( osFst
1d720 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
1d730 66 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  f) ){.      retu
1d740 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
1d750 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  FSTAT;.    }..  
1d760 20 20 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74    nSize = ((nByt
1d770 65 2b 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  e+pFile->szChunk
1d780 2d 31 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43  -1) / pFile->szC
1d790 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73  hunk) * pFile->s
1d7a0 7a 43 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20  zChunk;.    if( 
1d7b0 6e 53 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73  nSize>(i64)buf.s
1d7c0 74 5f 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64  t_size ){..#if d
1d7d0 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49  efined(HAVE_POSI
1d7e0 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20  X_FALLOCATE) && 
1d7f0 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f  HAVE_POSIX_FALLO
1d800 43 41 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68  CATE.      /* Th
1d810 65 20 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20  e code below is 
1d820 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74  handling the ret
1d830 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46  urn value of osF
1d840 61 6c 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20  allocate() .    
1d850 20 20 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20    ** correctly. 
1d860 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28  posix_fallocate(
1d870 29 20 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20  ) is defined to 
1d880 22 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e  "returns zero on
1d890 20 73 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20   success, .     
1d8a0 20 2a 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20   ** or an error 
1d8b0 6e 75 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75  number on  failu
1d8c0 72 65 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e  re". See the man
1d8d0 70 61 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73  page for details
1d8e0 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  . */.      int e
1d8f0 72 72 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20  rr;.      do{.  
1d900 20 20 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61        err = osFa
1d910 6c 6c 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  llocate(pFile->h
1d920 2c 20 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e  , buf.st_size, n
1d930 53 69 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65  Size-buf.st_size
1d940 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
1d950 20 65 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20   err==EINTR );. 
1d960 20 20 20 20 20 69 66 28 20 65 72 72 20 29 20 72       if( err ) r
1d970 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d980 52 52 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a  RR_WRITE;.#else.
1d990 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
1d9a0 4f 53 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  OS does not have
1d9b0 20 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65   posix_fallocate
1d9c0 28 29 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69  (), fake it. Wri
1d9d0 74 65 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73  te a .      ** s
1d9e0 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68  ingle byte to th
1d9f0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
1da00 61 63 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66  ach block that f
1da10 61 6c 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20  alls entirely.  
1da20 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
1da30 65 20 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f  e extended regio
1da40 6e 2e 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75  n. Then, if requ
1da50 69 72 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62  ired, a single b
1da60 79 74 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20  yte.      ** at 
1da70 6f 66 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29  offset (nSize-1)
1da80 2c 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a  , to set the siz
1da90 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f  e of the file co
1daa0 72 72 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a  rrectly..      *
1dab0 2a 20 54 68 69 73 20 69 73 20 61 20 73 69 6d 69  * This is a simi
1dac0 6c 61 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f  lar technique to
1dad0 20 74 68 61 74 20 75 73 65 64 20 62 79 20 67 6c   that used by gl
1dae0 69 62 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20  ibc on systems. 
1daf0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20       ** that do 
1db00 6e 6f 74 20 68 61 76 65 20 61 20 72 65 61 6c 20  not have a real 
1db10 66 61 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c  fallocate() call
1db20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1db30 20 69 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e   int nBlk = buf.
1db40 73 74 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20  st_blksize;  /* 
1db50 46 69 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63  File-system bloc
1db60 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  k size */.      
1db70 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20  int nWrite = 0; 
1db80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1db90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1dba0 72 69 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e  ritten by seekAn
1dbb0 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1dbc0 69 36 34 20 69 57 72 69 74 65 3b 20 20 20 20 20  i64 iWrite;     
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1dbe0 65 78 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72  ext offset to wr
1dbf0 69 74 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20  ite to */..     
1dc00 20 69 57 72 69 74 65 20 3d 20 28 28 62 75 66 2e   iWrite = ((buf.
1dc10 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e 42 6c 6b  st_size + 2*nBlk
1dc20 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b   - 1)/nBlk)*nBlk
1dc30 2d 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  -1;.      assert
1dc40 28 20 69 57 72 69 74 65 3e 3d 62 75 66 2e 73 74  ( iWrite>=buf.st
1dc50 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 61  _size );.      a
1dc60 73 73 65 72 74 28 20 28 69 57 72 69 74 65 2f 6e  ssert( (iWrite/n
1dc70 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73 74 5f 73  Blk)==((buf.st_s
1dc80 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e 42 6c 6b  ize+nBlk-1)/nBlk
1dc90 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1dca0 74 28 20 28 28 69 57 72 69 74 65 2b 31 29 25 6e  t( ((iWrite+1)%n
1dcb0 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Blk)==0 );.     
1dcc0 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a 2f 3b 20   for(/*no-op*/; 
1dcd0 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b 20 69 57  iWrite<nSize; iW
1dce0 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20 20  rite+=nBlk ){.  
1dcf0 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73        nWrite = s
1dd00 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c  eekAndWrite(pFil
1dd10 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20 31  e, iWrite, "", 1
1dd20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1dd30 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72  Write!=1 ) retur
1dd40 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
1dd50 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RITE;.      }.  
1dd60 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 3d 3d      if( nWrite==
1dd70 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e 42 6c 6b  0 || (nSize%nBlk
1dd80 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57 72  ) ){.        nWr
1dd90 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
1dda0 74 65 28 70 46 69 6c 65 2c 20 6e 53 69 7a 65 2d  te(pFile, nSize-
1ddb0 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20  1, "", 1);.     
1ddc0 20 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31     if( nWrite!=1
1ddd0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1dde0 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20  _IOERR_WRITE;.  
1ddf0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1de00 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49   }.  }..#if SQLI
1de10 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1de20 3e 30 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  >0.  if( pFile->
1de30 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 26 26  mmapSizeMax>0 &&
1de40 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d   nByte>pFile->mm
1de50 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e  apSize ){.    in
1de60 74 20 72 63 3b 0a 20 20 20 20 69 66 28 20 70 46  t rc;.    if( pF
1de70 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20  ile->szChunk<=0 
1de80 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62  ){.      if( rob
1de90 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46  ust_ftruncate(pF
1dea0 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29  ile->h, nByte) )
1deb0 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
1dec0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1ded0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
1dee0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
1def0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
1df00 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
1df10 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
1df20 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Path);.      }. 
1df30 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75     }..    rc = u
1df40 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1df50 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65  , nByte);.    re
1df60 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
1df70 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  dif..  return SQ
1df80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1df90 2a 20 49 66 20 2a 70 41 72 67 20 69 73 20 69 6e  * If *pArg is in
1dfa0 69 74 69 61 6c 6c 79 20 6e 65 67 61 74 69 76 65  itially negative
1dfb0 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 61 20   then this is a 
1dfc0 71 75 65 72 79 2e 20 20 53 65 74 20 2a 70 41 72  query.  Set *pAr
1dfd0 67 20 74 6f 0a 2a 2a 20 31 20 6f 72 20 30 20 64  g to.** 1 or 0 d
1dfe0 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74  epending on whet
1dff0 68 65 72 20 6f 72 20 6e 6f 74 20 62 69 74 20 6d  her or not bit m
1e000 61 73 6b 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  ask of pFile->ct
1e010 72 6c 46 6c 61 67 73 20 69 73 20 73 65 74 2e 0a  rlFlags is set..
1e020 2a 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20 69  **.** If *pArg i
1e030 73 20 30 20 6f 72 20 31 2c 20 74 68 65 6e 20 63  s 0 or 1, then c
1e040 6c 65 61 72 20 6f 72 20 73 65 74 20 74 68 65 20  lear or set the 
1e050 6d 61 73 6b 20 62 69 74 20 6f 66 20 70 46 69 6c  mask bit of pFil
1e060 65 2d 3e 63 74 72 6c 46 6c 61 67 73 2e 0a 2a 2f  e->ctrlFlags..*/
1e070 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
1e080 78 4d 6f 64 65 42 69 74 28 75 6e 69 78 46 69 6c  xModeBit(unixFil
1e090 65 20 2a 70 46 69 6c 65 2c 20 75 6e 73 69 67 6e  e *pFile, unsign
1e0a0 65 64 20 63 68 61 72 20 6d 61 73 6b 2c 20 69 6e  ed char mask, in
1e0b0 74 20 2a 70 41 72 67 29 7b 0a 20 20 69 66 28 20  t *pArg){.  if( 
1e0c0 2a 70 41 72 67 3c 30 20 29 7b 0a 20 20 20 20 2a  *pArg<0 ){.    *
1e0d0 70 41 72 67 20 3d 20 28 70 46 69 6c 65 2d 3e 63  pArg = (pFile->c
1e0e0 74 72 6c 46 6c 61 67 73 20 26 20 6d 61 73 6b 29  trlFlags & mask)
1e0f0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  !=0;.  }else if(
1e100 20 28 2a 70 41 72 67 29 3d 3d 30 20 29 7b 0a 20   (*pArg)==0 ){. 
1e110 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
1e120 61 67 73 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20  ags &= ~mask;.  
1e130 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
1e140 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 6d  ->ctrlFlags |= m
1e150 61 73 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 46  ask;.  }.}../* F
1e160 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
1e170 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on */.static int
1e180 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65   unixGetTempname
1e190 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20  (int nBuf, char 
1e1a0 2a 7a 42 75 66 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49  *zBuf);../*.** I
1e1b0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e 64 20 63  nformation and c
1e1c0 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20 6f 70 65  ontrol of an ope
1e1d0 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a  n file handle..*
1e1e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1e1f0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  xFileControl(sql
1e200 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1e210 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
1e220 67 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  g){.  unixFile *
1e230 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
1e240 65 2a 29 69 64 3b 0a 20 20 73 77 69 74 63 68 28  e*)id;.  switch(
1e250 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
1e260 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 41 4c  SQLITE_FCNTL_WAL
1e270 5f 42 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20 20  _BLOCK: {.      
1e280 2f 2a 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  /* pFile->ctrlFl
1e290 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
1e2a0 42 4c 4f 43 4b 3b 20 2f 2f 20 44 65 66 65 72 72  BLOCK; // Deferr
1e2b0 65 64 20 66 65 61 74 75 72 65 20 2a 2f 0a 20 20  ed feature */.  
1e2c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1e2d0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1e2e0 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
1e2f0 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20  L_LOCKSTATE: {. 
1e300 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
1e310 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   = pFile->eFileL
1e320 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ock;.      retur
1e330 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e340 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
1e350 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52  TE_FCNTL_LAST_ER
1e360 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  RNO: {.      *(i
1e370 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
1e380 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20  ->lastErrno;.   
1e390 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e3a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
1e3b0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
1e3c0 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20  _CHUNK_SIZE: {. 
1e3d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68       pFile->szCh
1e3e0 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41  unk = *(int *)pA
1e3f0 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  rg;.      return
1e400 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1e410 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e420 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
1e430 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  T: {.      int r
1e440 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  c;.      Simulat
1e450 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
1e460 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63  );.      rc = fc
1e470 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c  ntlSizeHint(pFil
1e480 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29  e, *(i64 *)pArg)
1e490 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
1e4a0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1e4b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1e4c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  c;.    }.    cas
1e4d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
1e4e0 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20  ERSIST_WAL: {.  
1e4f0 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28      unixModeBit(
1e500 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f  pFile, UNIXFILE_
1e510 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e  PERSIST_WAL, (in
1e520 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e550 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f   SQLITE_FCNTL_PO
1e560 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
1e570 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d  E: {.      unixM
1e580 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e  odeBit(pFile, UN
1e590 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e  IXFILE_PSOW, (in
1e5a0 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20  t*)pArg);.      
1e5b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e5c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e5d0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46   SQLITE_FCNTL_VF
1e5e0 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a  SNAME: {.      *
1e5f0 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73  (char**)pArg = s
1e600 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1e610 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73  %s", pFile->pVfs
1e620 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
1e630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e640 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e650 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
1e660 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20  MPFILENAME: {.  
1e670 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65      char *zTFile
1e680 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1e690 63 36 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73  c64( pFile->pVfs
1e6a0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
1e6b0 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65        if( zTFile
1e6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78   ){.        unix
1e6d0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c  GetTempname(pFil
1e6e0 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
1e6f0 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20  ame, zTFile);.  
1e700 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
1e710 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20  Arg = zTFile;.  
1e720 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
1e730 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e740 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
1e750 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
1e760 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  VED: {.      *(i
1e770 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48  nt*)pArg = fileH
1e780 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a  asMoved(pFile);.
1e790 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e7a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
1e7b0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
1e7c0 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
1e7d0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
1e7e0 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
1e7f0 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
1e800 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
1e810 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
1e820 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
1e830 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
1e840 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1e850 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
1e860 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
1e870 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e880 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
1e890 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
1e8a0 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
1e8b0 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
1e8c0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
1e8d0 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
1e8e0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
1e8f0 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
1e900 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1e910 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
1e920 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
1e930 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
1e940 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
1e950 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e            unixUn
1e960 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
1e970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1e980 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
1e990 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
1e9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e9b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1e9c0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
1e9d0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1e9e0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
1e9f0 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
1ea00 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
1ea10 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
1ea20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
1ea30 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
1ea40 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
1ea50 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
1ea60 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
1ea70 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
1ea80 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
1ea90 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
1eaa0 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
1eab0 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1eac0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
1ead0 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
1eae0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
1eaf0 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
1eb00 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1eb10 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
1eb20 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
1eb30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
1eb40 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
1eb50 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
1eb60 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
1eb70 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
1eb80 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
1eb90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
1eba0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
1ebb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
1ebc0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
1ebd0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
1ebe0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1ebf0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1ec00 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
1ec10 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
1ec20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
1ec30 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d  LITE_NOTFOUND;.}
1ec40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ec50 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
1ec60 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
1ec70 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
1ec80 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
1ec90 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
1eca0 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
1ecb0 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
1ecc0 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
1ecd0 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
1ece0 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
1ecf0 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
1ed00 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
1ed10 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
1ed20 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
1ed30 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
1ed40 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
1ed50 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
1ed60 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
1ed70 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
1ed80 61 62 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f  abase and its jo
1ed90 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74  urnal file) that
1eda0 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
1edb0 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20   will be the.** 
1edc0 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a  same for both..*
1edd0 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e  /.#ifndef __QNXN
1ede0 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74  TO__ .static int
1edf0 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
1ee00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f  sqlite3_file *No
1ee10 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
1ee20 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
1ee30 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ed);.  return SQ
1ee40 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
1ee50 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64  TOR_SIZE;.}.#end
1ee60 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
1ee70 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20  llowing version 
1ee80 6f 66 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a  of unixSectorSiz
1ee90 65 28 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64  e() is optimized
1eea0 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66   for QNX..*/.#if
1eeb0 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23  def __QNXNTO__.#
1eec0 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d  include <sys/dcm
1eed0 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64  d_blk.h>.#includ
1eee0 65 20 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68  e <sys/statvfs.h
1eef0 3e 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  >.static int uni
1ef00 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
1ef10 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
1ef20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1ef30 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1ef40 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  ;.  if( pFile->s
1ef50 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29  ectorSize == 0 )
1ef60 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1ef70 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20  tvfs fsInfo;.   
1ef80 20 20 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20      .    /* Set 
1ef90 64 65 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e  defaults for non
1efa0 2d 73 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73  -supported files
1efb0 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46  ystems */.    pF
1efc0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1efd0 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
1efe0 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
1eff0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
1f000 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
1f010 20 30 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61   0;.    if( fsta
1f020 74 76 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26  tvfs(pFile->h, &
1f030 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20  fsInfo) == -1 ) 
1f040 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1f050 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1f060 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1f070 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e   !strcmp(fsInfo.
1f080 66 5f 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70  f_basetype, "tmp
1f090 22 29 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69  ") ) {.      pFi
1f0a0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
1f0b0 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
1f0c0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
1f0d0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1f0e0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
1f0f0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f100 43 34 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41  C4K |       /* A
1f110 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  ll ram filesyste
1f120 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
1f130 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
1f140 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
1f150 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
1f160 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
1f170 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
1f180 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f1a0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1f1b0 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
1f1c0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
1f1d0 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1f1e0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
1f1f0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
1f200 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
1f210 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
1f220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f230 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
1f240 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
1f250 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
1f260 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73 74   }else if( strst
1f270 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74  r(fsInfo.f_baset
1f280 79 70 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a  ype, "etfs") ){.
1f290 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
1f2a0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
1f2b0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
1f2c0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
1f2d0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
1f2e0 20 20 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63         /* etfs c
1f2f0 6c 75 73 74 65 72 20 73 69 7a 65 20 77 72 69 74  luster size writ
1f300 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f  es are atomic */
1f310 0a 20 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d  .        (pFile-
1f320 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31  >sectorSize / 51
1f330 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  2 * SQLITE_IOCAP
1f340 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20  _ATOMIC512) |.  
1f350 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
1f360 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
1f370 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
1f380 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
1f390 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
1f3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3c0 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
1f3d0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
1f3e0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
1f3f0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
1f400 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
1f410 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
1f420 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
1f430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f450 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
1f460 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
1f470 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1f480 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  ( !strcmp(fsInfo
1f490 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e  .f_basetype, "qn
1f4a0 78 36 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  x6") ){.      pF
1f4b0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
1f4c0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
1f4d0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
1f4e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1f4f0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53  tics =.        S
1f500 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f510 49 43 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20  IC |         /* 
1f520 41 6c 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77  All filesystem w
1f530 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
1f540 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
1f550 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
1f560 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
1f570 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
1f580 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
1f590 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
1f5c0 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
1f5d0 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
1f5e0 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f5f0 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f600 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f610 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f620 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f650 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f660 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f670 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70 28  lse if( !strcmp(
1f680 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
1f690 65 2c 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20  e, "qnx4") ){.  
1f6a0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
1f6b0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
1f6c0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
1f6d0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
1f6e0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
1f6f0 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74       /* full bit
1f700 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66  set of atomics f
1f710 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73  rom max sector s
1f720 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20  ize and smaller 
1f730 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70 46 69  */.        ((pFi
1f740 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
1f750 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
1f760 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c  CAP_ATOMIC512) <
1f770 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20  < 1) - 2 |.     
1f780 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
1f790 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20  SEQUENTIAL |    
1f7a0 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65   /* The ram file
1f7b0 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72  system has no wr
1f7c0 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20  ite behind.     
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7f0 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64   ** so it is ord
1f800 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ered */.        
1f810 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1f820 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66   strstr(fsInfo.f
1f830 5f 62 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22  _basetype, "dos"
1f840 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
1f850 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
1f860 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
1f870 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
1f880 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1f890 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
1f8a0 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
1f8b0 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
1f8c0 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
1f8d0 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
1f8e0 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
1f8f0 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
1f900 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
1f910 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
1f920 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
1f930 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
1f940 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
1f950 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
1f960 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
1f970 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
1f980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f990 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
1f9a0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
1f9b0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
1f9c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
1f9d0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
1f9e0 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
1f9f0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
1fa00 54 4f 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20  TOMIC512 |      
1fa10 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74  /* blocks are at
1fa20 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
1fa30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1fa40 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
1fa50 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
1fa60 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
1fa70 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
1faa0 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
1fab0 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ds */.        0;
1fac0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
1fad0 4c 61 73 74 20 63 68 61 6e 63 65 20 76 65 72 69  Last chance veri
1fae0 66 69 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  fication.  If th
1faf0 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73  e sector size is
1fb00 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f  n't a multiple o
1fb10 66 20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20  f 512.  ** then 
1fb20 69 74 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a  it isn't valid.*
1fb30 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73  /.  if( pFile->s
1fb40 65 63 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20  ectorSize % 512 
1fb50 21 3d 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c  != 0 ){.    pFil
1fb60 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
1fb70 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20  eristics = 0;.  
1fb80 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
1fb90 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
1fba0 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
1fbb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1fbc0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
1fbd0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f  ;.}.#endif /* __
1fbe0 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a  QNXNTO__ */../*.
1fbf0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
1fc00 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73  vice characteris
1fc10 74 69 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c  tics for the fil
1fc20 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46  e..**.** This VF
1fc30 53 20 69 73 20 73 65 74 20 75 70 20 74 6f 20 72  S is set up to r
1fc40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43  eturn SQLITE_IOC
1fc50 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  AP_POWERSAFE_OVE
1fc60 52 57 52 49 54 45 20 62 79 20 64 65 66 61 75 6c  RWRITE by defaul
1fc70 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74  t..** However, t
1fc80 68 61 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f  hat choice is co
1fc90 6e 74 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63  ntroversial sinc
1fca0 65 20 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68  e technically th
1fcb0 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20  e underlying.** 
1fcc0 66 69 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73  file system does
1fcd0 20 6e 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76   not always prov
1fce0 69 64 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76  ide powersafe ov
1fcf0 65 72 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f  erwrites.  (In o
1fd00 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61  ther.** words, a
1fd10 66 74 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73  fter a power-los
1fd20 73 20 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f  s event, parts o
1fd30 66 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  f the file that 
1fd40 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72  were never.** wr
1fd50 69 74 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20  itten might end 
1fd60 75 70 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64  up being altered
1fd70 2e 29 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e  .)  However, non
1fd80 2d 50 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69  -PSOW behavior i
1fd90 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20  s very,.** very 
1fda0 72 61 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72  rare.  And asser
1fdb0 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20  ting PSOW makes 
1fdc0 61 20 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f  a large reductio
1fdd0 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a  n in the amount.
1fde0 2a 2a 20 6f 66 20 72 65 71 75 69 72 65 64 20 49  ** of required I
1fdf0 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e  /O for journalin
1fe00 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f  g, since a lot o
1fe10 66 20 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69  f padding is eli
1fe20 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e  minated..**  Hen
1fe30 63 65 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53  ce, while POWERS
1fe40 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73  AFE_OVERWRITE is
1fe50 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20   on by default, 
1fe60 74 68 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d  there is a file-
1fe70 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c  control.** avail
1fe80 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20  able to turn it 
1fe90 6f 66 66 20 61 6e 64 20 55 52 49 20 71 75 65 72  off and URI quer
1fea0 79 20 70 61 72 61 6d 65 74 65 72 20 61 76 61 69  y parameter avai
1feb0 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74  lable to turn it
1fec0 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
1fed0 69 6e 74 20 75 6e 69 78 44 65 76 69 63 65 43 68  int unixDeviceCh
1fee0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
1fef0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
1ff00 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
1ff10 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1ff20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69    int rc = 0;.#i
1ff30 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a  fdef __QNXNTO__.
1ff40 20 20 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53    if( p->sectorS
1ff50 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63  ize==0 ) unixSec
1ff60 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72  torSize(id);.  r
1ff70 63 20 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61  c = p->deviceCha
1ff80 72 61 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65  racteristics;.#e
1ff90 6e 64 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74  ndif.  if( p->ct
1ffa0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
1ffb0 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72  LE_PSOW ){.    r
1ffc0 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  c |= SQLITE_IOCA
1ffd0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
1ffe0 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74  WRITE;.  }.  ret
1fff0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21  urn rc;.}..#if !
20000 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
20010 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
20020 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
20030 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  >0../*.** Return
20040 20 74 68 65 20 73 79 73 74 65 6d 20 70 61 67 65   the system page
20050 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   size..**.** Thi
20060 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
20070 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  d not be called 
20080 64 69 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65  directly by othe
20090 72 20 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66  r code in this f
200a0 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64  ile. .** Instead
200b0 2c 20 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63  , it should be c
200c0 61 6c 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20  alled via macro 
200d0 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e  osGetpagesize().
200e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
200f0 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76  nixGetpagesize(v
20100 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  oid){.#if OS_VXW
20110 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30  ORKS.  return 10
20120 32 34 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  24;.#elif define
20130 64 28 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20  d(_BSD_SOURCE). 
20140 20 72 65 74 75 72 6e 20 67 65 74 70 61 67 65 73   return getpages
20150 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72  ize();.#else.  r
20160 65 74 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f  eturn (int)sysco
20170 6e 66 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29  nf(_SC_PAGESIZE)
20180 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64  ;.#endif.}..#end
20190 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
201a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
201b0 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
201c0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69  AP_SIZE>0 */..#i
201d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
201e0 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a  T_WAL../*.** Obj
201f0 65 63 74 20 75 73 65 64 20 74 6f 20 72 65 70 72  ect used to repr
20200 65 73 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20  esent an shared 
20210 6d 65 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20  memory buffer.  
20220 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74  .**.** When mult
20230 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
20240 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
20250 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65  ame wal-index, e
20260 61 63 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61  ach thread.** ha
20270 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68  s its own unixSh
20280 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68  m object, but th
20290 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20  ey all point to 
202a0 61 20 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63  a single instanc
202b0 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69  e.** of this uni
202c0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e  xShmNode object.
202d0 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
202e0 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78  , each wal-index
202f0 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e   is opened.** on
20300 6c 79 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63  ly once per proc
20310 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ess..**.** Each 
20320 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
20330 63 74 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  ct is connected 
20340 74 6f 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78  to a single unix
20350 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
20360 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f  ..** We could co
20370 61 6c 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65  alesce this obje
20380 63 74 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64  ct into unixInod
20390 65 49 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20  eInfo, but that 
203a0 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76  would mean.** ev
203b0 65 72 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68  ery open file th
203c0 61 74 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  at does not use 
203d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69  shared memory (i
203e0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
203f0 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65  ost.** open file
20400 73 29 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f  s) would have to
20410 20 63 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68   carry around th
20420 69 73 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  is extra informa
20430 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65  tion.  So.** the
20440 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
20450 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61  bject contains a
20460 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73   pointer to this
20470 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
20480 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75  ect.** and the u
20490 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
204a0 74 20 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c  t is created onl
204b0 79 20 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a  y when needed..*
204c0 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65  *.** unixMutexHe
204d0 6c 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75  ld() must be tru
204e0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
204f0 6f 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a  or destroying.**
20500 20 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20   this object or 
20510 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72  while reading or
20520 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c   writing the fol
20530 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a  lowing fields:.*
20540 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a  *.**      nRef.*
20550 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
20560 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 72 65  ng fields are re
20570 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ad-only after th
20580 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
20590 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20  ted:.** .**     
205a0 20 66 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69   fid.**      zFi
205b0 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74  lename.**.** Eit
205c0 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e  her unixShmNode.
205d0 6d 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65  mutex must be he
205e0 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64  ld or unixShmNod
205f0 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a  e.nRef==0 and.**
20600 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
20610 20 69 73 20 74 72 75 65 20 77 68 65 6e 20 72 65   is true when re
20620 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67  ading or writing
20630 20 61 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64   any other field
20640 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75  .** in this stru
20650 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74  cture..*/.struct
20660 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20   unixShmNode {. 
20670 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
20680 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75  pInode;     /* u
20690 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61  nixInodeInfo tha
206a0 74 20 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20  t owns this SHM 
206b0 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  node */.  sqlite
206c0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20  3_mutex *mutex; 
206d0 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f       /* Mutex to
206e0 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a   access this obj
206f0 65 63 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ect */.  char *z
20700 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
20710 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
20720 68 65 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20  he mmapped file 
20730 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20  */.  int h;     
20740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20750 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
20760 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  criptor */.  int
20770 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20   szRegion;      
20780 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20790 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  of shared-memory
207a0 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31   regions */.  u1
207b0 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20  6 nRegion;      
207c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
207d0 20 6f 66 20 61 72 72 61 79 20 61 70 52 65 67 69   of array apRegi
207e0 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61  on */.  u8 isRea
207f0 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  donly;          
20800 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65     /* True if re
20810 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61  ad-only */.  cha
20820 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20  r **apRegion;   
20830 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
20840 20 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65   of mapped share
20850 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73  d-memory regions
20860 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
20870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20880 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
20890 69 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f  ixShm objects po
208a0 69 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a  inting to this *
208b0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69  /.  unixShm *pFi
208c0 72 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rst;           /
208d0 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62  * All unixShm ob
208e0 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74  jects pointing t
208f0 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66  o this */.#ifdef
20900 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
20910 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  u8 exclMask;    
20920 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20930 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
20940 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
20950 75 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20  u8 sharedMask;  
20960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
20970 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63  sk of shared loc
20980 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20  ks held */.  u8 
20990 6e 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20  nextShmId;      
209a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
209b0 61 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68  available unixSh
209c0 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65  m.id value */.#e
209d0 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53  ndif.};../*.** S
209e0 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e  tructure used in
209f0 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73  ternally by this
20a00 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74   VFS to record t
20a10 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a  he state of an.*
20a20 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65  * open shared me
20a30 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  mory connection.
20a40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
20a50 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20  wing fields are 
20a60 69 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e  initialized when
20a70 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20   this object is 
20a80 63 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61  created and.** a
20a90 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65  re read-only the
20aa0 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20  reafter:.**.**  
20ab0 20 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a    unixShm.pFile.
20ac0 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64  **    unixShm.id
20ad0 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72  .**.** All other
20ae0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
20af0 2f 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69  /write.  The uni
20b00 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65  xShm.pFile->mute
20b10 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  x must be held.*
20b20 2a 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e  * while accessin
20b30 67 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65  g any read/write
20b40 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75   fields..*/.stru
20b50 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75  ct unixShm {.  u
20b60 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
20b70 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65  Node;     /* The
20b80 20 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78   underlying unix
20b90 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a  ShmNode object *
20ba0 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65  /.  unixShm *pNe
20bb0 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  xt;            /
20bc0 2a 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77  * Next unixShm w
20bd0 69 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69  ith the same uni
20be0 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38  xShmNode */.  u8
20bf0 20 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20   hasMutex;      
20c00 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
20c10 20 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   if holding the 
20c20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65  unixShmNode mute
20c30 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20  x */.  u8 id;   
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c50 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20    /* Id of this 
20c60 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69  connection withi
20c70 6e 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64  n its unixShmNod
20c80 65 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65  e */.  u16 share
20c90 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
20ca0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
20cb0 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
20cc0 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b  /.  u16 exclMask
20cd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20ce0 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
20cf0 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
20d00 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  /.};../*.** Cons
20d10 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c  tants used for l
20d20 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e  ocking.*/.#defin
20d30 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20  e UNIX_SHM_BASE 
20d40 20 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48    ((22+SQLITE_SH
20d50 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20  M_NLOCK)*4)     
20d60 20 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63      /* first loc
20d70 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
20d80 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
20d90 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45    (UNIX_SHM_BASE
20da0 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  +SQLITE_SHM_NLOC
20db0 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73  K)  /* deadman s
20dc0 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  witch */../*.** 
20dd0 41 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69  Apply posix advi
20de0 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61  sory locks for a
20df0 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66  ll bytes from of
20e00 73 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b  st through ofst+
20e10 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73  n-1..**.** Locks
20e20 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61   block if the ma
20e30 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e  sk is exactly UN
20e40 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65  IX_SHM_C and are
20e50 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a   non-blocking.**
20e60 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
20e70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
20e80 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75  mSystemLock(.  u
20e90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
20ea0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f        /* Open co
20eb0 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
20ec0 57 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  WAL file */.  in
20ed0 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20  t lockType,     
20ee0 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c       /* F_UNLCK,
20ef0 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57   F_RDLCK, or F_W
20f00 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66  RLCK */.  int of
20f10 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
20f20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
20f30 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61  f the locking ra
20f40 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20  nge */.  int n  
20f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f60 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
20f70 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  es to lock */.){
20f80 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
20f90 70 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70  pShmNode; /* App
20fa0 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73  ly locks to this
20fb0 20 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d   open shared-mem
20fc0 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20  ory segment */. 
20fd0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b   struct flock f;
20fe0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
20ff0 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
21000 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
21010 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
21020 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52  LITE_OK;    /* R
21030 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20  esult code form 
21040 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a  fcntl() */..  /*
21050 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75   Access to the u
21060 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
21070 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20  t is serialized 
21080 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f  by the caller */
21090 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  .  pShmNode = pF
210a0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
210b0 6d 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  mNode;.  assert(
210c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
210d0 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
210e0 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
210f0 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
21100 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
21110 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
21120 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
21130 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
21140 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
21150 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
21160 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
21170 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
21180 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
21190 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
211a0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
211b0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  >h>=0 ){.    int
211c0 20 6c 6b 54 79 70 65 3b 0a 20 20 20 20 2f 2a 20   lkType;.    /* 
211d0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
211e0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
211f0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
21200 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
21210 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
21220 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
21230 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
21240 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
21250 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
21260 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
21270 20 20 20 6c 6b 54 79 70 65 20 3d 20 28 70 46 69     lkType = (pFi
21280 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  le->ctrlFlags & 
21290 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 29 21  UNIXFILE_BLOCK)!
212a0 3d 30 20 3f 20 46 5f 53 45 54 4c 4b 57 20 3a 20  =0 ? F_SETLKW : 
212b0 46 5f 53 45 54 4c 4b 3b 0a 20 20 20 20 72 63 20  F_SETLK;.    rc 
212c0 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  = osFcntl(pShmNo
212d0 64 65 2d 3e 68 2c 20 6c 6b 54 79 70 65 2c 20 26  de->h, lkType, &
212e0 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63  f);.    rc = (rc
212f0 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45  !=(-1)) ? SQLITE
21300 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53  _OK : SQLITE_BUS
21310 59 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  Y;.    pFile->ct
21320 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
21330 46 49 4c 45 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a  FILE_BLOCK;.  }.
21340 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
21350 20 67 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61   global lock sta
21360 74 65 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20  te and do debug 
21370 74 72 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65  tracing */.#ifde
21380 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21390 20 7b 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f   { u16 mask;.  O
213a0 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
213b0 4b 20 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20  K "));.  mask = 
213c0 6f 66 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66  ofst>31 ? 0xffff
213d0 20 3a 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   : (1<<(ofst+n))
213e0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
213f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21400 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63  K ){.    if( loc
21410 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  kType==F_UNLCK )
21420 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
21430 28 22 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ("unlock %d ok",
21440 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
21450 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
21460 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
21470 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
21480 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
21490 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
214a0 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  ockType==F_RDLCK
214b0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
214c0 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64  E(("read-lock %d
214d0 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
214e0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
214f0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
21500 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
21510 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
21520 61 73 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ask;.    }else{.
21530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f        assert( lo
21540 63 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  ckType==F_WRLCK 
21550 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45  );.      OSTRACE
21560 28 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64  (("write-lock %d
21570 20 6f 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20   ok", ofst));.  
21580 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78      pShmNode->ex
21590 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  clMask |= mask;.
215a0 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
215b0 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
215c0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
215d0 73 65 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b  se{.    if( lock
215e0 54 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b  Type==F_UNLCK ){
215f0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
21600 22 75 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  "unlock %d faile
21610 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
21620 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
21630 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
21640 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
21650 65 61 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22  ead-lock failed"
21660 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ));.    }else{. 
21670 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63       assert( loc
21680 6b 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29  kType==F_WRLCK )
21690 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  ;.      OSTRACE(
216a0 28 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20  ("write-lock %d 
216b0 66 61 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b  failed", ofst));
216c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
216d0 52 41 43 45 28 28 22 20 2d 20 61 66 74 65 72 77  RACE((" - afterw
216e0 61 72 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e  ards %03x,%03x\n
216f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 53  ",.           pS
21700 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
21710 73 6b 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78  sk, pShmNode->ex
21720 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65  clMask));.  }.#e
21730 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
21740 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a  c;        .}../*
21750 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
21760 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  inimum number of
21770 20 33 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e   32KB shm region
21780 73 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  s that should be
21790 20 6d 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20   mapped at.** a 
217a0 74 69 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74  time, assuming t
217b0 68 61 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67  hat each mapping
217c0 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65   must be an inte
217d0 67 65 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  ger multiple of 
217e0 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73  the.** current s
217f0 79 73 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e  ystem page-size.
21800 0a 2a 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20  .**.** Usually, 
21810 74 68 69 73 20 69 73 20 31 2e 20 54 68 65 20 65  this is 1. The e
21820 78 63 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74  xception seems t
21830 6f 20 62 65 20 73 79 73 74 65 6d 73 20 74 68 61  o be systems tha
21840 74 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  t are configured
21850 0a 2a 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20  .** to use 64KB 
21860 70 61 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20  pages - in this 
21870 63 61 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e  case each mappin
21880 67 20 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20  g must cover at 
21890 6c 65 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d  least two.** shm
218a0 20 72 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61   regions..*/.sta
218b0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52  tic int unixShmR
218c0 65 67 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64  egionPerMap(void
218d0 29 7b 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d  ){.  int shmsz =
218e0 20 33 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20   32*1024;       
218f0 20 20 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69       /* SHM regi
21900 6f 6e 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  on size */.  int
21910 20 70 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67   pgsz = osGetpag
21920 65 73 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79  esize();   /* Sy
21930 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a  stem page size *
21940 2f 0a 20 20 61 73 73 65 72 74 28 20 28 28 70 67  /.  assert( ((pg
21950 73 7a 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29  sz-1)&pgsz)==0 )
21960 3b 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65  ;   /* Page size
21970 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
21980 20 6f 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70   of 2 */.  if( p
21990 67 73 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75  gsz<shmsz ) retu
219a0 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn 1;.  return p
219b0 67 73 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a  gsz/shmsz;.}../*
219c0 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e  .** Purge the un
219d0 69 78 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69  ixShmNodeList li
219e0 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65  st of all entrie
219f0 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f  s with unixShmNo
21a00 64 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a  de.nRef==0..**.*
21a10 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
21a20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21a30 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20  y method; it is 
21a40 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  a utility functi
21a50 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20  on called.** by 
21a60 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  VFS shared-memor
21a70 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  y methods..*/.st
21a80 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68  atic void unixSh
21a90 6d 50 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20  mPurge(unixFile 
21aa0 2a 70 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d  *pFd){.  unixShm
21ab0 4e 6f 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70  Node *p = pFd->p
21ac0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
21ad0 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d  .  assert( unixM
21ae0 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20  utexHeld() );.  
21af0 69 66 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66  if( p && p->nRef
21b00 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  ==0 ){.    int n
21b10 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78  ShmPerMap = unix
21b20 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28  ShmRegionPerMap(
21b30 29 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  );.    int i;.  
21b40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e    assert( p->pIn
21b50 6f 64 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65  ode==pFd->pInode
21b60 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
21b70 6d 75 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75  mutex_free(p->mu
21b80 74 65 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tex);.    for(i=
21b90 30 3b 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b  0; i<p->nRegion;
21ba0 20 69 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b   i+=nShmPerMap){
21bb0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  .      if( p->h>
21bc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  =0 ){.        os
21bd0 4d 75 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69  Munmap(p->apRegi
21be0 6f 6e 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69  on[i], p->szRegi
21bf0 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  on);.      }else
21c00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
21c10 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21c20 6f 6e 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  on[i]);.      }.
21c30 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
21c40 33 5f 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69  3_free(p->apRegi
21c50 6f 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  on);.    if( p->
21c60 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h>=0 ){.      ro
21c70 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20  bust_close(pFd, 
21c80 70 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  p->h, __LINE__);
21c90 0a 20 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31  .      p->h = -1
21ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70  ;.    }.    p->p
21cb0 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
21cc0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
21cd0 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a  _free(p);.  }.}.
21ce0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73 68  ./*.** Open a sh
21cf0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65 61  ared-memory area
21d00 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
21d10 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
21d20 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a 2a 20  ile pDbFd.  .** 
21d30 54 68 69 73 20 70 61 72 74 69 63 75 6c 61 72 20  This particular 
21d40 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75  implementation u
21d50 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69 6c 65  ses mmapped file
21d60 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  s..**.** The fil
21d70 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
21d80 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ent shared-memor
21d90 79 20 69 73 20 69 6e 20 74 68 65 20 73 61 6d 65  y is in the same
21da0 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 61 73   directory.** as
21db0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
21dc0 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61 73 20  se file and has 
21dd0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
21de0 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
21df0 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74 68 20  se.** file with 
21e00 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66 66 69  the "-shm" suffi
21e10 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20 65 78  x added.  For ex
21e20 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20 64 61  ample, if the da
21e30 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 69  tabase file.** i
21e40 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31 2f 63  s "/home/user1/c
21e50 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e 20 74  onfig.db" then t
21e60 68 65 20 66 69 6c 65 20 74 68 61 74 20 69 73 20  he file that is 
21e70 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d 61 70  created and mmap
21e80 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61 72 65  ped.** for share
21e90 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
21ea0 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65 2f 75   called "/home/u
21eb0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 2d 73  ser1/config.db-s
21ec0 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6e 6f  hm".  .**.** Ano
21ed0 74 68 65 72 20 61 70 70 72 6f 61 63 68 20 74 6f  ther approach to
21ee0 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c 65 73   is to use files
21ef0 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f 72 20   in /dev/shm or 
21f00 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e 0a 2a  /dev/tmp or an.*
21f10 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74 6d 70  * some other tmp
21f20 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20 69 66  fs mount. But if
21f30 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64 69 66   a file in a dif
21f40 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  ferent directory
21f50 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 61 74  .** from the dat
21f60 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 75 73  abase file is us
21f70 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65 72 69  ed, then differi
21f80 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d 69 73  ng access permis
21f90 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20 63 68  sions.** or a ch
21fa0 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63 61 75  root() might cau
21fb0 73 65 20 74 77 6f 20 64 69 66 66 65 72 65 6e 74  se two different
21fc0 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20 74 68   processes on th
21fd0 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61 62 61  e same.** databa
21fe0 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75 73 69  se to end up usi
21ff0 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  ng different fil
22000 65 73 20 66 6f 72 20 73 68 61 72 65 64 20 6d 65  es for shared me
22010 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61 6e 69  mory - .** meani
22020 6e 67 20 74 68 61 74 20 74 68 65 69 72 20 6d 65  ng that their me
22030 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74 20 72  mory would not r
22040 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65 64 20  eally be shared 
22050 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a 20 69  - resulting.** i
22060 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  n database corru
22070 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74 68 65  ption.  Neverthe
22080 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70 66 73  less, this tmpfs
22090 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a 20 63   file usage.** c
220a0 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20 61 74  an be enabled at
220b0 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 75 73   compile-time us
220c0 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53 48 4d  ing -DSQLITE_SHM
220d0 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64 65 76  _DIRECTORY="/dev
220e0 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68 65 20  /shm".** or the 
220f0 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54 68 65  equivalent.  The
22100 20 75 73 65 20 6f 66 20 74 68 65 20 53 51 4c 49   use of the SQLI
22110 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
22120 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 2a 2a   compile-time.**
22130 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74 73 20   option results 
22140 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
22150 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51 4c 69  le build of SQLi
22160 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66 20 53  te;  builds of S
22170 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20 77 69  QLite.** that wi
22180 74 68 20 64 69 66 66 65 72 69 6e 67 20 53 51 4c  th differing SQL
22190 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
221a0 59 20 73 65 74 74 69 6e 67 73 20 61 74 74 65 6d  Y settings attem
221b0 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a 2a 2a  pt to use the.**
221c0 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 66   same database f
221d0 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20  ile at the same 
221e0 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65 20 63  time, database c
221f0 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 6c  orruption will l
22200 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 2e  ikely.** result.
22210 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f   The SQLITE_SHM_
22220 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c  DIRECTORY compil
22230 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
22240 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a 20 22   considered.** "
22250 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61 6e 64  unsupported" and
22260 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69 6e 20   may go away in 
22270 61 20 66 75 74 75 72 65 20 53 51 4c 69 74 65 20  a future SQLite 
22280 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 57  release..**.** W
22290 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 6e 65  hen opening a ne
222a0 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  w shared-memory 
222b0 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74 68 65  file, if no othe
222c0 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74  r instances of t
222d0 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72 65 20  hat.** file are 
222e0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2c 20  currently open, 
222f0 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
22300 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72 6f 63  or in other proc
22310 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a 20 74  esses, then.** t
22320 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  he file must be 
22330 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65 72  truncated to zer
22340 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61 76 65  o length or have
22350 20 69 74 73 20 68 65 61 64 65 72 20 63 6c 65 61   its header clea
22360 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  red..**.** If th
22370 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
22380 61 73 65 20 66 69 6c 65 20 28 70 44 62 46 64 29  ase file (pDbFd)
22390 20 69 73 20 75 73 69 6e 67 20 74 68 65 20 22 75   is using the "u
223a0 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a 2a 2a  nix-excl" VFS.**
223b0 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
223c0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
223d0 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68  ck is held on th
223e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
223f0 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f 20 6f  and.** that no o
22400 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
22410 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61 64 20  re able to read 
22420 6f 72 20 77 72 69 74 65 20 74 68 65 20 64 61 74  or write the dat
22430 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20 74 68  abase.  In.** th
22440 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f 20 6e  at case, we do n
22450 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64 20 73  ot really need s
22460 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 4e  hared memory.  N
22470 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 0a  o shared memory.
22480 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ** file is creat
22490 65 64 2e 20 20 54 68 65 20 73 68 61 72 65 64 20  ed.  The shared 
224a0 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 73  memory will be s
224b0 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20 68 65  imulated with he
224c0 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ap memory..*/.st
224d0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70 65  atic int unixOpe
224e0 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e  nSharedMemory(un
224f0 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29 7b 0a  ixFile *pDbFd){.
22500 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d    struct unixShm
22510 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20   *p = 0;        
22520 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
22530 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64  ion to be opened
22540 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
22550 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
22560 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  de;   /* The und
22570 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65 64 20  erlying mmapped 
22580 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  file */.  int rc
22590 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
225a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
225b0 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e  ult code */.  un
225c0 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
225d0 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ode;          /*
225e0 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20 66 64   The inode of fd
225f0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 68 6d   */.  char *zShm
22600 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20  Filename;       
22610 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
22620 20 74 68 65 20 66 69 6c 65 20 75 73 65 64 20 66   the file used f
22630 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20  or SHM */.  int 
22640 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  nShmFilename;   
22650 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
22660 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d 20 66  ize of the SHM f
22670 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74 65 73  ilename in bytes
22680 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61   */..  /* Alloca
22690 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  te space for the
226a0 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a   new unixShm obj
226b0 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71  ect. */.  p = sq
226c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
226d0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
226e0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
226f0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22700 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
22710 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
22720 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
22730 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
22740 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
22750 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
22760 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
22770 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
22780 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
22790 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
227a0 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
227b0 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
227c0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
227d0 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
227e0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
227f0 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
22800 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
22810 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
22820 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
22830 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
22840 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
22850 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
22860 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69 66 6e  ase file */.#ifn
22870 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
22880 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63 6f 6e  IRECTORY.    con
22890 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65 50 61  st char *zBasePa
228a0 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50 61 74  th = pDbFd->zPat
228b0 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  h;.#endif..    /
228c0 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74  * Call fstat() t
228d0 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
228e0 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
228f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22900 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e  e. If.    ** a n
22910 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73  ew *-shm file is
22920 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74   created, an att
22930 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64  empt will be mad
22940 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20  e to create it. 
22950 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
22960 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ame permissions.
22970 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
22980 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
22990 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
229a0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
229b0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  k==0 ){.      rc
229c0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
229d0 46 53 54 41 54 3b 0a 20 20 20 20 20 20 67 6f 74  FSTAT;.      got
229e0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
229f0 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
22a00 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
22a10 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
22a20 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
22a30 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
22a40 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
22a50 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
22a60 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
22a70 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65  n(zBasePath);.#e
22a80 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
22a90 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
22aa0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 53  oc64( sizeof(*pS
22ab0 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
22ac0 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
22ad0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
22ae0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22af0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22b00 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22b10 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
22b20 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c  set(pShmNode, 0,
22b30 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
22b40 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29  e)+nShmFilename)
22b50 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
22b60 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
22b70 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
22b80 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
22b90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
22ba0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
22bb0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
22bc0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
22bd0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
22be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22bf0 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
22c00 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
22c10 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
22c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22c30 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
22c40 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
22c50 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
22c60 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
22c70 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
22c80 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
22c90 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
22ca0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
22cb0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
22cc0 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
22cd0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
22ce0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
22cf0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
22d00 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
22d10 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
22d20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
22d30 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
22d40 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
22d50 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
22d60 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
22d70 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
22d80 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
22d90 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
22da0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
22db0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
22dc0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
22dd0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
22de0 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
22df0 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
22e00 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73     int openFlags
22e10 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
22e20 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73  EAT;.      if( s
22e30 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
22e40 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
22e50 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
22e60 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6f   0) ){.        o
22e70 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 4f  penFlags = O_RDO
22e80 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70 53 68  NLY;.        pSh
22e90 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
22ea0 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  y = 1;.      }. 
22eb0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68       pShmNode->h
22ec0 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a   = robust_open(z
22ed0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f 70 65  ShmFilename, ope
22ee0 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74 2e 73  nFlags, (sStat.s
22ef0 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b 0a 20  t_mode&0777));. 
22f00 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64       if( pShmNod
22f10 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20 20  e->h<0 ){.      
22f20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
22f30 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
22f40 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
22f50 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
22f60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
22f70 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
22f80 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66    }..      /* If
22f90 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
22fa0 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74   running as root
22fb0 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
22fc0 20 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20   the SHM file.  
22fd0 20 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20      ** is owned 
22fe0 62 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72  by the same user
22ff0 20 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f   that owns the o
23000 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
23010 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20  .  Otherwise,.  
23020 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
23030 6e 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e  nal owner will n
23040 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f  ot be able to co
23050 6e 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  nnect..      */.
23060 20 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f        robustFcho
23070 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  wn(pShmNode->h, 
23080 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53  sStat.st_uid, sS
23090 74 61 74 2e 73 74 5f 67 69 64 29 3b 0a 20 20 0a  tat.st_gid);.  .
230a0 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
230b0 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72  o see if another
230c0 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
230d0 69 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e  ing the dead-man
230e0 20 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a   switch..      *
230f0 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61  * If not, trunca
23100 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
23110 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20  ero length. .   
23120 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
23130 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
23140 20 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73    if( unixShmSys
23150 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
23160 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _WRLCK, UNIX_SHM
23170 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45  _DMS, 1)==SQLITE
23180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
23190 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
231a0 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  ate(pShmNode->h,
231b0 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
231c0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
231d0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
231e0 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63  SHMOPEN, "ftrunc
231f0 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  ate", zShmFilena
23200 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  me);.        }. 
23210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23230 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
23240 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
23250 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
23260 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
23270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23280 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
23290 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
232a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b   }.  }..  /* Mak
232b0 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63  e the new connec
232c0 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20  tion a child of 
232d0 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  the unixShmNode 
232e0 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  */.  p->pShmNode
232f0 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66   = pShmNode;.#if
23300 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
23310 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e  .  p->id = pShmN
23320 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b  ode->nextShmId++
23330 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e  ;.#endif.  pShmN
23340 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70  ode->nRef++;.  p
23350 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a  DbFd->pShm = p;.
23360 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
23370 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65  ();..  /* The re
23380 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
23390 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c   pShmNode has al
233a0 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
233b0 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a  mented under.  *
233c0 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74  * the cover of t
233d0 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  he unixEnterMute
233e0 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68  x() mutex and th
233f0 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74  e pointer from t
23400 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72  he.  ** new (str
23410 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a  uct unixShm) obj
23420 65 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e  ect to the pShmN
23430 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74  ode has been set
23440 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20  . All that is.  
23450 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73  ** left to do is
23460 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77   to link the new
23470 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65   object into the
23480 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61   linked list sta
23490 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53  rting.  ** at pS
234a0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20  hmNode->pFirst. 
234b0 54 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e  This must be don
234c0 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20  e while holding 
234d0 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  the pShmNode->mu
234e0 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e  tex .  ** mutex.
234f0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
23500 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
23510 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
23520 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e  p->pNext = pShmN
23530 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70  ode->pFirst;.  p
23540 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20  ShmNode->pFirst 
23550 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = p;.  sqlite3_m
23560 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
23570 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  ode->mutex);.  r
23580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23590 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
235a0 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f   on any error */
235b0 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20  .shm_open_err:. 
235c0 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44   unixShmPurge(pD
235d0 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54  bFd);       /* T
235e0 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70  his call frees p
235f0 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69  ShmNode if requi
23600 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  red */.  sqlite3
23610 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78  _free(p);.  unix
23620 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
23630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23640 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
23650 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  n is called to o
23660 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  btain a pointer 
23670 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f  to region iRegio
23680 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61  n of the .** sha
23690 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63  red-memory assoc
236a0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64  iated with the d
236b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e  atabase file fd.
236c0 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   Shared-memory r
236d0 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e  egions .** are n
236e0 75 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67  umbered starting
236f0 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68   from zero. Each
23700 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
23710 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f  egion is szRegio
23720 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  n .** bytes in s
23730 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ize..**.** If an
23740 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
23750 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
23760 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
23770 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
23780 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
23790 2c 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64  , if the bExtend
237a0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20   parameter is 0 
237b0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
237c0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a  d shared-memory.
237d0 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f  ** region has no
237e0 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
237f0 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c   (by any client,
23800 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72   including one r
23810 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73  unning in a.** s
23820 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29  eparate process)
23830 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65  , then *pp is se
23840 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
23850 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
23860 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64  . If .** bExtend
23870 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
23880 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
23890 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
238a0 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ion has not yet 
238b0 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
238c0 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61  ed, it is alloca
238d0 74 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ted by this func
238e0 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  tion..**.** If t
238f0 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
23900 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65   region has alre
23910 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ady been allocat
23920 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74  ed or is allocat
23930 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61  ed by.** this ca
23940 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ll as described 
23950 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69  above, then it i
23960 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68  s mapped into th
23970 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a  is processes .**
23980 20 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28   address space (
23990 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
239a0 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65  eady), *pp is se
239b0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
239c0 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d  e mapped .** mem
239d0 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
239e0 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
239f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
23a00 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  mMap(.  sqlite3_
23a10 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
23a20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
23a30 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61  e open on databa
23a40 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
23a50 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20   iRegion,       
23a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a70 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65  Region to retrie
23a80 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  ve */.  int szRe
23a90 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20  gion,           
23aa0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
23ab0 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20  of regions */.  
23ac0 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20  int bExtend,    
23ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ae0 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e  /* True to exten
23af0 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73  d file if necess
23b00 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f  ary */.  void vo
23b10 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20  latile **pp     
23b20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23b30 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a   Mapped memory *
23b40 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
23b50 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
23b60 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68  le*)fd;.  unixSh
23b70 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e  m *p;.  unixShmN
23b80 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode *pShmNode;. 
23b90 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
23ba0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50  _OK;.  int nShmP
23bb0 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
23bc0 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
23bd0 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b   int nReqRegion;
23be0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68  ..  /* If the sh
23bf0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
23c00 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
23c10 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
23c20 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20  t now. */.  if( 
23c30 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29  pDbFd->pShm==0 )
23c40 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f  {.    rc = unixO
23c50 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
23c60 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20  pDbFd);.    if( 
23c70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
23c80 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
23c90 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
23ca0 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20  m;.  pShmNode = 
23cb0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73  p->pShmNode;.  s
23cc0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
23cd0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
23ce0 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ex);.  assert( s
23cf0 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64  zRegion==pShmNod
23d00 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70  e->szRegion || p
23d10 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
23d20 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
23d30 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
23d40 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
23d50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
23d60 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20  hmNode->h>=0 || 
23d70 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
23d80 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29  ProcessLock==1 )
23d90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
23da0 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62  Node->h<0 || pDb
23db0 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  Fd->pInode->bPro
23dc0 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  cessLock==0 );..
23dd0 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d    /* Minimum num
23de0 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72  ber of regions r
23df0 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61  equired to be ma
23e00 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52  pped. */.  nReqR
23e10 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f  egion = ((iRegio
23e20 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20  n+nShmPerMap) / 
23e30 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53  nShmPerMap) * nS
23e40 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28  hmPerMap;..  if(
23e50 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
23e60 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
23e70 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65  .    char **apNe
23e80 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
23e90 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61          /* New a
23ea0 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20  pRegion[] array 
23eb0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  */.    int nByte
23ec0 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a   = nReqRegion*sz
23ed0 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e  Region;   /* Min
23ee0 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69  imum required fi
23ef0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
23f00 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
23f10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
23f20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74    /* Used by fst
23f30 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68  at() */..    pSh
23f40 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20  mNode->szRegion 
23f50 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20  = szRegion;..   
23f60 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
23f70 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  >=0 ){.      /* 
23f80 54 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  The requested re
23f90 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70  gion is not mapp
23fa0 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  ed into this pro
23fb0 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
23fc0 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43  pace..      ** C
23fd0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69  heck to see if i
23fe0 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  t has been alloc
23ff0 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68  ated (i.e. if th
24000 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65  e wal-index file
24010 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72   is.      ** lar
24020 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e  ge enough to con
24030 74 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74  tain the request
24040 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20  ed region)..    
24050 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f    */.      if( o
24060 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d  sFstat(pShmNode-
24070 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
24080 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
24090 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45  TE_IOERR_SHMSIZE
240a0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
240b0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
240c0 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28    }.  .      if(
240d0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e   sStat.st_size<n
240e0 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Byte ){.        
240f0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
24100 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64   memory region d
24110 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49  oes not exist. I
24120 66 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74  f bExtend is set
24130 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   to.        ** f
24140 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79  alse, exit early
24150 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65  . *pp will be se
24160 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51  t to NULL and SQ
24170 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
24180 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24190 20 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e       if( !bExten
241a0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  d ){.          g
241b0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
241c0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
241d0 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69      /* Alternati
241e0 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64  vely, if bExtend
241f0 20 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64   is true, extend
24200 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68   the file. Do th
24210 69 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  is by.        **
24220 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c   writing a singl
24230 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e  e byte to the en
24240 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70  d of each (OS) p
24250 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20  age being.      
24260 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f    ** allocated o
24270 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68  r extended. Tech
24280 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64  nically, we need
24290 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74   only write to t
242a0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61  he.        ** la
242b0 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72  st page in order
242c0 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66   to extend the f
242d0 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67  ile. But writing
242e0 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20   to all new.    
242f0 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72      ** pages for
24300 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c  ces the OS to al
24310 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65  locate them imme
24320 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72  diately, which r
24330 65 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a  educes.        *
24340 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66  * the chances of
24350 20 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63   SIGBUS while ac
24360 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70  cessing the mapp
24370 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20  ed region later 
24380 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  on..        */. 
24390 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20         else{.   
243a0 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f         static co
243b0 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34  nst int pgsz = 4
243c0 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69  096;.          i
243d0 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20  nt iPg;..       
243e0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74     /* Write to t
243f0 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20  he last byte of 
24400 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63  each newly alloc
24410 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64  ated or extended
24420 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
24430 20 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74     assert( (nByt
24440 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a  e % pgsz)==0 );.
24450 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50            for(iP
24460 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  g=(sStat.st_size
24470 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79  /pgsz); iPg<(nBy
24480 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29  te/pgsz); iPg++)
24490 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
244a0 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  t x = 0;.       
244b0 20 20 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64       if( seekAnd
244c0 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65  WriteFd(pShmNode
244d0 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20  ->h, iPg*pgsz + 
244e0 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 26  pgsz-1, "", 1, &
244f0 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  x)!=1 ){.       
24500 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
24510 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e  r *zFile = pShmN
24520 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ode->zFilename;.
24530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
24540 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
24550 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
24560 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c 20 7a  SIZE, "write", z
24570 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
24580 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24590 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  e_out;.         
245a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
245b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
245c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
245d0 20 4d 61 70 20 74 68 65 20 72 65 71 75 65 73 74   Map the request
245e0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
245f0 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
24600 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70 61  sses address spa
24610 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77  ce. */.    apNew
24620 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71 6c 69   = (char **)sqli
24630 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20  te3_realloc(.   
24640 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
24650 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67  pRegion, nReqReg
24660 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61 72 20  ion*sizeof(char 
24670 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  *).    );.    if
24680 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20 20 20  ( !apNew ){.    
24690 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
246a0 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ERR_NOMEM;.     
246b0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
246c0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 68  t;.    }.    pSh
246d0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20  mNode->apRegion 
246e0 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20 77 68 69  = apNew;.    whi
246f0 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  le( pShmNode->nR
24700 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e  egion<nReqRegion
24710 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d   ){.      int nM
24720 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53  ap = szRegion*nS
24730 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 20 20  hmPerMap;.      
24740 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 76 6f 69  int i;.      voi
24750 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69  d *pMem;.      i
24760 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
24770 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65  0 ){.        pMe
24780 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d  m = osMmap(0, nM
24790 61 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ap,.            
247a0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
247b0 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52 45 41 44  only ? PROT_READ
247c0 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f   : PROT_READ|PRO
247d0 54 5f 57 52 49 54 45 2c 20 0a 20 20 20 20 20 20  T_WRITE, .      
247e0 20 20 20 20 20 20 4d 41 50 5f 53 48 41 52 45 44        MAP_SHARED
247f0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  , pShmNode->h, s
24800 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29 70 53 68  zRegion*(i64)pSh
24810 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20  mNode->nRegion. 
24820 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
24830 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f    if( pMem==MAP_
24840 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
24850 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
24860 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
24870 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70  RR_SHMMAP, "mmap
24880 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  ", pShmNode->zFi
24890 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20  lename);.       
248a0 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f     goto shmpage_
248b0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
248c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
248d0 20 20 20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74      pMem = sqlit
248e0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65  e3_malloc64(szRe
248f0 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 69  gion);.        i
24900 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20  f( pMem==0 ){.  
24910 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
24920 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
24930 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
24940 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  e_out;.        }
24950 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
24960 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f  pMem, 0, szRegio
24970 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  n);.      }..   
24980 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53     for(i=0; i<nS
24990 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a  hmPerMap; i++){.
249a0 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
249b0 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e  ->apRegion[pShmN
249c0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20  ode->nRegion+i] 
249d0 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d 29  = &((char*)pMem)
249e0 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20  [szRegion*i];.  
249f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
24a00 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d  Node->nRegion +=
24a10 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20   nShmPerMap;.   
24a20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f   }.  }..shmpage_
24a30 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e  out:.  if( pShmN
24a40 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65  ode->nRegion>iRe
24a50 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20  gion ){.    *pp 
24a60 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65  = pShmNode->apRe
24a70 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20  gion[iRegion];. 
24a80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20   }else{.    *pp 
24a90 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
24aa0 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
24ab0 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  nly && rc==SQLIT
24ac0 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c 49  E_OK ) rc = SQLI
24ad0 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73  TE_READONLY;.  s
24ae0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
24af0 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ve(pShmNode->mut
24b00 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
24b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
24b20 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  e the lock state
24b30 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d 65   for a shared-me
24b40 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a  mory segment..**
24b50 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
24b60 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
24b70 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61 6e  etween SHAREd an
24b80 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  d EXCLUSIVE lock
24b90 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a  s is a little.**
24ba0 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65 20   different here 
24bb0 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20  than in posix.  
24bc0 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f  In xShmLock(), o
24bd0 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75  ne can go from u
24be0 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68  nlocked.** to sh
24bf0 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f 72  ared and back or
24c00 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
24c10 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64 20  o exclusive and 
24c20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d  back.  But one m
24c30 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f  ay.** not go fro
24c40 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63 6c  m shared to excl
24c50 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65 78  usive or from ex
24c60 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72 65  clusive to share
24c70 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24c80 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20   unixShmLock(.  
24c90 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
24ca0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  ,          /* Da
24cb0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
24cc0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
24cd0 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f  emory */.  int o
24ce0 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  fst,            
24cf0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
24d00 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20 6f  ock to acquire o
24d10 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69  r release */.  i
24d20 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
24d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24d40 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ber of locks to 
24d50 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
24d60 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
24d70 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
24d80 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f     /* What to do
24d90 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a   with the lock *
24da0 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  /.){.  unixFile 
24db0 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69  *pDbFd = (unixFi
24dc0 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a 20  le*)fd;      /* 
24dd0 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69  Connection holdi
24de0 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ng shared memory
24df0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
24e00 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20   = pDbFd->pShm; 
24e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24e20 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
24e30 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f   being locked */
24e40 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20  .  unixShm *pX; 
24e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e60 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20           /* For 
24e70 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c  looping over all
24e80 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75   siblings */.  u
24e90 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
24ea0 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
24eb0 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  de;  /* The unde
24ec0 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64  rlying file iNod
24ed0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  e */.  int rc = 
24ee0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
24ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f00 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
24f10 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20 20   u16 mask;      
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f30 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
24f40 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20  f locks to take 
24f50 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20  or release */.. 
24f60 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
24f70 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
24f80 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20  ->pShmNode );.  
24f90 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
24fa0 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d  ->pInode==pDbFd-
24fb0 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73  >pInode );.  ass
24fc0 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26 20  ert( ofst>=0 && 
24fd0 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53  ofst+n<=SQLITE_S
24fe0 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  HM_NLOCK );.  as
24ff0 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20  sert( n>=1 );.  
25000 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 28  assert( flags==(
25010 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
25020 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
25030 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
25040 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
25050 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f  M_LOCK | SQLITE_
25060 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  SHM_EXCLUSIVE). 
25070 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
25080 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  (SQLITE_SHM_UNLO
25090 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
250a0 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c  SHARED).       |
250b0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
250c0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
250d0 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
250e0 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VE) );.  assert(
250f0 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20   n==1 || (flags 
25100 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  & SQLITE_SHM_EXC
25110 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20 20  LUSIVE)!=0 );.  
25120 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65  assert( pShmNode
25130 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d  ->h>=0 || pDbFd-
25140 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
25150 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73  sLock==1 );.  as
25160 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
25170 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  h<0 || pDbFd->pI
25180 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
25190 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b  ck==0 );..  mask
251a0 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29   = (1<<(ofst+n))
251b0 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20   - (1<<ofst);.  
251c0 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d  assert( n>1 || m
251d0 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29  ask==(1<<ofst) )
251e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
251f0 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
25200 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
25210 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53  flags & SQLITE_S
25220 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  HM_UNLOCK ){.   
25230 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30   u16 allMask = 0
25240 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63  ; /* Mask of loc
25250 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69  ks held by sibli
25260 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  ngs */..    /* S
25270 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69 6e  ee if any siblin
25280 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61 6d  gs hold this sam
25290 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f  e lock */.    fo
252a0 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
252b0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
252c0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
252d0 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74  if( pX==p ) cont
252e0 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73 65  inue;.      asse
252f0 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  rt( (pX->exclMas
25300 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b  k & (p->exclMask
25310 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 29  |p->sharedMask))
25320 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c  ==0 );.      all
25330 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72  Mask |= pX->shar
25340 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20  edMask;.    }.. 
25350 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65     /* Unlock the
25360 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f   system-level lo
25370 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  cks */.    if( (
25380 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d  mask & allMask)=
25390 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
253a0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
253b0 63 6b 28 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43  ck(pDbFd, F_UNLC
253c0 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d  K, ofst+UNIX_SHM
253d0 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d  _BASE, n);.    }
253e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
253f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25400 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74  }..    /* Undo t
25410 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a  he local locks *
25420 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
25430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25440 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20   p->exclMask &= 
25450 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e  ~mask;.      p->
25460 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d  sharedMask &= ~m
25470 61 73 6b 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65  ask;.    } .  }e
25480 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
25490 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45  SQLITE_SHM_SHARE
254a0 44 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c  D ){.    u16 all
254b0 53 68 61 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20  Shared = 0;  /* 
254c0 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68  Union of locks h
254d0 65 6c 64 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f  eld by connectio
254e0 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20 22 70  ns other than "p
254f0 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e  " */..    /* Fin
25500 64 20 6f 75 74 20 77 68 69 63 68 20 73 68 61 72  d out which shar
25510 65 64 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72  ed locks are alr
25520 65 61 64 79 20 68 65 6c 64 20 62 79 20 73 69 62  eady held by sib
25530 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
25540 2e 0a 20 20 20 20 2a 2a 20 49 66 20 61 6e 79 20  ..    ** If any 
25550 73 69 62 6c 69 6e 67 20 61 6c 72 65 61 64 79 20  sibling already 
25560 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69  holds an exclusi
25570 76 65 20 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61  ve lock, go ahea
25580 64 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 20  d and return.   
25590 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 2e   ** SQLITE_BUSY.
255a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
255b0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
255c0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
255d0 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
255e0 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
255f0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
25600 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
25610 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
25620 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
25630 20 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c       allShared |
25640 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
25650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
25660 47 65 74 20 73 68 61 72 65 64 20 6c 6f 63 6b 73  Get shared locks
25670 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c   at the system l
25680 65 76 65 6c 2c 20 69 66 20 6e 65 63 65 73 73 61  evel, if necessa
25690 72 79 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ry */.    if( rc
256a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
256b0 20 20 20 20 20 69 66 28 20 28 61 6c 6c 53 68 61       if( (allSha
256c0 72 65 64 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  red & mask)==0 )
256d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
256e0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
256f0 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c  (pDbFd, F_RDLCK,
25700 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42   ofst+UNIX_SHM_B
25710 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  ASE, n);.      }
25720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
25730 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
25740 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
25750 20 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61   /* Get the loca
25760 6c 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a  l shared locks *
25770 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
25780 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25790 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c   p->sharedMask |
257a0 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20  = mask;.    }.  
257b0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61  }else{.    /* Ma
257c0 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69  ke sure no sibli
257d0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68  ng connections h
257e0 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77  old locks that w
257f0 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20  ill block this. 
25800 20 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20     ** lock.  If 
25810 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
25820 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
25830 20 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20   away..    */.  
25840 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64    for(pX=pShmNod
25850 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70  e->pFirst; pX; p
25860 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  X=pX->pNext){.  
25870 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63      if( (pX->exc
25880 6c 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30  lMask & mask)!=0
25890 20 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d   || (pX->sharedM
258a0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
258b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
258c0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
258d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
258e0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
258f0 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75  /* Get the exclu
25900 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68  sive locks at th
25910 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20  e system level. 
25920 20 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73   Then if success
25930 66 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ful.    ** also 
25940 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
25950 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
25960 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a  ng locked..    *
25970 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
25980 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25990 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
259a0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
259b0 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _WRLCK, ofst+UNI
259c0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
259d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
259e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
259f0 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
25a00 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b  haredMask & mask
25a10 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
25a20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d  p->exclMask |= m
25a30 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ask;.      }.   
25a40 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
25a50 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
25a60 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
25a70 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c   OSTRACE(("SHM-L
25a80 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70 69  OCK shmid-%d, pi
25a90 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c 25 30  d-%d got %03x,%0
25aa0 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  3x\n",.         
25ab0 20 20 70 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69    p->id, osGetpi
25ac0 64 28 30 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d  d(0), p->sharedM
25ad0 61 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b  ask, p->exclMask
25ae0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
25af0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
25b00 65 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72  ent a memory bar
25b10 72 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66  rier or memory f
25b20 65 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d  ence on shared m
25b30 65 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  emory.  .**.** A
25b40 6c 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f  ll loads and sto
25b50 72 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65  res begun before
25b60 20 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73   the barrier mus
25b70 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72  t complete befor
25b80 65 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72  e.** any load or
25b90 20 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74   store begun aft
25ba0 65 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a  er the barrier..
25bb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
25bc0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20  nixShmBarrier(. 
25bd0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
25be0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
25bf0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
25c00 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68  e holding the sh
25c10 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29  ared memory */.)
25c20 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
25c30 45 54 45 52 28 66 64 29 3b 0a 20 20 73 71 6c 69  ETER(fd);.  sqli
25c40 74 65 33 4d 65 6d 6f 72 79 42 61 72 72 69 65 72  te3MemoryBarrier
25c50 28 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 63  ();         /* c
25c60 6f 6d 70 69 6c 65 72 2d 64 65 66 69 6e 65 64 20  ompiler-defined 
25c70 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 2a  memory barrier *
25c80 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
25c90 65 78 28 29 3b 20 20 20 20 20 20 20 20 20 20 20  ex();           
25ca0 20 20 20 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65      /* Also mute
25cb0 78 2c 20 66 6f 72 20 72 65 64 75 6e 64 61 6e 63  x, for redundanc
25cc0 79 20 2a 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65  y */.  unixLeave
25cd0 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
25ce0 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
25cf0 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
25d00 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
25d10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
25d20 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
25d30 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
25d40 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
25d50 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
25d60 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
25d70 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
25d80 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
25d90 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
25da0 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
25db0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25dc0 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
25dd0 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
25de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
25df0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
25e00 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
25e10 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
25e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25e30 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
25e40 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
25e50 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
25e60 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
25e70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
25e80 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
25e90 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
25ea0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
25eb0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
25ec0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
25ed0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
25ee0 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
25ef0 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
25f00 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
25f10 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
25f20 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
25f30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
25f40 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
25f50 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
25f60 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
25f70 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
25f80 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
25f90 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
25fa0 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
25fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
25fc0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
25fd0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
25fe0 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
25ff0 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
26000 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
26010 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
26020 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
26030 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
26040 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
26050 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
26060 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
26070 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
26080 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
26090 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
260a0 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
260b0 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
260c0 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
260d0 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
260e0 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
260f0 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
26100 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
26110 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
26120 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
26130 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
26140 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
26150 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
26160 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
26170 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
26180 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
26190 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
261a0 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
261b0 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
261c0 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
261d0 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
261e0 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
261f0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
26200 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
26210 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
26220 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
26230 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
26240 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
26250 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ode->h>=0 ){.   
26260 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d     osUnlink(pShm
26270 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  Node->zFilename)
26280 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
26290 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
262a0 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65  .  }.  unixLeave
262b0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75  Mutex();..  retu
262c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
262d0 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ..#else.# define
262e0 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20   unixShmMap     
262f0 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
26300 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64 65  hmLock    0.# de
26310 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72 72  fine unixShmBarr
26320 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20 75  ier 0.# define u
26330 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30 0a  nixShmUnmap   0.
26340 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
26350 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
26360 4c 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45  L */..#if SQLITE
26370 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
26380 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  ./*.** If it is 
26390 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79  currently memory
263a0 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70 20 66   mapped, unmap f
263b0 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74  ile pFd..*/.stat
263c0 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
263d0 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
263e0 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pFd){.  assert( 
263f0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
26400 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
26410 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20  pMapRegion ){.  
26420 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e    osMunmap(pFd->
26430 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d  pMapRegion, pFd-
26440 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 29  >mmapSizeActual)
26450 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61 70 52  ;.    pFd->pMapR
26460 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70  egion = 0;.    p
26470 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30  Fd->mmapSize = 0
26480 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  ;.    pFd->mmapS
26490 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20  izeActual = 0;. 
264a0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   }.}../*.** Atte
264b0 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65 20 73  mpt to set the s
264c0 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72  ize of the memor
264d0 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e 74 61  y mapping mainta
264e0 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a  ined by file .**
264f0 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20   descriptor pFd 
26500 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e 20 41  to nNew bytes. A
26510 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  ny existing mapp
26520 69 6e 67 20 69 73 20 64 69 73 63 61 72 64 65 64  ing is discarded
26530 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
26540 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75 6e 63  ssful, this func
26550 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 66 6f  tion sets the fo
26560 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
26570 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75  s:.**.**       u
26580 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65 67 69  nixFile.pMapRegi
26590 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  on.**       unix
265a0 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a  File.mmapSize.**
265b0 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
265c0 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a  mmapSizeActual.*
265d0 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63 65 73  *.** If unsucces
265e0 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d  sful, an error m
265f0 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67 65 64  essage is logged
26600 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67   via sqlite3_log
26610 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68  () and.** the th
26620 72 65 65 20 76 61 72 69 61 62 6c 65 73 20 61 62  ree variables ab
26630 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20  ove are zeroed. 
26640 49 6e 20 74 68 69 73 20 63 61 73 65 20 53 51 4c  In this case SQL
26650 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f  ite should.** co
26660 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69 6e 67  ntinue accessing
26670 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 73   the database us
26680 69 6e 67 20 74 68 65 20 78 52 65 61 64 28 29 20  ing the xRead() 
26690 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a 2a 20  and xWrite().** 
266a0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
266b0 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65 6d 61  ic void unixRema
266c0 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c  pfile(.  unixFil
266d0 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20 20 20  e *pFd,         
266e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
266f0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62 6a 65   descriptor obje
26700 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77  ct */.  i64 nNew
26710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26720 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 69          /* Requi
26730 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69 7a 65  red mapping size
26740 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
26750 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61  har *zErr = "mma
26760 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20 70 46  p";.  int h = pF
26770 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20 20 20  d->h;           
26780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
26790 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 70  le descriptor op
267a0 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f  en on db file */
267b0 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d 20 28  .  u8 *pOrig = (
267c0 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
267d0 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74  gion;   /* Point
267e0 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 66 69  er to current fi
267f0 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  le mapping */.  
26800 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d  i64 nOrig = pFd-
26810 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 3b  >mmapSizeActual;
26820 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26830 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69 6e 20  pOrig region in 
26840 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70  bytes */.  u8 *p
26850 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20  New = 0;        
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26870 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e  /* Location of n
26880 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20  ew mapping */.  
26890 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52 4f 54  int flags = PROT
268a0 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20 20 20  _READ;          
268b0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f       /* Flags to
268c0 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28 29 20   pass to mmap() 
268d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  */..  assert( pF
268e0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  d->nFetchOut==0 
268f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
26900 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  w>pFd->mmapSize 
26910 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
26920 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  w<=pFd->mmapSize
26930 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Max );.  assert(
26940 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61 73 73   nNew>0 );.  ass
26950 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ert( pFd->mmapSi
26960 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d  zeActual>=pFd->m
26970 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73 73  mapSize );.  ass
26980 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45 44 21  ert( MAP_FAILED!
26990 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  =0 );..#ifdef SQ
269a0 4c 49 54 45 5f 4d 4d 41 50 5f 52 45 41 44 57 52  LITE_MMAP_READWR
269b0 49 54 45 0a 20 20 69 66 28 20 28 70 46 64 2d 3e  ITE.  if( (pFd->
269c0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
269d0 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
269e0 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f  ) flags |= PROT_
269f0 57 52 49 54 45 3b 0a 23 65 6e 64 69 66 0a 0a 20  WRITE;.#endif.. 
26a00 20 69 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69   if( pOrig ){.#i
26a10 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20  f HAVE_MREMAP.  
26a20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70    i64 nReuse = p
26a30 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65  Fd->mmapSize;.#e
26a40 6c 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  lse.    const in
26a50 74 20 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73  t szSyspage = os
26a60 47 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20  Getpagesize();. 
26a70 20 20 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20     i64 nReuse = 
26a80 28 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26  (pFd->mmapSize &
26a90 20 7e 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29   ~(szSyspage-1))
26aa0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20  ;.#endif.    u8 
26ab0 2a 70 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e  *pReq = &pOrig[n
26ac0 52 65 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20  Reuse];..    /* 
26ad0 55 6e 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20  Unmap any pages 
26ae0 6f 66 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  of the existing 
26af0 6d 61 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e  mapping that can
26b00 6e 6f 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a  not be reused. *
26b10 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 75 73 65  /.    if( nReuse
26b20 21 3d 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  !=nOrig ){.     
26b30 20 6f 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20   osMunmap(pReq, 
26b40 6e 4f 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20  nOrig-nReuse);. 
26b50 20 20 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d     }..#if HAVE_M
26b60 52 45 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d  REMAP.    pNew =
26b70 20 6f 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c   osMremap(pOrig,
26b80 20 6e 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d   nReuse, nNew, M
26b90 52 45 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a  REMAP_MAYMOVE);.
26ba0 20 20 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d      zErr = "mrem
26bb0 61 70 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70  ap";.#else.    p
26bc0 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65  New = osMmap(pRe
26bd0 71 2c 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20  q, nNew-nReuse, 
26be0 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45  flags, MAP_SHARE
26bf0 44 2c 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20  D, h, nReuse);. 
26c00 20 20 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50     if( pNew!=MAP
26c10 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20  _FAILED ){.     
26c20 20 69 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20   if( pNew!=pReq 
26c30 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e  ){.        osMun
26c40 6d 61 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d  map(pNew, nNew -
26c50 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20   nReuse);.      
26c60 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
26c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26c80 20 70 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20   pNew = pOrig;. 
26c90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
26ca0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  dif..    /* The 
26cb0 61 74 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e  attempt to exten
26cc0 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  d the existing m
26cd0 61 70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46  apping failed. F
26ce0 72 65 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69  ree it. */.    i
26cf0 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49  f( pNew==MAP_FAI
26d00 4c 45 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29  LED || pNew==0 )
26d10 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70  {.      osMunmap
26d20 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b  (pOrig, nReuse);
26d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
26d40 20 49 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c   If pNew is stil
26d50 6c 20 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63  l NULL, try to c
26d60 72 65 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c  reate an entirel
26d70 79 20 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a  y new mapping. *
26d80 2f 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  /.  if( pNew==0 
26d90 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73  ){.    pNew = os
26da0 4d 6d 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c  Mmap(0, nNew, fl
26db0 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ags, MAP_SHARED,
26dc0 20 68 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69   h, 0);.  }..  i
26dd0 66 28 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49  f( pNew==MAP_FAI
26de0 4c 45 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20  LED ){.    pNew 
26df0 3d 20 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20  = 0;.    nNew = 
26e00 30 3b 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72  0;.    unixLogEr
26e10 72 6f 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a  ror(SQLITE_OK, z
26e20 45 72 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29  Err, pFd->zPath)
26e30 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
26e40 20 6d 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61   mmap() above fa
26e50 69 6c 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61  iled, assume tha
26e60 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
26e70 20 6d 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20   mmap() calls.  
26e80 20 20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62    ** will probab
26e90 6c 79 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c  ly fail too. Fal
26ea0 6c 20 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20  l back to using 
26eb0 78 52 65 61 64 2f 78 57 72 69 74 65 20 65 78 63  xRead/xWrite exc
26ec0 6c 75 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20  lusively.    ** 
26ed0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
26ee0 2f 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53  /.    pFd->mmapS
26ef0 69 7a 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a  izeMax = 0;.  }.
26f00 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
26f10 6e 20 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77  n = (void *)pNew
26f20 3b 0a 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  ;.  pFd->mmapSiz
26f30 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  e = pFd->mmapSiz
26f40 65 41 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a  eActual = nNew;.
26f50 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20  }../*.** Memory 
26f60 6d 61 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65  map or remap the
26f70 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20   file opened by 
26f80 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
26f90 70 46 64 20 28 69 66 20 74 68 65 20 66 69 6c 65  pFd (if the file
26fa0 0a 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d  .** is already m
26fb0 61 70 70 65 64 2c 20 74 68 65 20 65 78 69 73 74  apped, the exist
26fc0 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72  ing mapping is r
26fd0 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e  eplaced by the n
26fe0 65 77 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20  ew). Or, if .** 
26ff0 74 68 65 72 65 20 61 6c 72 65 61 64 79 20 65 78  there already ex
27000 69 73 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66  ists a mapping f
27010 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e  or this file, an
27020 64 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  d there are stil
27030 6c 20 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e  l .** outstandin
27040 67 20 78 46 65 74 63 68 28 29 20 72 65 66 65 72  g xFetch() refer
27050 65 6e 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69  ences to it, thi
27060 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
27070 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
27080 70 61 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20  parameter nByte 
27090 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c  is non-negative,
270a0 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
270b0 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f  requested size o
270c0 66 20 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e  f .** the mappin
270d0 67 20 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68  g to create. Oth
270e0 65 72 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65  erwise, if nByte
270f0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
27100 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ro, then the .**
27110 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65 20   requested size 
27120 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  is the size of t
27130 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
27140 20 54 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   The actual size
27150 20 6f 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74   of the.** creat
27160 65 64 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69  ed mapping is ei
27170 74 68 65 72 20 74 68 65 20 72 65 71 75 65 73 74  ther the request
27180 65 64 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76  ed size or the v
27190 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20  alue configured 
271a0 0a 2a 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45  .** using SQLITE
271b0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49  _FCNTL_MMAP_LIMI
271c0 54 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 20  T, whichever is 
271d0 73 6d 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53  smaller..**.** S
271e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
271f0 72 6e 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72  rned if no error
27200 20 6f 63 63 75 72 73 20 28 65 76 65 6e 20 69 66   occurs (even if
27210 20 74 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20   the mapping is 
27220 6e 6f 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64  not.** recreated
27230 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
27240 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
27250 72 65 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51  rences) or an SQ
27260 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
27270 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  de otherwise..*/
27280 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
27290 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
272a0 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
272b0 29 7b 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d 20  ){.  i64 nMap = 
272c0 6e 42 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b  nByte;.  int rc;
272d0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70  ..  assert( nMap
272e0 3e 3d 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74  >=0 || pFd->nFet
272f0 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66  chOut==0 );.  if
27300 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
27310 3e 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  >0 ) return SQLI
27320 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d  TE_OK;..  if( nM
27330 61 70 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75  ap<0 ){.    stru
27340 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
27350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77            /* Low
27360 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f  -level file info
27370 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72  rmation */.    r
27380 63 20 3d 20 6f 73 46 73 74 61 74 28 70 46 64 2d  c = osFstat(pFd-
27390 3e 68 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  >h, &statbuf);. 
273a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
273b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
273c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
273d0 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
273e0 20 20 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75     nMap = statbu
273f0 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20  f.st_size;.  }. 
27400 20 69 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d   if( nMap>pFd->m
27410 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20  mapSizeMax ){.  
27420 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d    nMap = pFd->mm
27430 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a  apSizeMax;.  }..
27440 20 20 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d    if( nMap!=pFd-
27450 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
27460 20 69 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20   if( nMap>0 ){. 
27470 20 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69       unixRemapfi
27480 6c 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20  le(pFd, nMap);. 
27490 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
274a0 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46  unixUnmapfile(pF
274b0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  d);.    }.  }.. 
274c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
274d0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
274e0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
274f0 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  IZE>0 */../*.** 
27500 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74  If possible, ret
27510 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
27520 20 61 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69   a mapping of fi
27530 6c 65 20 66 64 20 73 74 61 72 74 69 6e 67 20 61  le fd starting a
27540 74 20 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66  t offset.** iOff
27550 2e 20 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75  . The mapping mu
27560 73 74 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20  st be valid for 
27570 61 74 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79  at least nAmt by
27580 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  tes..**.** If su
27590 63 68 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e  ch a pointer can
275a0 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74   be obtained, st
275b0 6f 72 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e  ore it in *pp an
275c0 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
275d0 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e  OK..** Or, if on
275e0 65 20 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20  e cannot but no 
275f0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
27600 74 20 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72  t *pp to 0 and r
27610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
27620 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20  .** Finally, if 
27630 61 6e 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63  an error does oc
27640 63 75 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53  cur, return an S
27650 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
27660 2e 20 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76  . The final.** v
27670 61 6c 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75  alue of *pp is u
27680 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73  ndefined in this
27690 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   case..**.** If 
276a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
276b0 65 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  es return a poin
276c0 74 65 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20  ter, the caller 
276d0 6d 75 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20  must eventually 
276e0 0a 2a 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20  .** release the 
276f0 72 65 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c  reference by cal
27700 6c 69 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68  ling unixUnfetch
27710 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
27720 74 20 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69  t unixFetch(sqli
27730 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
27740 34 20 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74  4 iOff, int nAmt
27750 2c 20 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69  , void **pp){.#i
27760 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
27770 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
27780 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
27790 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
277a0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
277b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
277c0 23 65 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30  #endif.  *pp = 0
277d0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ;..#if SQLITE_MA
277e0 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
277f0 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
27800 65 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66  eMax>0 ){.    if
27810 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  ( pFd->pMapRegio
27820 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  n==0 ){.      in
27830 74 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69  t rc = unixMapfi
27840 6c 65 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20  le(pFd, -1);.   
27850 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
27860 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
27870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27880 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d  pFd->mmapSize >=
27890 20 69 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20   iOff+nAmt ){.  
278a0 20 20 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20      *pp = &((u8 
278b0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
278c0 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20  n)[iOff];.      
278d0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b  pFd->nFetchOut++
278e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
278f0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
27900 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27910 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
27920 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c  ument is non-NUL
27930 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
27940 63 74 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61  ction releases a
27950 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f   .** reference o
27960 62 74 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61  btained by an ea
27970 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e  rlier call to un
27980 69 78 46 65 74 63 68 28 29 2e 20 54 68 65 20 73  ixFetch(). The s
27990 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
279a0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
279b0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
279c0 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
279d0 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
279e0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74  ** argument that
279f0 20 77 61 73 20 70 61 73 73 65 64 20 74 6f 20 74   was passed to t
27a00 68 65 20 75 6e 69 78 46 65 74 63 68 28 29 20 69  he unixFetch() i
27a10 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a  nvocation. .**.*
27a20 2a 20 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69  * Or, if the thi
27a30 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e  rd argument is N
27a40 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66  ULL, then this f
27a50 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  unction is being
27a60 20 63 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69   called .** to i
27a70 6e 66 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61  nform the VFS la
27a80 79 65 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64  yer that, accord
27a90 69 6e 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e  ing to POSIX, an
27aa0 79 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  y existing mappi
27ab0 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62  ng .** may now b
27ac0 65 20 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68  e invalid and sh
27ad0 6f 75 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64  ould be unmapped
27ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27af0 75 6e 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69  unixUnfetch(sqli
27b00 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36  te3_file *fd, i6
27b10 34 20 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29  4 iOff, void *p)
27b20 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
27b30 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
27b40 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
27b50 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
27b60 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
27b70 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
27b80 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   */.  UNUSED_PAR
27b90 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20  AMETER(iOff);.. 
27ba0 20 2f 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d   /* If p==0 (unm
27bb0 61 70 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ap the entire fi
27bc0 6c 65 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d  le) then there m
27bd0 75 73 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61  ust be no outsta
27be0 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74  nding .  ** xFet
27bf0 63 68 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f  ch references. O
27c00 72 2c 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e  r, if p!=0 (mean
27c10 69 6e 67 20 69 74 20 69 73 20 61 6e 20 78 46 65  ing it is an xFe
27c20 74 63 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a  tch reference),.
27c30 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20    ** then there 
27c40 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
27c50 20 6f 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   one outstanding
27c60 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27c70 28 70 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46  (p==0)==(pFd->nF
27c80 65 74 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a  etchOut==0) );..
27c90 20 20 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74    /* If p!=0, it
27ca0 20 6d 75 73 74 20 6d 61 74 63 68 20 74 68 65 20   must match the 
27cb0 69 4f 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20  iOff value. */. 
27cc0 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c   assert( p==0 ||
27cd0 20 70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d   p==&((u8 *)pFd-
27ce0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66  >pMapRegion)[iOf
27cf0 66 5d 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29  f] );..  if( p )
27d00 7b 0a 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63  {.    pFd->nFetc
27d10 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b  hOut--;.  }else{
27d20 0a 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69  .    unixUnmapfi
27d30 6c 65 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20  le(pFd);.  }..  
27d40 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
27d50 74 63 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c  tchOut>=0 );.#el
27d60 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
27d70 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
27d80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
27d90 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
27da0 45 54 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64  ETER(iOff);.#end
27db0 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
27dc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
27dd0 48 65 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d  Here ends the im
27de0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
27df0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  all sqlite3_file
27e00 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a   methods..**.***
27e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e20 2a 2a 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f  *** End sqlite3_
27e30 66 69 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a  file Methods ***
27e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
27e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
27ea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
27eb0 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
27ec0 6e 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e  n contains defin
27ed0 69 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65  itions of sqlite
27ee0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
27ef0 65 63 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70  ects that.** imp
27f00 6c 65 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66  lement various f
27f10 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  ile locking stra
27f20 74 65 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f  tegies.  It also
27f30 20 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69   contains defini
27f40 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e  tions.** of "fin
27f50 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20  der" functions. 
27f60 20 41 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69   A finder-functi
27f70 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f  on is used to lo
27f80 63 61 74 65 20 74 68 65 20 61 70 70 72 6f 70 72  cate the appropr
27f90 69 61 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  iate.** sqlite3_
27fa0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
27fb0 74 20 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c  t for a particul
27fc0 61 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ar database file
27fd0 2e 20 20 54 68 65 20 70 41 70 70 44 61 74 61 0a  .  The pAppData.
27fe0 2a 2a 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  ** field of the 
27ff0 73 71 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20  sqlite3_vfs VFS 
28000 6f 62 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74  objects are init
28010 69 61 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f  ialized to be po
28020 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65  inters to.** the
28030 20 63 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d   correct finder-
28040 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61  function for tha
28050 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  t VFS..**.** Mos
28060 74 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  t finder functio
28070 6e 73 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  ns return a poin
28080 74 65 72 20 74 6f 20 61 20 66 69 78 65 64 20 73  ter to a fixed s
28090 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
280a0 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68  s.** object.  Th
280b0 65 20 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69  e only interesti
280c0 6e 67 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  ng finder-functi
280d0 6f 6e 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f  on is autolockIo
280e0 46 69 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a  Finder, which.**
280f0 20 6c 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69   looks at the fi
28100 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e  lesystem type an
28110 64 20 74 72 69 65 73 20 74 6f 20 67 75 65 73 73  d tries to guess
28120 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
28130 67 0a 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72  g.** strategy fr
28140 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46  om that..**.** F
28150 6f 72 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  or finder-functi
28160 6f 6e 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74  on F, two object
28170 73 20 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a  s are created:.*
28180 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20  *.**    (1) The 
28190 72 65 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63  real finder-func
281a0 74 69 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70  tion named "FImp
281b0 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  t()"..**.**    (
281c0 32 29 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f  2) A constant po
281d0 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 66 75  inter to this fu
281e0 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73  nction named jus
281f0 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  t "F"..**.**.** 
28200 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
28210 20 46 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73   F pointer is us
28220 65 64 20 61 73 20 74 68 65 20 70 41 70 70 44 61  ed as the pAppDa
28230 74 61 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53  ta value for VFS
28240 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65  .** objects.  We
28250 20 68 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73   have to do this
28260 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
28270 69 6e 67 20 70 41 70 70 44 61 74 61 20 70 6f 69  ing pAppData poi
28280 6e 74 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61  nt.** directly a
28290 74 20 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e  t the finder-fun
282a0 63 74 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20  ction since C90 
282b0 72 75 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20  rules prevent a 
282c0 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65  void*.** from be
282d0 20 63 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e   cast into a fun
282e0 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a  ction pointer..*
282f0 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73  *.**.** Each ins
28300 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61  tance of this ma
28310 63 72 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77  cro generates tw
28320 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a  o objects:.**.**
28330 20 20 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74     *  A constant
28340 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28350 6f 64 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20  ods object call 
28360 4d 45 54 48 4f 44 20 74 68 61 74 20 68 61 73 20  METHOD that has 
28370 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20  locking.**      
28380 6d 65 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c  methods CLOSE, L
28390 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52  OCK, UNLOCK, CKR
283a0 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20  ESLOCK..**.**   
283b0 2a 20 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64  *  An I/O method
283c0 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
283d0 20 63 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74   called FINDER t
283e0 68 61 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f  hat returns a po
283f0 69 6e 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f  inter.**      to
28400 20 74 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65   the METHOD obje
28410 63 74 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  ct in the previo
28420 75 73 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64  us bullet..*/.#d
28430 65 66 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28  efine IOMETHODS(
28440 46 49 4e 44 45 52 2c 4d 45 54 48 4f 44 2c 56 45  FINDER,METHOD,VE
28450 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b  RSION,CLOSE,LOCK
28460 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53  ,UNLOCK,CKLOCK,S
28470 48 4d 4d 41 50 29 20 20 20 20 20 5c 0a 73 74 61  HMMAP)     \.sta
28480 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
28490 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45 54  3_io_methods MET
284a0 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20 20  HOD = {         
284b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284c0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 56            \.   V
284d0 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20 20  ERSION,         
284e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
284f0 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20  ersion */       
28500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28510 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43 4c           \.   CL
28520 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20 20  OSE,            
28530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
28540 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ose */          
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28560 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28570 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20 20  xRead,          
28580 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65 61           /* xRea
28590 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  d */            
285a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285b0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
285c0 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
285d0 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74          /* xWrit
285e0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 54        \.   unixT
28610 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
28620 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
28630 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ate */          
28640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28650 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 79       \.   unixSy
28660 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nc,             
28670 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
28680 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286a0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
286b0 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
286c0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
286d0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
286e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286f0 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20 20     \.   LOCK,   
28700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28710 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20      /* xLock */ 
28720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28740 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20 20    \.   UNLOCK,  
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
28770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28790 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20 20   \.   CKLOCK,   
287a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287b0 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
287c0 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  vedLock */      
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f 6e  \.   unixFileCon
287f0 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  trol,           
28800 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
28810 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
28830 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53 69  .   unixSectorSi
28840 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
28850 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
28860 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
28880 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68 61     unixDeviceCha
28890 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20 2f  racteristics,  /
288a0 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69 6c  * xDeviceCapabil
288b0 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20 20  ities */        
288c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
288d0 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20 20    SHMMAP,       
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
288f0 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20 20   xShmMap */     
28900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28910 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
28920 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20 20   unixShmLock,   
28930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28940 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  xShmLock */     
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
28970 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c 20  unixShmBarrier, 
28980 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
28990 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20 20  ShmBarrier */   
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
289c0 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20 20  nixShmUnmap,    
289d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
289e0 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20 20  hmUnmap */      
289f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a00 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
28a10 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20 20  ixFetch,        
28a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 65            /* xFe
28a30 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20 20  tch */          
28a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
28a60 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20 20  xUnfetch,       
28a70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 66           /* xUnf
28a80 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
28a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28aa0 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20 20         \.};     
28ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28af0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
28b00 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
28b10 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52 23  methods *FINDER#
28b20 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61 72  #Impl(const char
28b30 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a 70   *z, unixFile *p
28b40 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44 5f  ){   \.  UNUSED_
28b50 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55 4e  PARAMETER(z); UN
28b60 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
28b70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
28b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b90 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20 26      \.  return &
28ba0 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20 20  METHOD;         
28bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28be0 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20 20     \.}          
28bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c30 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
28c40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
28c50 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49 4e  ods *(*const FIN
28c60 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  DER)(const char*
28c70 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20 20  ,unixFile *p)   
28c80 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52 23   \.    = FINDER#
28c90 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65  #Impl;../*.** He
28ca0 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74 68  re are all of th
28cb0 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
28cc0 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  hods objects for
28cd0 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
28ce0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
28cf0 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20 74  es.  Functions t
28d00 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  hat return point
28d10 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65 74  ers to these met
28d20 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73 6f  hods.** are also
28d30 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d   created..*/.IOM
28d40 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78 49  ETHODS(.  posixI
28d50 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
28d60 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
28d70 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
28d80 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 2c   posixIoMethods,
28d90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
28da0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
28db0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
28dc0 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20 20    3,            
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
28de0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e 64  hared memory and
28df0 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c 65   mmap are enable
28e00 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65  d */.  unixClose
28e10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
28e30 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c  d */.  unixLock,
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e50 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
28e60 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b   */.  unixUnlock
28e70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28e80 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
28e90 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
28ea0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
28eb0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
28ec0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
28ed0 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20  .  unixShmMap   
28ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28ef0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
28f00 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
28f10 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c   nolockIoFinder,
28f20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
28f30 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
28f40 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f  me */.  nolockIo
28f50 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
28f60 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
28f70 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
28f80 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20  ame */.  3,     
28f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fa0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
28fb0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
28fc0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
28fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
28fe0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
28ff0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
29000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29010 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
29020 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
29030 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29040 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
29050 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
29060 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f  ReservedLock,  /
29070 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
29080 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
29090 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
290a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
290b0 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
290c0 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
290d0 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
290e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
290f0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
29100 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
29110 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
29120 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
29130 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
29140 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29160 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29170 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29180 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
29190 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
291a0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
291b0 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
291c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
291d0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
291e0 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
291f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29200 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
29210 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
29220 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20  eservedLock, /* 
29230 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29240 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
29250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29260 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29270 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
29280 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
29290 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
292a0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
292b0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
292c0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
292d0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
292e0 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
292f0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
29300 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
29310 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
29320 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
29330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29340 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
29350 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
29360 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
29370 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
29380 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
29390 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
293a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
293b0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
293c0 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
293d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
293e0 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
293f0 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
29400 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78  rvedLock,   /* x
29410 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
29420 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
29430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29440 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
29450 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
29460 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58  endif..#if OS_VX
29470 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28  WORKS.IOMETHODS(
29480 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20  .  semIoFinder, 
29490 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
294a0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
294b0 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d  name */.  semIoM
294c0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
294d0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
294e0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
294f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
29520 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
29530 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c 6f 73 65  d */.  semXClose
29540 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
29550 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
29560 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f 63 6b 2c  d */.  semXLock,
29570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29580 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
29590 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c 6f 63 6b   */.  semXUnlock
295a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
295b0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
295c0 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68 65 63 6b  d */.  semXCheck
295d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
295e0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
295f0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
29600 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29620 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
29630 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  /.).#endif..#if 
29640 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
29650 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
29660 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
29670 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61  E.IOMETHODS(.  a
29680 66 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  fpIoFinder,     
29690 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
296a0 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
296b0 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f   */.  afpIoMetho
296c0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
296d0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
296e0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
296f0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
29720 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
29730 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20  .  afpClose,    
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29750 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
29760 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20  .  afpLock,     
29770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29780 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
29790 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20    afpUnlock,    
297a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
297b0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
297c0 0a 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72  .  afpCheckReser
297d0 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20  vedLock,     /* 
297e0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
297f0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29810 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
29820 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
29830 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
29840 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  e proxy locking 
29850 6d 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70  method is a "sup
29860 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68  er-method" in th
29870 65 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a  e sense that it.
29880 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61  ** opens seconda
29890 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
298a0 6f 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  ors for the conc
298b0 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73  h and lock files
298c0 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20   and.** it uses 
298d0 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c  proxy, dot-file,
298e0 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28   AFP, and flock(
298f0 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  ) locking method
29900 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65  s on those.** se
29910 63 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20  condary files.  
29920 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
29930 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68   the division th
29940 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a  at implements.**
29950 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69   proxy locking i
29960 73 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66  s located much f
29970 75 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74  urther down in t
29980 68 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65  he file.  But we
29990 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61   need.** to go a
299a0 68 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20  head and define 
299b0 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  the sqlite3_io_m
299c0 65 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65  ethods and finde
299d0 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  r function.** fo
299e0 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20  r proxy locking 
299f0 68 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72  here.  So we for
29a00 77 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65  ward declare the
29a10 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f   I/O methods..*/
29a20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
29a30 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
29a40 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29a50 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
29a60 74 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c  t proxyClose(sql
29a70 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
29a80 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
29a90 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
29aa0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
29ab0 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71  t proxyUnlock(sq
29ac0 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74  lite3_file*, int
29ad0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
29ae0 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
29af0 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
29b00 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54  e*, int*);.IOMET
29b10 48 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46  HODS(.  proxyIoF
29b20 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
29b30 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63    /* Finder func
29b40 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70  tion name */.  p
29b50 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20  roxyIoMethods,  
29b60 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
29b70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
29b80 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
29b90 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
29ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
29bb0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
29bc0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
29bd0 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
29be0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
29bf0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29c00 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
29c10 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29c20 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
29c30 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
29c40 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
29c50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
29c60 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
29c70 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck,   /* xCheckR
29c80 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
29c90 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
29ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29cb0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
29cc0 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a  hod */.).#endif.
29cd0 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e  ./* nfs lockd on
29ce0 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e   OSX 10.3+ doesn
29cf0 27 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c  't clear write l
29d00 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64  ocks when a read
29d10 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a   lock is set */.
29d20 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
29d30 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
29d40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
29d50 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
29d60 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20  .  nfsIoFinder, 
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29d80 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   Finder function
29d90 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f   name */.  nfsIo
29da0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
29db0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
29dc0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
29dd0 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20  ct name */.  1, 
29de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29df0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
29e00 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
29e10 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c  bled */.  unixCl
29e20 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
29e30 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
29e40 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
29e50 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
29e60 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
29e70 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e  ethod */.  nfsUn
29e80 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
29e90 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
29ea0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
29eb0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
29ec0 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
29ed0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
29ee0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
29ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f00 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
29f10 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
29f20 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
29f30 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
29f40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
29f50 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a  ING_STYLE./* .**
29f60 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66   This "finder" f
29f70 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73  unction attempts
29f80 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
29f90 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73  e best locking s
29fa0 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20  trategy .** for 
29fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29fc0 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49  e "filePath".  I
29fd0 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74  t then returns t
29fe0 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
29ff0 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20  thods.** object 
2a000 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
2a010 74 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a  that strategy..*
2a020 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72  *.** This is for
2a030 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f   MacOSX only..*/
2a040 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
2a050 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
2a060 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
2a070 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
2a080 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
2a090 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
2a0a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2a0b0 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
2a0c0 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
2a0d0 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63   open file objec
2a0e0 74 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  t for the databa
2a0f0 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  se file */.){.  
2a100 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2a110 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20  uct Mapping {.  
2a120 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2a130 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20  ilesystem;      
2a140 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73          /* Files
2a150 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20  ystem type name 
2a160 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c  */.    const sql
2a170 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
2a180 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20  *pMethods;   /* 
2a190 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b  Appropriate lock
2a1a0 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ing method */.  
2a1b0 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20  } aMap[] = {.   
2a1c0 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f   { "hfs",    &po
2a1d0 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  sixIoMethods },.
2a1e0 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20      { "ufs",    
2a1f0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
2a200 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22  },.    { "afpfs"
2a210 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73  ,  &afpIoMethods
2a220 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73   },.    { "smbfs
2a230 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64  ",  &afpIoMethod
2a240 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64  s },.    { "webd
2a250 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  av", &nolockIoMe
2a260 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30  thods },.    { 0
2a270 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
2a280 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61   i;.  struct sta
2a290 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74  tfs fsInfo;.  st
2a2a0 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
2a2b0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
2a2c0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
2a2d0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
2a2e0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
2a2f0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
2a300 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
2a310 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
2a320 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
2a330 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
2a340 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
2a350 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20  oMethods;.  }.  
2a360 69 66 28 20 73 74 61 74 66 73 28 66 69 6c 65 50  if( statfs(fileP
2a370 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d  ath, &fsInfo) !=
2a380 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66   -1 ){.    if( f
2a390 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20  sInfo.f_flags & 
2a3a0 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20  MNT_RDONLY ){.  
2a3b0 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2a3c0 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20  ckIoMethods;.   
2a3d0 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
2a3e0 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73  aMap[i].zFilesys
2a3f0 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  tem; i++){.     
2a400 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
2a410 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2a420 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79   aMap[i].zFilesy
2a430 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20  stem)==0 ){.    
2a440 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b      return aMap[
2a450 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20  i].pMethods;.   
2a460 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
2a470 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73    /* Default cas
2a480 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e  e. Handles, amon
2a490 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73  gst others, "nfs
2a4a0 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74  "..  ** Test byt
2a4b0 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69  e-range lock usi
2a4c0 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74  ng fcntl(). If t
2a4d0 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73  he call succeeds
2a4e0 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  , .  ** assume t
2a4f0 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73  hat the file-sys
2a500 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53  tem supports POS
2a510 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20  IX style locks. 
2a520 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
2a530 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
2a540 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
2a550 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
2a560 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
2a570 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
2a580 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
2a590 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
2a5a0 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
2a5b0 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
2a5c0 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  ) {.    if( strc
2a5d0 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
2a5e0 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d  pename, "nfs")==
2a5f0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
2a600 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b  n &nfsIoMethods;
2a610 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
2a620 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69      return &posi
2a630 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20  xIoMethods;.    
2a640 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
2a650 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f  eturn &dotlockIo
2a660 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2a670 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2a680 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2a690 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c    *(*const autol
2a6a0 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e  ockIoFinder)(con
2a6b0 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c  st char*,unixFil
2a6c0 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f  e*) = autolockIo
2a6d0 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
2a6e0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
2a6f0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2a700 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2a710 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
2a720 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 0a 2a   OS_VXWORKS./*.*
2a730 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22 20  * This "finder" 
2a740 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56 78 57  function for VxW
2a750 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f 20 73  orks checks to s
2a760 65 65 20 69 66 20 70 6f 73 69 78 20 61 64 76 69  ee if posix advi
2a770 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20  sory.** locking 
2a780 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20 64 6f  works.  If it do
2a790 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73  es, then that is
2a7a0 20 77 68 61 74 20 69 73 20 75 73 65 64 2e 20 20   what is used.  
2a7b0 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a 2a  If it does not.*
2a7c0 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66 61 6c  * work, then fal
2a7d0 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64 20 73  lback to named s
2a7e0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2a7f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
2a800 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
2a810 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49 6f 46  hods *vxworksIoF
2a820 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
2a830 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
2a840 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
2a850 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a860 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
2a870 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
2a880 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   /* the open fil
2a890 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  e object */.){. 
2a8a0 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
2a8b0 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
2a8c0 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
2a8d0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
2a8e0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
2a8f0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2a900 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
2a910 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
2a920 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
2a930 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
2a940 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
2a950 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
2a960 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66 20 66  ..  /* Test if f
2a970 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70 6f 72  cntl() is suppor
2a980 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f 53 49  ted and use POSI
2a990 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20  X style locks.. 
2a9a0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 66 61   ** Otherwise fa
2a9b0 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6e  ll back to the n
2a9c0 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6d  amed semaphore m
2a9d0 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  ethod..  */.  lo
2a9e0 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31  ckInfo.l_len = 1
2a9f0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73  ;.  lockInfo.l_s
2aa00 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b  tart = 0;.  lock
2aa10 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  Info.l_whence = 
2aa20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b  SEEK_SET;.  lock
2aa30 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  Info.l_type = F_
2aa40 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46  RDLCK;.  if( osF
2aa50 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f  cntl(pNew->h, F_
2aa60 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f  GETLK, &lockInfo
2aa70 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 72 65  )!=-1 ) {.    re
2aa80 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
2aa90 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  hods;.  }else{. 
2aaa0 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d 49 6f     return &semIo
2aab0 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73  Methods;.  }.}.s
2aac0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
2aad0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a  te3_io_methods .
2aae0 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77 6f 72    *(*const vxwor
2aaf0 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73  ksIoFinder)(cons
2ab00 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
2ab10 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f 46 69  *) = vxworksIoFi
2ab20 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
2ab30 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20  f /* OS_VXWORKS 
2ab40 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73  */../*.** An abs
2ab50 74 72 61 63 74 20 74 79 70 65 20 66 6f 72 20 61  tract type for a
2ab60 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49   pointer to an I
2ab70 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20  O method finder 
2ab80 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70  function:.*/.typ
2ab90 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74  edef const sqlit
2aba0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28  e3_io_methods *(
2abb0 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f  *finder_type)(co
2abc0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
2abd0 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  le*);.../*******
2abe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2abf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac20 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
2ac30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac40 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  ** sqlite3_vfs m
2ac50 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
2ac60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac70 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64  ***.**.** This d
2ac80 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
2ac90 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2aca0 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f  ion of methods o
2acb0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
2acc0 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  _vfs object..*/.
2acd0 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
2ace0 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
2acf0 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  f the unixFile s
2ad00 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64  tructure pointed
2ad10 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73   to by pId..*/.s
2ad20 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e  tatic int fillIn
2ad30 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69  UnixFile(.  sqli
2ad40 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20  te3_vfs *pVfs,  
2ad50 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ad60 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a  o vfs object */.
2ad70 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20    int h,        
2ad80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
2ad90 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
2ada0 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20  r of file being 
2adb0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69  opened */.  sqli
2adc0 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20  te3_file *pId,  
2add0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20      /* Write to 
2ade0 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
2adf0 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20  ucture here */. 
2ae00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2ae10 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65  lename,  /* Name
2ae20 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62 65 69   of the file bei
2ae30 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69  ng opened */.  i
2ae40 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20  nt ctrlFlags    
2ae50 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f         /* Zero o
2ae60 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f  r more UNIXFILE_
2ae70 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20  * values */.){. 
2ae80 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
2ae90 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b  o_methods *pLock
2aea0 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78  ingStyle;.  unix
2aeb0 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e  File *pNew = (un
2aec0 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20  ixFile *)pId;.  
2aed0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2aee0 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
2aef0 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c  New->pInode==NUL
2af00 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c  L );..  /* Usual
2af10 6c 79 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c  ly the path zFil
2af20 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74  ename should not
2af30 20 62 65 20 61 20 72 65 6c 61 74 69 76 65 20 70   be a relative p
2af40 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a  athname. The.  *
2af50 2a 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77  * exception is w
2af60 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  hen opening the 
2af70 70 72 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69  proxy "conch" fi
2af80 6c 65 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61  le in builds tha
2af90 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74  t.  ** include t
2afa0 68 65 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65  he special Apple
2afb0 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e   locking styles.
2afc0 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  .  */.#if define
2afd0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
2afe0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2aff0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73  CKING_STYLE.  as
2b000 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
2b010 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
2b020 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20  0]=='/' .    || 
2b030 70 56 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d  pVfs->pAppData==
2b040 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b  (void*)&autolock
2b050 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73  IoFinder );.#els
2b060 65 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  e.  assert( zFil
2b070 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c  ename==0 || zFil
2b080 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b  ename[0]=='/' );
2b090 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f  .#endif..  /* No
2b0a0 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20   locking occurs 
2b0b0 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  in temporary fil
2b0c0 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  es */.  assert( 
2b0d0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20  zFilename!=0 || 
2b0e0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
2b0f0 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30  XFILE_NOLOCK)!=0
2b100 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28   );..  OSTRACE((
2b110 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73  "OPEN    %-3d %s
2b120 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d  \n", h, zFilenam
2b130 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d  e));.  pNew->h =
2b140 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73   h;.  pNew->pVfs
2b150 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d   = pVfs;.  pNew-
2b160 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61  >zPath = zFilena
2b170 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c  me;.  pNew->ctrl
2b180 46 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c  Flags = (u8)ctrl
2b190 46 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54  Flags;.#if SQLIT
2b1a0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
2b1b0 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69  0.  pNew->mmapSi
2b1c0 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47  zeMax = sqlite3G
2b1d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d  lobalConfig.szMm
2b1e0 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28  ap;.#endif.  if(
2b1f0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f   sqlite3_uri_boo
2b200 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73  lean(((ctrlFlags
2b210 20 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29   & UNIXFILE_URI)
2b220 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30   ? zFilename : 0
2b230 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
2b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
2b250 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57  sow", SQLITE_POW
2b260 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2b270 29 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  ) ){.    pNew->c
2b280 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
2b290 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20  FILE_PSOW;.  }. 
2b2a0 20 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73   if( strcmp(pVfs
2b2b0 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78  ->zName,"unix-ex
2b2c0 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  cl")==0 ){.    p
2b2d0 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  New->ctrlFlags |
2b2e0 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b  = UNIXFILE_EXCL;
2b2f0 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2b300 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64  ORKS.  pNew->pId
2b310 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69   = vxworksFindFi
2b320 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  leId(zFilename);
2b330 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64  .  if( pNew->pId
2b340 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46  ==0 ){.    ctrlF
2b350 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2b360 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20  _NOLOCK;.    rc 
2b370 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2b380 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
2b390 28 20 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ( ctrlFlags & UN
2b3a0 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b  IXFILE_NOLOCK ){
2b3b0 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79  .    pLockingSty
2b3c0 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  le = &nolockIoMe
2b3d0 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a  thods;.  }else{.
2b3e0 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c      pLockingStyl
2b3f0 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74  e = (**(finder_t
2b400 79 70 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44  ype*)pVfs->pAppD
2b410 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  ata)(zFilename, 
2b420 70 4e 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54  pNew);.#if SQLIT
2b430 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2b440 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61  _STYLE.    /* Ca
2b450 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e  che zFilename in
2b460 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e   the locking con
2b470 74 65 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f  text (AFP and do
2b480 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20  tlock override) 
2b490 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79  for.    ** proxy
2b4a0 4c 6f 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20  Lock activation 
2b4b0 69 73 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d  is possible (rem
2b4c0 6f 74 65 20 70 72 6f 78 79 20 69 73 20 62 61 73  ote proxy is bas
2b4d0 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20  ed on db name). 
2b4e0 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     ** zFilename 
2b4f0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
2b500 74 69 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  til file is clos
2b510 65 64 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a  ed, to support *
2b520 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  /.    pNew->lock
2b530 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f  ingContext = (vo
2b540 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23  id*)zFilename;.#
2b550 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28  endif.  }..  if(
2b560 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
2b570 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  = &posixIoMethod
2b580 73 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  s.#if defined(__
2b590 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
2b5a0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
2b5b0 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70  G_STYLE.    || p
2b5c0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2b5d0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65  &nfsIoMethods.#e
2b5e0 6e 64 69 66 0a 20 20 29 7b 0a 20 20 20 20 75 6e  ndif.  ){.    un
2b5f0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2b600 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f      rc = findIno
2b610 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e  deInfo(pNew, &pN
2b620 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20  ew->pInode);.   
2b630 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2b640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  OK ){.      /* I
2b650 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2b660 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65  red in findInode
2b670 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68  Info(), close th
2b680 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
2b690 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64  r.      ** immed
2b6a0 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72  iately, before r
2b6b0 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74  eleasing the mut
2b6c0 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  ex. findInodeInf
2b6d0 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20  o() may fail.   
2b6e0 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65     ** in two sce
2b6f0 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a  narios:.      **
2b700 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20  .      **   (a) 
2b710 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28  A call to fstat(
2b720 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  ) failed..      
2b730 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f  **   (b) A mallo
2b740 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20  c failed..      
2b750 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e  **.      ** Scen
2b760 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c  ario (b) may onl
2b770 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  y occur if the p
2b780 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e  rocess is holdin
2b790 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20  g no other.     
2b7a0 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
2b7b0 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  tors open on the
2b7c0 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74   same file. If t
2b7d0 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72 20  here were other 
2b7e0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
2b7f0 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69  scriptors on thi
2b800 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20  s file, then no 
2b810 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20  malloc would be 
2b820 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20  required by.    
2b830 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e    ** findInodeIn
2b840 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69 73  fo(). If this is
2b850 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69 73   the case, it is
2b860 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20 63   quite safe to c
2b870 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61  lose.      ** ha
2b880 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69  ndle h - as it i
2b890 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
2b8a0 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73  t no posix locks
2b8b0 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65   will be release
2b8c0 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f  d.      ** by do
2b8d0 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a  ing so..      **
2b8e0 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65  .      ** If sce
2b8f0 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65 64  nario (a) caused
2b900 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20   the error then 
2b910 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73  things are not s
2b920 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20  o safe. The.    
2b930 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73    ** implicit as
2b940 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73  sumption here is
2b950 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28 29   that if fstat()
2b960 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61   fails, things a
2b970 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73  re in.      ** s
2b980 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74 68  uch bad shape th
2b990 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f  at dropping a lo
2b9a0 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27  ck or two doesn'
2b9b0 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20  t matter much.. 
2b9c0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f       */.      ro
2b9d0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
2b9e0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
2b9f0 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20       h = -1;.   
2ba00 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2ba10 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69  Mutex();.  }..#i
2ba20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ba30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
2ba40 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2ba50 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70  __).  else if( p
2ba60 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2ba70 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b  &afpIoMethods ){
2ba80 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b  .    /* AFP lock
2ba90 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69 6c  ing uses the fil
2baa0 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65  e path so it nee
2bab0 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ds to be include
2bac0 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  d in.    ** the 
2bad0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
2bae0 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66  t..    */.    af
2baf0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
2bb00 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d  *pCtx;.    pNew-
2bb10 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  >lockingContext 
2bb20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33  = pCtx = sqlite3
2bb30 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
2bb40 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
2bb50 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
2bb60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2bb70 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
2bb80 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
2bb90 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
2bba0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
2bbb0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
2bbc0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
2bbd0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
2bbe0 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
2bbf0 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
2bc00 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
2bc10 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
2bc20 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
2bc30 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
2bc40 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
2bc50 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
2bc60 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
2bc70 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
2bc80 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
2bc90 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
2bca0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
2bcb0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
2bcc0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
2bcd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2bce0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
2bcf0 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
2bd00 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
2bd10 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
2bd20 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
2bd30 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
2bd40 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
2bd50 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
2bd60 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
2bd70 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
2bd80 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
2bd90 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
2bda0 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
2bdb0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
2bdc0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
2bdd0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
2bde0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
2bdf0 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
2be00 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
2be10 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
2be20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
2be30 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
2be40 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
2be50 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
2be60 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
2be70 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
2be80 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
2be90 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
2bea0 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
2beb0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
2bec0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
2bed0 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
2bee0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2bef0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2bf00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2bf10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
2bf20 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
2bf30 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
2bf40 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
2bf50 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
2bf60 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
2bf70 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
2bf80 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
2bf90 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
2bfa0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
2bfb0 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
2bfc0 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
2bfd0 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
2bfe0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
2bff0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
2c000 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
2c010 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
2c020 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
2c030 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
2c040 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
2c050 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
2c060 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
2c070 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
2c080 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
2c090 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
2c0a0 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
2c0b0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
2c0c0 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
2c0d0 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
2c0e0 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
2c0f0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2c100 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
2c110 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
2c120 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
2c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2c140 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
2c150 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
2c160 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
2c170 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
2c180 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
2c190 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
2c1a0 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
2c1b0 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
2c1c0 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
2c1d0 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
2c1e0 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
2c1f0 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
2c200 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
2c210 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
2c220 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2c230 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2c240 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
2c250 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
2c260 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
2c270 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2c280 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
2c290 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61 73  if.  .  storeLas
2c2a0 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29 3b  tErrno(pNew, 0);
2c2b0 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
2c2c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c2d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
2c2e0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
2c2f0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
2c300 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20 2d  NE__);.    h = -
2c310 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  1;.    osUnlink(
2c320 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2c330 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
2c340 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45  |= UNIXFILE_DELE
2c350 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  TE;.  }.#endif. 
2c360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c370 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68 3e  OK ){.    if( h>
2c380 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73  =0 ) robust_clos
2c390 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
2c3a0 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E__);.  }else{. 
2c3b0 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64     pNew->pMethod
2c3c0 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65   = pLockingStyle
2c3d0 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65  ;.    OpenCounte
2c3e0 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69 66  r(+1);.    verif
2c3f0 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a 20  yDbFile(pNew);. 
2c400 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c410 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2c420 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  the name of a di
2c430 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63 68  rectory in which
2c440 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61 72   to put temporar
2c450 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e  y files..** If n
2c460 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70 6f  o suitable tempo
2c470 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63 74  rary file direct
2c480 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  ory can be found
2c490 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a  , return NULL..*
2c4a0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
2c4b0 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69 6c  har *unixTempFil
2c4c0 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73 74  eDir(void){.  st
2c4d0 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
2c4e0 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20  *azDirs[] = {.  
2c4f0 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20     0,.     0,.  
2c500 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20     "/var/tmp",. 
2c510 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a      "/usr/tmp",.
2c520 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20       "/tmp",.   
2c530 20 20 22 2e 22 0a 20 20 7d 3b 0a 20 20 75 6e 73    ".".  };.  uns
2c540 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73  igned int i;.  s
2c550 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
2c560 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c570 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d  ir = sqlite3_tem
2c580 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20  p_directory;..  
2c590 69 66 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29  if( !azDirs[0] )
2c5a0 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74   azDirs[0] = get
2c5b0 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44  env("SQLITE_TMPD
2c5c0 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44  IR");.  if( !azD
2c5d0 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b  irs[1] ) azDirs[
2c5e0 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  1] = getenv("TMP
2c5f0 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
2c600 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
2c610 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
2c620 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
2c630 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
2c640 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
2c650 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
2c660 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
2c670 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c680 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
2c690 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
2c6a0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
2c6b0 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
2c6c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2c6d0 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
2c6e0 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
2c6f0 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
2c700 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
2c710 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
2c720 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
2c730 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
2c740 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
2c750 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
2c760 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
2c770 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
2c780 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
2c790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2c7a0 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
2c7b0 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
2c7c0 66 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  f){.  const char
2c7d0 20 2a 7a 44 69 72 3b 0a 20 20 69 6e 74 20 69 4c   *zDir;.  int iL
2c7e0 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  imit = 0;..  /* 
2c7f0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
2c800 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
2c810 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
2c820 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
2c830 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
2c840 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
2c850 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
2c860 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
2c870 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
2c880 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20  tion failing. . 
2c890 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   */.  SimulateIO
2c8a0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
2c8b0 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20  LITE_IOERR );.. 
2c8c0 20 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70   zDir = unixTemp
2c8d0 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 64 6f 7b  FileDir();.  do{
2c8e0 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
2c8f0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2c900 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 20 26 72  ss(sizeof(r), &r
2c910 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6e  );.    assert( n
2c920 42 75 66 3e 32 20 29 3b 0a 20 20 20 20 7a 42 75  Buf>2 );.    zBu
2c930 66 5b 6e 42 75 66 2d 32 5d 20 3d 20 30 3b 0a 20  f[nBuf-2] = 0;. 
2c940 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2c950 6e 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 2c 20  ntf(nBuf, zBuf, 
2c960 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
2c970 5f 46 49 4c 45 5f 50 52 45 46 49 58 22 25 6c 6c  _FILE_PREFIX"%ll
2c980 78 25 63 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x%c",.          
2c990 20 20 20 20 20 20 20 20 20 20 20 7a 44 69 72 2c             zDir,
2c9a0 20 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   r, 0);.    if( 
2c9b0 7a 42 75 66 5b 6e 42 75 66 2d 32 5d 21 3d 30 20  zBuf[nBuf-2]!=0 
2c9c0 7c 7c 20 28 69 4c 69 6d 69 74 2b 2b 29 3e 31 30  || (iLimit++)>10
2c9d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2c9e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 77 68 69 6c 65  _ERROR;.  }while
2c9f0 28 20 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c  ( osAccess(zBuf,
2ca00 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  0)==0 );.  retur
2ca10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ca20 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2ca30 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
2ca40 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2ca50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74  LE__)./*.** Rout
2ca60 69 6e 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d  ine to transform
2ca70 20 61 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f   a unixFile into
2ca80 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67   a proxy-locking
2ca90 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d   unixFile..** Im
2caa0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20  plementation in 
2cab0 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64  the proxy-lock d
2cac0 69 76 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65  ivision, but use
2cad0 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a  d by unixOpen().
2cae0 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45  ** if SQLITE_PRE
2caf0 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  FER_PROXY_LOCKIN
2cb00 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
2cb10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
2cb20 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69  yTransformUnixFi
2cb30 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f  le(unixFile*, co
2cb40 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64  nst char*);.#end
2cb50 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68  if../*.** Search
2cb60 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66   for an unused f
2cb70 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
2cb80 68 61 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  hat was opened o
2cb90 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  n the database .
2cba0 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a  ** file (not a j
2cbb0 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72  ournal or master
2cbc0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69  -journal file) i
2cbd0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 74  dentified by pat
2cbe0 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77  hname.** zPath w
2cbf0 69 74 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ith SQLITE_OPEN_
2cc00 58 58 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69  XXX flags matchi
2cc10 6e 67 20 74 68 6f 73 65 20 70 61 73 73 65 64 20  ng those passed 
2cc20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a  as the second.**
2cc30 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
2cc40 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  s function..**.*
2cc50 2a 20 53 75 63 68 20 61 20 66 69 6c 65 20 64 65  * Such a file de
2cc60 73 63 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69  scriptor may exi
2cc70 73 74 20 69 66 20 61 20 64 61 74 61 62 61 73 65  st if a database
2cc80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20   connection was 
2cc90 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68  closed.** but th
2cca0 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c  e associated fil
2ccb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75  e descriptor cou
2ccc0 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64  ld not be closed
2ccd0 20 62 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a   because some.**
2cce0 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63   other file desc
2ccf0 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74  riptor open on t
2cd00 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20  he same file is 
2cd10 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c  holding a file-l
2cd20 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f  ock..** Refer to
2cd30 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65   comments in the
2cd40 20 75 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e   unixClose() fun
2cd50 63 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65  ction and the le
2cd60 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a  ngthy comment.**
2cd70 20 64 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73   describing "Pos
2cd80 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b  ix Advisory Lock
2cd90 69 6e 67 22 20 61 74 20 74 68 65 20 73 74 61 72  ing" at the star
2cda0 74 20 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66  t of this file f
2cdb0 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64  or .** further d
2cdc0 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69  etails. Also, ti
2cdd0 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a  cket #4018..**.*
2cde0 2a 20 49 66 20 61 20 73 75 69 74 61 62 6c 65 20  * If a suitable 
2cdf0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
2ce00 69 73 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69  is found, then i
2ce10 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  t is returned. I
2ce20 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c  f no.** such fil
2ce30 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
2ce40 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72  located, -1 is r
2ce50 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
2ce60 69 63 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ic UnixUnusedFd 
2ce70 2a 66 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28  *findReusableFd(
2ce80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
2ce90 68 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  h, int flags){. 
2cea0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
2ceb0 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  Unused = 0;..  /
2cec0 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20  * Do not search 
2ced0 66 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69  for an unused fi
2cee0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
2cef0 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65   vxworks. Not be
2cf00 63 61 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72  cause.  ** vxwor
2cf10 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e  ks would not ben
2cf20 65 66 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68  efit from the ch
2cf30 61 6e 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20  ange (it might, 
2cf40 77 65 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c  we're not sure),
2cf50 0a 20 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73  .  ** but becaus
2cf60 65 20 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74  e no way to test
2cf70 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79   it is currently
2cf80 20 61 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69   available. It i
2cf90 73 20 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e  s better .  ** n
2cfa0 6f 74 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b  ot to risk break
2cfb0 69 6e 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70  ing vxworks supp
2cfc0 6f 72 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65  ort for the sake
2cfd0 20 6f 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63   of such an obsc
2cfe0 75 72 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72  ure .  ** featur
2cff0 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56  e.  */.#if !OS_V
2d000 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
2d010 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
2d020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d030 20 52 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74   Results of stat
2d040 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a  () call */..  /*
2d050 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d   A stat() call m
2d060 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69  ay fail for vari
2d070 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20  ous reasons. If 
2d080 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74  this happens, it
2d090 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20   is.  ** almost 
2d0a0 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20  certain that an 
2d0b0 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74  open() call on t
2d0c0 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c  he same path wil
2d0d0 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a  l also fail..  *
2d0e0 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f  * For this reaso
2d0f0 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  n, if an error o
2d100 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74 61  ccurs in the sta
2d110 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69  t() call here, i
2d120 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65  t is.  ** ignore
2d130 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75  d and -1 is retu
2d140 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
2d150 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65   will try to ope
2d160 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a  n a new file.  *
2d170 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20  * descriptor on 
2d180 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66  the same path, f
2d190 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20  ail, and return 
2d1a0 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69  an error to SQLi
2d1b0 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76  te..  **.  ** Ev
2d1c0 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75 65  en if a subseque
2d1d0 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64  nt open() call d
2d1e0 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68 65  oes succeed, the
2d1f0 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66   consequences of
2d200 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68  .  ** not search
2d210 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61 62  ing for a reusab
2d220 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
2d230 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e  or are not dire.
2d240 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73    */.  if( 0==os
2d250 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
2d260 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
2d270 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
2d280 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  ;..    unixEnter
2d290 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e  Mutex();.    pIn
2d2a0 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
2d2b0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f  .    while( pIno
2d2c0 64 65 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66  de && (pInode->f
2d2d0 69 6c 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74  ileId.dev!=sStat
2d2e0 2e 73 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20  .st_dev.        
2d2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
2d300 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69  pInode->fileId.i
2d310 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f  no!=sStat.st_ino
2d320 29 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f  ) ){.       pIno
2d330 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
2d340 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  xt;.    }.    if
2d350 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20  ( pInode ){.    
2d360 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
2d370 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  *pp;.      for(p
2d380 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  p=&pInode->pUnus
2d390 65 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29  ed; *pp && (*pp)
2d3a0 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20  ->flags!=flags; 
2d3b0 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78  pp=&((*pp)->pNex
2d3c0 74 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73  t));.      pUnus
2d3d0 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20  ed = *pp;.      
2d3e0 69 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20  if( pUnused ){. 
2d3f0 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e         *pp = pUn
2d400 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  used->pNext;.   
2d410 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
2d420 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2d430 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f  .  }.#endif    /
2d440 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53  * if !OS_VXWORKS
2d450 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e   */.  return pUn
2d460 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  used;.}../*.** T
2d470 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2d480 63 61 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70  called by unixOp
2d490 65 6e 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e  en() to determin
2d4a0 65 20 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69  e the unix permi
2d4b0 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65  ssions.** to cre
2d4c0 61 74 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69  ate new files wi
2d4d0 74 68 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20  th. If no error 
2d4e0 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c  occurs, then SQL
2d4f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
2d500 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75  ed.** and a valu
2d510 65 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70  e suitable for p
2d520 61 73 73 69 6e 67 20 61 73 20 74 68 65 20 74 68  assing as the th
2d530 69 72 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ird argument to 
2d540 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72  open(2) is.** wr
2d550 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e  itten to *pMode.
2d560 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
2d570 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74  occurs, an SQLit
2d580 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2d590 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
2d5a0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70   the value of *p
2d5b0 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69  Mode is not modi
2d5c0 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d  fied..**.** In m
2d5d0 6f 73 74 20 63 61 73 65 73 2c 20 74 68 69 73 20  ost cases, this 
2d5e0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d  routine sets *pM
2d5f0 6f 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20  ode to 0, which 
2d600 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61  will become.** a
2d610 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
2d620 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f  robust_open() to
2d630 20 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65   create the file
2d640 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
2d650 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
2d660 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74  RMISSIONS adjust
2d670 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e  ed by the umask.
2d680 0a 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66  .** But if the f
2d690 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
2d6a0 20 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67   is a WAL or reg
2d6b0 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ular journal fil
2d6c0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
2d6d0 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65   function querie
2d6e0 73 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  s the file-syste
2d6f0 6d 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73  m for the permis
2d700 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a  sions on the .**
2d710 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
2d720 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
2d730 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20   sets *pMode to 
2d740 74 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e  this value. When
2d750 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c  ever .** possibl
2d760 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e  e, WAL and journ
2d770 61 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65  al files are cre
2d780 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73  ated using the s
2d790 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  ame permissions 
2d7a0 0a 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63  .** as the assoc
2d7b0 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
2d7c0 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ile..**.** If th
2d7d0 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
2d7e0 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e  8_3_NAMES option
2d7f0 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
2d800 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61  n the.** origina
2d810 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e  l filename is un
2d820 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20  available.  But 
2d830 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c  8_3_NAMES is onl
2d840 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41  y used for.** FA
2d850 54 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e  T filesystems an
2d860 64 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f  d permissions do
2d870 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72   not matter ther
2d880 65 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a  e, so just use.*
2d890 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65  * the default pe
2d8a0 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  rmissions..*/.st
2d8b0 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65  atic int findCre
2d8c0 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63  ateFileMode(.  c
2d8d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2d8e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2d8f0 2a 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28  * Path of file (
2d900 70 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20  possibly) being 
2d910 63 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74  created */.  int
2d920 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
2d930 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d940 46 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20  Flags passed as 
2d950 34 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  4th argument to 
2d960 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64  xOpen() */.  mod
2d970 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20  e_t *pMode,     
2d980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d990 4f 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73  OUT: Permissions
2d9a0 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69   to open file wi
2d9b0 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70  th */.  uid_t *p
2d9c0 55 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uid,            
2d9d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2d9e0 75 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  uid to set on th
2d9f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
2da00 74 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20  t *pGid         
2da10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2da20 55 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f  UT: gid to set o
2da30 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  n the file */.){
2da40 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2da50 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2da60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
2da70 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20  e */.  *pMode = 
2da80 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a  0;.  *pUid = 0;.
2da90 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69    *pGid = 0;.  i
2daa0 66 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49  f( flags & (SQLI
2dab0 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49  TE_OPEN_WAL|SQLI
2dac0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
2dad0 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61  RNAL) ){.    cha
2dae0 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41  r zDb[MAX_PATHNA
2daf0 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61  ME+1];     /* Da
2db00 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68  tabase file path
2db10 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b   */.    int nDb;
2db20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2db40 6f 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69  of valid bytes i
2db50 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72  n zDb */.    str
2db60 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20  uct stat sStat; 
2db70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2db80 74 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f  tput of stat() o
2db90 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2dba0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68  */..    /* zPath
2dbb0 20 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20   is a path to a 
2dbc0 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  WAL or journal f
2dbd0 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ile. The followi
2dbe0 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73  ng block derives
2dbf0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68  .    ** the path
2dc00 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
2dc10 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
2dc20 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69   from zPath. Thi
2dc30 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a  s block handles.
2dc40 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f      ** the follo
2dc50 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76  wing naming conv
2dc60 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a  entions:.    **.
2dc70 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2dc80 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a  to db>-journal".
2dc90 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
2dca0 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20  to db>-wal".    
2dcb0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
2dcc0 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20  b>-journalNN".  
2dcd0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
2dce0 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20   db>-walNN".    
2dcf0 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20  **.    ** where 
2dd00 4e 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20  NN is a decimal 
2dd10 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e  number. The NN n
2dd20 61 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72  aming schemes ar
2dd30 65 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62  e .    ** used b
2dd40 79 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69  y the test_multi
2dd50 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20  plex.c module.. 
2dd60 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20     */.    nDb = 
2dd70 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
2dd80 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66  zPath) - 1; .#if
2dd90 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
2dda0 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20  E_8_3_NAMES.    
2ddb0 77 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20  while( nDb>0 && 
2ddc0 73 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a  sqlite3Isalnum(z
2ddd0 50 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62  Path[nDb]) ) nDb
2dde0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d  --;.    if( nDb=
2ddf0 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d  =0 || zPath[nDb]
2de00 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53  !='-' ) return S
2de10 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a  QLITE_OK;.#else.
2de20 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68      while( zPath
2de30 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20  [nDb]!='-' ){.  
2de40 20 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e      assert( nDb>
2de50 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
2de60 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27  t( zPath[nDb]!='
2de70 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62  \n' );.      nDb
2de80 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  --;.    }.#endif
2de90 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c  .    memcpy(zDb,
2dea0 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20   zPath, nDb);.  
2deb0 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30    zDb[nDb] = '\0
2dec0 27 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f  ';..    if( 0==o
2ded0 73 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61  sStat(zDb, &sSta
2dee0 74 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f  t) ){.      *pMo
2def0 64 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f  de = sStat.st_mo
2df00 64 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20  de & 0777;.     
2df10 20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73   *pUid = sStat.s
2df20 74 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47  t_uid;.      *pG
2df30 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69  id = sStat.st_gi
2df40 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  d;.    }else{.  
2df50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2df60 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
2df70 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66   }.  }else if( f
2df80 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
2df90 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
2dfa0 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d   ){.    *pMode =
2dfb0 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74   0600;.  }.  ret
2dfc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2dfd0 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a   Open the file z
2dfe0 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65  Path..** .** Pre
2dff0 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c  viously, the SQL
2e000 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65  ite OS layer use
2e010 64 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e  d three function
2e020 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68  s in place of th
2e030 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a  is.** one:.**.**
2e040 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
2e050 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a  enReadWrite();.*
2e060 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2e070 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a  penReadOnly();.*
2e080 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f  *     sqlite3OsO
2e090 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a  penExclusive();.
2e0a0 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c  **.** These call
2e0b0 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20  s correspond to 
2e0c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
2e0d0 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c  mbinations of fl
2e0e0 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52  ags:.**.**     R
2e0f0 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20  eadWrite() ->   
2e100 20 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43    (READWRITE | C
2e110 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65  REATE).**     Re
2e120 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20  adOnly()  ->    
2e130 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20   (READONLY) .** 
2e140 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76      OpenExclusiv
2e150 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54  e() -> (READWRIT
2e160 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43  E | CREATE | EXC
2e170 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68  LUSIVE).**.** Th
2e180 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73  e old OpenExclus
2e190 69 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61  ive() accepted a
2e1a0 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e   boolean argumen
2e1b0 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49  t - "delFlag". I
2e1c0 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66  f.** true, the f
2e1d0 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72  ile was configur
2e1e0 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74  ed to be automat
2e1f0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77  ically deleted w
2e200 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  hen the.** file 
2e210 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54  handle closed. T
2e220 6f 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61  o achieve the sa
2e230 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20  me effect using 
2e240 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74  this new .** int
2e250 65 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20  erface, add the 
2e260 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c  DELETEONCLOSE fl
2e270 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63  ag to those spec
2e280 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20  ified above for 
2e290 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  .** OpenExclusiv
2e2a0 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e()..*/.static i
2e2b0 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73  nt unixOpen(.  s
2e2c0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
2e2d0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ,           /* T
2e2e0 68 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68  he VFS for which
2e2f0 20 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70   this is the xOp
2e300 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63  en method */.  c
2e310 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
2e320 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ,           /* P
2e330 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20  athname of file 
2e340 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a  to be opened */.
2e350 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2e360 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f  pFile,         /
2e370 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72  * The file descr
2e380 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c  iptor to be fill
2e390 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66  ed in */.  int f
2e3a0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2e3b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74          /* Input
2e3c0 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f   flags to contro
2e3d0 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f  l the opening */
2e3e0 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67  .  int *pOutFlag
2e3f0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
2e400 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20  /* Output flags 
2e410 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69  returned to SQLi
2e420 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20  te core */.){.  
2e430 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75  unixFile *p = (u
2e440 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b  nixFile *)pFile;
2e450 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20  .  int fd = -1; 
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e470 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2e480 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79  ptor returned by
2e490 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74   open() */.  int
2e4a0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20   openFlags = 0; 
2e4b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2e4c0 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20  lags to pass to 
2e4d0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
2e4e0 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
2e4f0 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
2e500 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
2e510 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 4c 6f  en */.  int noLo
2e520 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
2e530 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2e540 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70  o omit locking p
2e550 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69  rimitives */.  i
2e560 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2e570 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  K;            /*
2e580 20 46 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e   Function Return
2e590 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63   Code */.  int c
2e5a0 74 72 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  trlFlags = 0;   
2e5b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49            /* UNI
2e5c0 58 46 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f  XFILE_* flags */
2e5d0 0a 0a 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73  ..  int isExclus
2e5e0 69 76 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20  ive  = (flags & 
2e5f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
2e600 55 53 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73  USIVE);.  int is
2e610 44 65 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c  Delete     = (fl
2e620 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
2e630 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29  N_DELETEONCLOSE)
2e640 3b 0a 20 20 69 6e 74 20 69 73 43 72 65 61 74 65  ;.  int isCreate
2e650 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
2e660 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2e670 54 45 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  TE);.  int isRea
2e680 64 6f 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73  donly   = (flags
2e690 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
2e6a0 45 41 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  EADONLY);.  int 
2e6b0 69 73 52 65 61 64 57 72 69 74 65 20 20 3d 20 28  isReadWrite  = (
2e6c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
2e6d0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a  PEN_READWRITE);.
2e6e0 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
2e6f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
2e700 20 20 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78    int isAutoProx
2e710 79 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  y  = (flags & SQ
2e720 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52  LITE_OPEN_AUTOPR
2e730 4f 58 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  OXY);.#endif.#if
2e740 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2e750 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e  __) || SQLITE_EN
2e760 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
2e770 4c 45 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  LE.  struct stat
2e780 66 73 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69  fs fsInfo;.#endi
2e790 66 0a 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74  f..  /* If creat
2e7a0 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20  ing a master or 
2e7b0 6d 61 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61  main-file journa
2e7c0 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
2e7d0 20 77 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20   will open.  ** 
2e7e0 61 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  a file-descripto
2e7f0 72 20 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f  r on the directo
2e800 72 79 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73  ry too. The firs
2e810 74 20 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28  t time unixSync(
2e820 29 0a 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ).  ** is called
2e830 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   the directory f
2e840 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
2e850 69 6c 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64  ill be fsync()ed
2e860 20 61 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20   and close()d.. 
2e870 20 2a 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69   */.  int syncDi
2e880 72 20 3d 20 28 69 73 43 72 65 61 74 65 20 26 26  r = (isCreate &&
2e890 20 28 0a 20 20 20 20 20 20 20 20 65 54 79 70 65   (.        eType
2e8a0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
2e8b0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
2e8c0 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
2e8d0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
2e8e0 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
2e8f0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
2e900 4e 5f 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f  N_WAL.  ));..  /
2e910 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50  * If argument zP
2e920 61 74 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  ath is a NULL po
2e930 69 6e 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63  inter, this func
2e940 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2e950 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20   to open.  ** a 
2e960 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
2e970 55 73 65 20 74 68 69 73 20 62 75 66 66 65 72 20  Use this buffer 
2e980 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c  to store the fil
2e990 65 20 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a  e name in..  */.
2e9a0 20 20 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b    char zTmpname[
2e9b0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b  MAX_PATHNAME+2];
2e9c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2e9d0 4e 61 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20  Name = zPath;.. 
2e9e0 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f   /* Check the fo
2e9f0 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e  llowing statemen
2ea00 74 73 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20  ts are true: .  
2ea10 2a 2a 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78  **.  **   (a) Ex
2ea20 61 63 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65  actly one of the
2ea30 20 52 45 41 44 57 52 49 54 45 20 61 6e 64 20 52   READWRITE and R
2ea40 45 41 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75  EADONLY flags mu
2ea50 73 74 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a  st be set, and .
2ea60 20 20 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52    **   (b) if CR
2ea70 45 41 54 45 20 69 73 20 73 65 74 2c 20 74 68 65  EATE is set, the
2ea80 6e 20 52 45 41 44 57 52 49 54 45 20 6d 75 73 74  n READWRITE must
2ea90 20 61 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e   also be set, an
2eaa0 64 0a 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20  d.  **   (c) if 
2eab0 45 58 43 4c 55 53 49 56 45 20 69 73 20 73 65 74  EXCLUSIVE is set
2eac0 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
2ead0 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
2eae0 20 20 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45    **   (d) if DE
2eaf0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73  LETEONCLOSE is s
2eb00 65 74 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20  et, then CREATE 
2eb10 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74  must also be set
2eb20 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2eb30 28 69 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c  (isReadonly==0 |
2eb40 7c 20 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30  | isReadWrite==0
2eb50 29 20 26 26 20 28 69 73 52 65 61 64 57 72 69 74  ) && (isReadWrit
2eb60 65 20 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29  e || isReadonly)
2eb70 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 43 72  );.  assert(isCr
2eb80 65 61 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61  eate==0 || isRea
2eb90 64 57 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72  dWrite);.  asser
2eba0 74 28 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  t(isExclusive==0
2ebb0 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20   || isCreate);. 
2ebc0 20 61 73 73 65 72 74 28 69 73 44 65 6c 65 74 65   assert(isDelete
2ebd0 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29  ==0 || isCreate)
2ebe0 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e  ;..  /* The main
2ebf0 20 44 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   DB, main journa
2ec00 6c 2c 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20  l, WAL file and 
2ec10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
2ec20 72 65 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61  re never .  ** a
2ec30 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
2ec40 65 74 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68  eted. Nor are th
2ec50 65 79 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72  ey ever temporar
2ec60 79 20 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61  y files.  */.  a
2ec70 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2ec80 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2ec90 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2eca0 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61  N_MAIN_DB );.  a
2ecb0 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74  ssert( (!isDelet
2ecc0 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65  e && zName) || e
2ecd0 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45  Type!=SQLITE_OPE
2ece0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29  N_MAIN_JOURNAL )
2ecf0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
2ed00 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
2ed10 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
2ed20 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2ed30 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
2ed40 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
2ed50 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
2ed60 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  !=SQLITE_OPEN_WA
2ed70 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
2ed80 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
2ed90 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
2eda0 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
2edb0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
2edc0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
2edd0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
2ede0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
2edf0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
2ee00 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
2ee10 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
2ee20 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
2ee30 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
2ee40 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
2ee50 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2ee60 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2ee70 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
2ee80 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2ee90 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
2eea0 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
2eeb0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
2eec0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
2eed0 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
2eee0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 3b 0a  E_OPEN_WAL.  );.
2eef0 0a 20 20 2f 2a 20 44 65 74 65 63 74 20 61 20 70  .  /* Detect a p
2ef00 69 64 20 63 68 61 6e 67 65 20 61 6e 64 20 72 65  id change and re
2ef10 73 65 74 20 74 68 65 20 50 52 4e 47 2e 20 20 54  set the PRNG.  T
2ef20 68 65 72 65 20 69 73 20 61 20 72 61 63 65 20 63  here is a race c
2ef30 6f 6e 64 69 74 69 6f 6e 0a 20 20 2a 2a 20 68 65  ondition.  ** he
2ef40 72 65 20 73 75 63 68 20 74 68 61 74 20 74 77 6f  re such that two
2ef50 20 6f 72 20 6d 6f 72 65 20 74 68 72 65 61 64 73   or more threads
2ef60 20 61 6c 6c 20 74 72 79 69 6e 67 20 74 6f 20 6f   all trying to o
2ef70 70 65 6e 20 64 61 74 61 62 61 73 65 73 20 61 74  pen databases at
2ef80 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 69  .  ** the same i
2ef90 6e 73 74 61 6e 74 20 6d 69 67 68 74 20 61 6c 6c  nstant might all
2efa0 20 72 65 73 65 74 20 74 68 65 20 50 52 4e 47 2e   reset the PRNG.
2efb0 20 20 42 75 74 20 6d 75 6c 74 69 70 6c 65 20 72    But multiple r
2efc0 65 73 65 74 73 0a 20 20 2a 2a 20 61 72 65 20 68  esets.  ** are h
2efd0 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
2efe0 69 66 28 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  if( randomnessPi
2eff0 64 21 3d 6f 73 47 65 74 70 69 64 28 30 29 20 29  d!=osGetpid(0) )
2f000 7b 0a 20 20 20 20 72 61 6e 64 6f 6d 6e 65 73 73  {.    randomness
2f010 50 69 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30  Pid = osGetpid(0
2f020 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  );.    sqlite3_r
2f030 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
2f040 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 70 2c    }..  memset(p,
2f050 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46   0, sizeof(unixF
2f060 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20 65 54  ile));..  if( eT
2f070 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
2f080 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20 20 20  _MAIN_DB ){.    
2f090 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
2f0a0 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e 75 73  nused;.    pUnus
2f0b0 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61 62 6c  ed = findReusabl
2f0c0 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73  eFd(zName, flags
2f0d0 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 75 73  );.    if( pUnus
2f0e0 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64 20 3d  ed ){.      fd =
2f0f0 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a 20 20   pUnused->fd;.  
2f100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2f110 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33  Unused = sqlite3
2f120 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66  _malloc64(sizeof
2f130 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
2f140 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
2f150 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2f160 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2f170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f180 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
2f190 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2a 20  Unused;..    /* 
2f1a0 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
2f1b0 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d 7a 65  es are double-ze
2f1c0 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20 69 66  ro terminated if
2f1d0 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a 20 20   they are not.  
2f1e0 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68 20 70    ** URIs with p
2f1f0 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65 6e 63  arameters.  Henc
2f200 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c 77 61  e, they can alwa
2f210 79 73 20 62 65 20 70 61 73 73 65 64 20 69 6e 74  ys be passed int
2f220 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
2f230 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 29  _uri_parameter()
2f240 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
2f250 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
2f260 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 7a 4e  _OPEN_URI) || zN
2f270 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61 6d 65  ame[strlen(zName
2f280 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20 7d 65  )+1]==0 );..  }e
2f290 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65 20 29  lse if( !zName )
2f2a0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61 6d  {.    /* If zNam
2f2b0 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 75  e is NULL, the u
2f2c0 70 70 65 72 20 6c 61 79 65 72 20 69 73 20 72 65  pper layer is re
2f2d0 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d 70 20  questing a temp 
2f2e0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
2f2f0 65 72 74 28 69 73 44 65 6c 65 74 65 20 26 26 20  ert(isDelete && 
2f300 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20 20 72  !syncDir);.    r
2f310 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d 70 6e  c = unixGetTempn
2f320 61 6d 65 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  ame(pVfs->mxPath
2f330 6e 61 6d 65 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  name, zTmpname);
2f340 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2f350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f360 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2f370 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
2f380 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  pname;..    /* G
2f390 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61  enerated tempora
2f3a0 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ry filenames are
2f3b0 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a   always double-z
2f3c0 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  ero terminated. 
2f3d0 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79     ** for use by
2f3e0 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
2f3f0 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
2f400 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73   assert( zName[s
2f410 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
2f420 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
2f430 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
2f440 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
2f450 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
2f460 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
2f470 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
2f480 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
2f490 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
2f4a0 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
2f4b0 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
2f4c0 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
2f4d0 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
2f4e0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
2f4f0 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
2f500 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
2f510 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
2f520 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
2f530 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
2f540 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
2f550 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
2f560 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
2f570 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
2f580 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
2f590 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
2f5a0 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
2f5b0 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
2f5c0 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
2f5d0 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
2f5e0 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
2f5f0 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
2f600 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69  |O_BINARY);..  i
2f610 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d  f( fd<0 ){.    m
2f620 6f 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20  ode_t openMode; 
2f630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f640 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63  Permissions to c
2f650 72 65 61 74 65 20 66 69 6c 65 20 77 69 74 68 20  reate file with 
2f660 2a 2f 0a 20 20 20 20 75 69 64 5f 74 20 75 69 64  */.    uid_t uid
2f670 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f680 20 20 20 20 20 2f 2a 20 55 73 65 72 69 64 20 66       /* Userid f
2f690 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  or the file */. 
2f6a0 20 20 20 67 69 64 5f 74 20 67 69 64 3b 20 20 20     gid_t gid;   
2f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f6c0 20 2f 2a 20 47 72 6f 75 70 69 64 20 66 6f 72 20   /* Groupid for 
2f6d0 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  the file */.    
2f6e0 72 63 20 3d 20 66 69 6e 64 43 72 65 61 74 65 46  rc = findCreateF
2f6f0 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65 2c 20 66  ileMode(zName, f
2f700 6c 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c  lags, &openMode,
2f710 20 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20   &uid, &gid);.  
2f720 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f730 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
2f740 65 72 74 28 20 21 70 2d 3e 70 55 6e 75 73 65 64  ert( !p->pUnused
2f750 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
2f760 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
2f770 4f 50 45 4e 5f 57 41 4c 20 7c 7c 20 65 54 79 70  OPEN_WAL || eTyp
2f780 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
2f790 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  AIN_JOURNAL );. 
2f7a0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2f7b0 20 20 20 20 7d 0a 20 20 20 20 66 64 20 3d 20 72      }.    fd = r
2f7c0 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65  obust_open(zName
2f7d0 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65  , openFlags, ope
2f7e0 6e 4d 6f 64 65 29 3b 0a 20 20 20 20 4f 53 54 52  nMode);.    OSTR
2f7f0 41 43 45 28 28 22 4f 50 45 4e 58 20 20 20 25 2d  ACE(("OPENX   %-
2f800 33 64 20 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64  3d %s 0%o\n", fd
2f810 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61  , zName, openFla
2f820 67 73 29 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gs));.    assert
2f830 28 20 21 69 73 45 78 63 6c 75 73 69 76 65 20 7c  ( !isExclusive |
2f840 7c 20 28 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f  | (openFlags & O
2f850 5f 43 52 45 41 54 29 21 3d 30 20 29 3b 0a 20 20  _CREAT)!=0 );.  
2f860 20 20 69 66 28 20 66 64 3c 30 20 26 26 20 65 72    if( fd<0 && er
2f870 72 6e 6f 21 3d 45 49 53 44 49 52 20 26 26 20 69  rno!=EISDIR && i
2f880 73 52 65 61 64 57 72 69 74 65 20 29 7b 0a 20 20  sReadWrite ){.  
2f890 20 20 20 20 2f 2a 20 46 61 69 6c 65 64 20 74 6f      /* Failed to
2f8a0 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 66   open the file f
2f8b0 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61 63  or read/write ac
2f8c0 63 65 73 73 2e 20 54 72 79 20 72 65 61 64 2d 6f  cess. Try read-o
2f8d0 6e 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 66 6c  nly. */.      fl
2f8e0 61 67 73 20 26 3d 20 7e 28 53 51 4c 49 54 45 5f  ags &= ~(SQLITE_
2f8f0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
2f900 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2f910 45 29 3b 0a 20 20 20 20 20 20 6f 70 65 6e 46 6c  E);.      openFl
2f920 61 67 73 20 26 3d 20 7e 28 4f 5f 52 44 57 52 7c  ags &= ~(O_RDWR|
2f930 4f 5f 43 52 45 41 54 29 3b 0a 20 20 20 20 20 20  O_CREAT);.      
2f940 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2f950 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
2f960 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c       openFlags |
2f970 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
2f980 20 20 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31    isReadonly = 1
2f990 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 72 6f 62  ;.      fd = rob
2f9a0 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
2f9b0 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
2f9c0 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ode);.    }.    
2f9d0 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20  if( fd<0 ){.    
2f9e0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
2f9f0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
2fa00 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
2fa10 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
2fa20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69 73 68  goto open_finish
2fa30 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
2fa40 2a 20 49 66 20 74 68 69 73 20 70 72 6f 63 65 73  * If this proces
2fa50 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
2fa60 72 6f 6f 74 20 61 6e 64 20 69 66 20 63 72 65 61  root and if crea
2fa70 74 69 6e 67 20 61 20 6e 65 77 20 72 6f 6c 6c 62  ting a new rollb
2fa80 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  ack.    ** journ
2fa90 61 6c 20 6f 72 20 57 41 4c 20 66 69 6c 65 2c 20  al or WAL file, 
2faa0 73 65 74 20 74 68 65 20 6f 77 6e 65 72 73 68 69  set the ownershi
2fab0 70 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p of the journal
2fac0 20 6f 72 20 57 41 4c 20 74 6f 20 62 65 0a 20 20   or WAL to be.  
2fad0 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 61 73    ** the same as
2fae0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
2faf0 74 61 62 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  tabase..    */. 
2fb00 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28     if( flags & (
2fb10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
2fb20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
2fb30 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
2fb40 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77 6e 28     robustFchown(
2fb50 66 64 2c 20 75 69 64 2c 20 67 69 64 29 3b 0a 20  fd, uid, gid);. 
2fb60 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
2fb70 74 28 20 66 64 3e 3d 30 20 29 3b 0a 20 20 69 66  t( fd>=0 );.  if
2fb80 28 20 70 4f 75 74 46 6c 61 67 73 20 29 7b 0a 20  ( pOutFlags ){. 
2fb90 20 20 20 2a 70 4f 75 74 46 6c 61 67 73 20 3d 20     *pOutFlags = 
2fba0 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69 66  flags;.  }..  if
2fbb0 28 20 70 2d 3e 70 55 6e 75 73 65 64 20 29 7b 0a  ( p->pUnused ){.
2fbc0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
2fbd0 66 64 20 3d 20 66 64 3b 0a 20 20 20 20 70 2d 3e  fd = fd;.    p->
2fbe0 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
2fbf0 20 66 6c 61 67 73 3b 0a 20 20 7d 0a 0a 20 20 69   flags;.  }..  i
2fc00 66 28 20 69 73 44 65 6c 65 74 65 20 29 7b 0a 23  f( isDelete ){.#
2fc10 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
2fc20 20 20 7a 50 61 74 68 20 3d 20 7a 4e 61 6d 65 3b    zPath = zName;
2fc30 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 53  .#elif defined(S
2fc40 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
2fc50 45 52 5f 43 4c 4f 53 45 29 0a 20 20 20 20 7a 50  ER_CLOSE).    zP
2fc60 61 74 68 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ath = sqlite3_mp
2fc70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61 6d  rintf("%s", zNam
2fc80 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61 74  e);.    if( zPat
2fc90 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f  h==0 ){.      ro
2fca0 62 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64  bust_close(p, fd
2fcb0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
2fcc0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fcd0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 65  _NOMEM;.    }.#e
2fce0 6c 73 65 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  lse.    osUnlink
2fcf0 28 7a 4e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  (zName);.#endif.
2fd00 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 45    }.#if SQLITE_E
2fd10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
2fd20 59 4c 45 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  YLE.  else{.    
2fd30 70 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 6f  p->openFlags = o
2fd40 70 65 6e 46 6c 61 67 73 3b 0a 20 20 7d 0a 23 65  penFlags;.  }.#e
2fd50 6e 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d  ndif..  noLock =
2fd60 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
2fd70 50 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20  PEN_MAIN_DB;..  
2fd80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2fd90 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54  PPLE__) || SQLIT
2fda0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2fdb0 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 66 73 74  _STYLE.  if( fst
2fdc0 61 74 66 73 28 66 64 2c 20 26 66 73 49 6e 66 6f  atfs(fd, &fsInfo
2fdd0 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 73  ) == -1 ){.    s
2fde0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 2c  toreLastErrno(p,
2fdf0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 6f 62   errno);.    rob
2fe00 75 73 74 5f 63 6c 6f 73 65 28 70 2c 20 66 64 2c  ust_close(p, fd,
2fe10 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
2fe20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
2fe30 45 52 52 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  ERR_ACCESS;.  }.
2fe40 20 20 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63    if (0 == strnc
2fe50 6d 70 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e  mp("msdos", fsIn
2fe60 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
2fe70 20 35 29 29 20 7b 0a 20 20 20 20 28 28 75 6e 69   5)) {.    ((uni
2fe80 78 46 69 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66  xFile*)pFile)->f
2fe90 73 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  sFlags |= SQLITE
2fea0 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
2feb0 53 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20 3d  S;.  }.  if (0 =
2fec0 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74  = strncmp("exfat
2fed0 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
2fee0 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
2fef0 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46    ((unixFile*)pF
2ff00 69 6c 65 29 2d 3e 66 73 46 6c 61 67 73 20 7c 3d  ile)->fsFlags |=
2ff10 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
2ff20 49 53 5f 4d 53 44 4f 53 3b 0a 20 20 7d 0a 23 65  IS_MSDOS;.  }.#e
2ff30 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 75  ndif..  /* Set u
2ff40 70 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 74  p appropriate ct
2ff50 72 6c 46 6c 61 67 73 20 2a 2f 0a 20 20 69 66 28  rlFlags */.  if(
2ff60 20 69 73 44 65 6c 65 74 65 20 29 20 20 20 20 20   isDelete )     
2ff70 20 20 20 20 20 20 20 20 20 20 20 63 74 72 6c 46             ctrlF
2ff80 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
2ff90 5f 44 45 4c 45 54 45 3b 0a 20 20 69 66 28 20 69  _DELETE;.  if( i
2ffa0 73 52 65 61 64 6f 6e 6c 79 20 29 20 20 20 20 20  sReadonly )     
2ffb0 20 20 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61           ctrlFla
2ffc0 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 52  gs |= UNIXFILE_R
2ffd0 44 4f 4e 4c 59 3b 0a 20 20 69 66 28 20 6e 6f 4c  DONLY;.  if( noL
2ffe0 6f 63 6b 20 29 20 20 20 20 20 20 20 20 20 20 20  ock )           
2fff0 20 20 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73         ctrlFlags
30000 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c   |= UNIXFILE_NOL
30010 4f 43 4b 3b 0a 20 20 69 66 28 20 73 79 6e 63 44  OCK;.  if( syncD
30020 69 72 20 29 20 20 20 20 20 20 20 20 20 20 20 20  ir )            
30030 20 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c       ctrlFlags |
30040 3d 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59  = UNIXFILE_DIRSY
30050 4e 43 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  NC;.  if( flags 
30060 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  & SQLITE_OPEN_UR
30070 49 20 29 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d  I ) ctrlFlags |=
30080 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 3b 0a 0a   UNIXFILE_URI;..
30090 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
300a0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
300b0 23 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45  #if SQLITE_PREFE
300c0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
300d0 20 20 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20    isAutoProxy = 
300e0 31 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  1;.#endif.  if( 
300f0 69 73 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28  isAutoProxy && (
30100 7a 50 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20  zPath!=NULL) && 
30110 28 21 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66  (!noLock) && pVf
30120 73 2d 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20  s->xOpen ){.    
30130 63 68 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d  char *envforce =
30140 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f   getenv("SQLITE_
30150 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b  FORCE_PROXY_LOCK
30160 49 4e 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75  ING");.    int u
30170 73 65 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20  seProxy = 0;..  
30180 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43    /* SQLITE_FORC
30190 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d  E_PROXY_LOCKING=
301a0 3d 31 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61  =1 means force a
301b0 6c 77 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c  lways use proxy,
301c0 20 30 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a   0 means .    **
301d0 20 6e 65 76 65 72 20 75 73 65 20 70 72 6f 78 79   never use proxy
301e0 2c 20 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65  , NULL means use
301f0 20 70 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c   proxy for non-l
30200 6f 63 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e  ocal files only.
30210 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76    */.    if( env
30220 66 6f 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20  force!=NULL ){. 
30230 20 20 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20       useProxy = 
30240 61 74 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30  atoi(envforce)>0
30250 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30260 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 21 28     useProxy = !(
30270 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d  fsInfo.f_flags&M
30280 4e 54 5f 4c 4f 43 41 4c 29 3b 0a 20 20 20 20 7d  NT_LOCAL);.    }
30290 0a 20 20 20 20 69 66 28 20 75 73 65 50 72 6f 78  .    if( useProx
302a0 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
302b0 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28 70  fillInUnixFile(p
302c0 56 66 73 2c 20 66 64 2c 20 70 46 69 6c 65 2c 20  Vfs, fd, pFile, 
302d0 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c 61 67 73  zPath, ctrlFlags
302e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
302f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
30300 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79        rc = proxy
30310 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c  TransformUnixFil
30320 65 28 28 75 6e 69 78 46 69 6c 65 2a 29 70 46 69  e((unixFile*)pFi
30330 6c 65 2c 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 20  le, ":auto:");. 
30340 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
30350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30360 20 20 20 20 20 20 2f 2a 20 55 73 65 20 75 6e 69        /* Use uni
30370 78 43 6c 6f 73 65 20 74 6f 20 63 6c 65 61 6e 20  xClose to clean 
30380 75 70 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  up the resources
30390 20 61 64 64 65 64 20 69 6e 20 66 69 6c 6c 49 6e   added in fillIn
303a0 55 6e 69 78 46 69 6c 65 20 0a 20 20 20 20 20 20  UnixFile .      
303b0 20 20 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72      ** and clear
303c0 20 61 6c 6c 20 74 68 65 20 73 74 72 75 63 74 75   all the structu
303d0 72 65 27 73 20 72 65 66 65 72 65 6e 63 65 73 2e  re's references.
303e0 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
303f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 46  .          ** pF
30400 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 77 69  ile->pMethods wi
30410 6c 6c 20 62 65 20 4e 55 4c 4c 20 73 6f 20 73 71  ll be NULL so sq
30420 6c 69 74 65 33 4f 73 43 6c 6f 73 65 20 77 69 6c  lite3OsClose wil
30430 6c 20 62 65 20 61 20 6e 6f 2d 6f 70 20 0a 20 20  l be a no-op .  
30440 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30450 20 20 20 20 20 75 6e 69 78 43 6c 6f 73 65 28 70       unixClose(p
30460 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 20  File);.         
30470 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
30480 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
30490 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69      goto open_fi
304a0 6e 69 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20  nished;.    }.  
304b0 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 63  }.#endif.  .  rc
304c0 20 3d 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c   = fillInUnixFil
304d0 65 28 70 56 66 73 2c 20 66 64 2c 20 70 46 69 6c  e(pVfs, fd, pFil
304e0 65 2c 20 7a 50 61 74 68 2c 20 63 74 72 6c 46 6c  e, zPath, ctrlFl
304f0 61 67 73 29 3b 0a 0a 6f 70 65 6e 5f 66 69 6e 69  ags);..open_fini
30500 73 68 65 64 3a 0a 20 20 69 66 28 20 72 63 21 3d  shed:.  if( rc!=
30510 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30520 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d   sqlite3_free(p-
30530 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 7d 0a 20  >pUnused);.  }. 
30540 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
30550 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
30560 20 66 69 6c 65 20 61 74 20 7a 50 61 74 68 2e 20   file at zPath. 
30570 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
30580 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
30590 20 66 73 79 6e 63 28 29 0a 2a 2a 20 74 68 65 20   fsync().** the 
305a0 64 69 72 65 63 74 6f 72 79 20 61 66 74 65 72 20  directory after 
305b0 64 65 6c 65 74 69 6e 67 20 74 68 65 20 66 69 6c  deleting the fil
305c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
305d0 20 75 6e 69 78 44 65 6c 65 74 65 28 0a 20 20 73   unixDelete(.  s
305e0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
305f0 73 65 64 2c 20 20 20 20 20 2f 2a 20 56 46 53 20  sed,     /* VFS 
30600 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 69 73 20  containing this 
30610 61 73 20 74 68 65 20 78 44 65 6c 65 74 65 20 6d  as the xDelete m
30620 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
30630 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
30640 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
30650 66 69 6c 65 20 74 6f 20 62 65 20 64 65 6c 65 74  file to be delet
30660 65 64 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 53  ed */.  int dirS
30670 79 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  ync             
30680 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 66 73    /* If true, fs
30690 79 6e 63 28 29 20 64 69 72 65 63 74 6f 72 79 20  ync() directory 
306a0 61 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 66  after deleting f
306b0 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ile */.){.  int 
306c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
306d0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
306e0 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 53  ER(NotUsed);.  S
306f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 72  imulateIOError(r
30700 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
30710 52 52 5f 44 45 4c 45 54 45 29 3b 0a 20 20 69 66  RR_DELETE);.  if
30720 28 20 6f 73 55 6e 6c 69 6e 6b 28 7a 50 61 74 68  ( osUnlink(zPath
30730 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 69  )==(-1) ){.    i
30740 66 28 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54  f( errno==ENOENT
30750 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
30760 20 20 20 20 20 20 20 20 7c 7c 20 6f 73 41 63 63          || osAcc
30770 65 73 73 28 7a 50 61 74 68 2c 30 29 21 3d 30 0a  ess(zPath,0)!=0.
30780 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
30790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
307a0 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
307b0 4e 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  NT;.    }else{. 
307c0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
307d0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
307e0 45 52 52 5f 44 45 4c 45 54 45 2c 20 22 75 6e 6c  ERR_DELETE, "unl
307f0 69 6e 6b 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20  ink", zPath);.  
30800 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
30810 63 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  c;.  }.#ifndef S
30820 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44 49  QLITE_DISABLE_DI
30830 52 53 59 4e 43 0a 20 20 69 66 28 20 28 64 69 72  RSYNC.  if( (dir
30840 53 79 6e 63 20 26 20 31 29 21 3d 30 20 29 7b 0a  Sync & 1)!=0 ){.
30850 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20 20 20      int fd;.    
30860 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63  rc = osOpenDirec
30870 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
30880 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
30890 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
308a0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
308b0 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
308c0 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
308d0 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
308e0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
308f0 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
30900 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
30910 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 2c  IOERR_DIR_FSYNC,
30920 20 22 66 73 79 6e 63 22 2c 20 7a 50 61 74 68 29   "fsync", zPath)
30930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30940 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 30 2c 20  robust_close(0, 
30950 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  fd, __LINE__);. 
30960 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30970 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
30980 54 45 5f 43 41 4e 54 4f 50 45 4e 20 29 3b 0a 20  TE_CANTOPEN );. 
30990 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
309a0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  _OK;.    }.  }.#
309b0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
309c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
309d0 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
309e0 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
309f0 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
30a00 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
30a10 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
30a20 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
30a30 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
30a40 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
30a50 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
30a60 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
30a70 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
30a80 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
30a90 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
30aa0 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
30ab0 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
30ac0 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
30ad0 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
30ae0 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
30af0 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
30b00 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
30b10 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
30b20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
30b30 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
30b40 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
30b50 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
30b60 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
30b70 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
30b80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
30b90 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
30ba0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
30bb0 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
30bc0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
30bd0 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
30be0 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
30bf0 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
30c00 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
30c10 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
30c20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
30c30 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
30c40 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
30c50 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
30c60 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d);.  SimulateIO
30c70 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
30c80 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
30c90 53 3b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  S; );.  assert( 
30ca0 70 52 65 73 4f 75 74 21 3d 30 20 29 3b 0a 0a 20  pResOut!=0 );.. 
30cb0 20 2f 2a 20 54 68 65 20 73 70 65 63 20 73 61 79   /* The spec say
30cc0 73 20 74 68 65 72 65 20 61 72 65 20 74 68 72 65  s there are thre
30cd0 65 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75 65  e possible value
30ce0 73 20 66 6f 72 20 66 6c 61 67 73 2e 20 20 42 75  s for flags.  Bu
30cf0 74 20 6f 6e 6c 79 0a 20 20 2a 2a 20 74 77 6f 20  t only.  ** two 
30d00 6f 66 20 74 68 65 6d 20 61 72 65 20 61 63 74 75  of them are actu
30d10 61 6c 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20 61  ally used */.  a
30d20 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 53 51  ssert( flags==SQ
30d30 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
30d40 54 53 20 7c 7c 20 66 6c 61 67 73 3d 3d 53 51 4c  TS || flags==SQL
30d50 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57  ITE_ACCESS_READW
30d60 52 49 54 45 20 29 3b 0a 0a 20 20 69 66 28 20 66  RITE );..  if( f
30d70 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 41 43 43  lags==SQLITE_ACC
30d80 45 53 53 5f 45 58 49 53 54 53 20 29 7b 0a 20 20  ESS_EXISTS ){.  
30d90 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
30da0 66 3b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  f;.    *pResOut 
30db0 3d 20 28 30 3d 3d 6f 73 53 74 61 74 28 7a 50 61  = (0==osStat(zPa
30dc0 74 68 2c 20 26 62 75 66 29 20 26 26 20 62 75 66  th, &buf) && buf
30dd0 2e 73 74 5f 73 69 7a 65 3e 30 29 3b 0a 20 20 7d  .st_size>0);.  }
30de0 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65 73 4f  else{.    *pResO
30df0 75 74 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 50  ut = osAccess(zP
30e00 61 74 68 2c 20 57 5f 4f 4b 7c 52 5f 4f 4b 29 3d  ath, W_OK|R_OK)=
30e10 3d 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  =0;.  }.  return
30e20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
30e30 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c  /*.** Turn a rel
30e40 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69  ative pathname i
30e50 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e  nto a full pathn
30e60 61 6d 65 2e 20 54 68 65 20 72 65 6c 61 74 69 76  ame. The relativ
30e70 65 20 70 61 74 68 0a 2a 2a 20 69 73 20 73 74 6f  e path.** is sto
30e80 72 65 64 20 61 73 20 61 20 6e 75 6c 2d 74 65 72  red as a nul-ter
30e90 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69  minated string i
30ea0 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
30eb0 6e 74 65 64 20 74 6f 20 62 79 0a 2a 2a 20 7a 50  nted to by.** zP
30ec0 61 74 68 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74  ath. .**.** zOut
30ed0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
30ee0 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20  fer of at least 
30ef0 73 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61  sqlite3_vfs.mxPa
30f00 74 68 6e 61 6d 65 20 62 79 74 65 73 20 0a 2a 2a  thname bytes .**
30f10 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c 20   (in this case, 
30f20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 62 79 74  MAX_PATHNAME byt
30f30 65 73 29 2e 20 54 68 65 20 66 75 6c 6c 2d 70 61  es). The full-pa
30f40 74 68 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  th is written to
30f50 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
30f60 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
30f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
30f80 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
30f90 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
30fa0 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *pVfs,          
30fb0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
30fc0 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
30fd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
30fe0 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  h,            /*
30ff0 20 50 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69   Possibly relati
31000 76 65 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f  ve input path */
31010 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 20 20 20  .  int nOut,    
31020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31030 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6f 75 74 70   /* Size of outp
31040 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79 74  ut buffer in byt
31050 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f  es */.  char *zO
31060 75 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ut              
31070 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
31080 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  buffer */.){.  i
31090 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 2f 2a 20  nt nByte;..  /* 
310a0 49 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75  It's odd to simu
310b0 6c 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72  late an io-error
310c0 20 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c   here, but reall
310d0 79 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20  y this is just. 
310e0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f   ** using the io
310f0 2d 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75  -error infrastru
31100 63 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68  cture to test th
31110 61 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65  at SQLite handle
31120 73 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  s this.  ** func
31130 74 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68  tion failing. Th
31140 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c  is function coul
31150 64 20 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65  d fail if, for e
31160 78 61 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a  xample, the.  **
31170 20 63 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67   current working
31180 20 64 69 72 65 63 74 6f 72 79 20 68 61 73 20 62   directory has b
31190 65 65 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20  een unlinked..  
311a0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
311b0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
311c0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
311d0 61 73 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78  assert( pVfs->mx
311e0 50 61 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41  Pathname==MAX_PA
311f0 54 48 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53  THNAME );.  UNUS
31200 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66  ED_PARAMETER(pVf
31210 73 29 3b 0a 0a 20 20 2f 2a 20 41 74 74 65 6d 70  s);..  /* Attemp
31220 74 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65  t to resolve the
31230 20 70 61 74 68 20 61 73 20 69 66 20 69 74 20 77   path as if it w
31240 65 72 65 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  ere a symbolic l
31250 69 6e 6b 2e 20 49 66 20 69 74 20 69 73 0a 20 20  ink. If it is.  
31260 2a 2a 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ** a symbolic li
31270 6e 6b 2c 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nk, the resolved
31280 20 70 61 74 68 20 69 73 20 73 74 6f 72 65 64 20   path is stored 
31290 69 6e 20 62 75 66 66 65 72 20 7a 4f 75 74 5b 5d  in buffer zOut[]
312a0 2e 20 4f 72 2c 20 69 66 0a 20 20 2a 2a 20 74 68  . Or, if.  ** th
312b0 65 20 69 64 65 6e 74 69 66 69 65 64 20 66 69 6c  e identified fil
312c0 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f  e is not a symbo
312d0 6c 69 63 20 6c 69 6e 6b 20 6f 72 20 64 6f 65 73  lic link or does
312e0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e   not exist, then
312f0 0a 20 20 2a 2a 20 7a 50 61 74 68 20 69 73 20 63  .  ** zPath is c
31300 6f 70 69 65 64 20 64 69 72 65 63 74 6c 79 20 69  opied directly i
31310 6e 74 6f 20 7a 4f 75 74 2e 20 45 69 74 68 65 72  nto zOut. Either
31320 20 77 61 79 2c 20 6e 42 79 74 65 20 69 73 20 6c   way, nByte is l
31330 65 66 74 20 73 65 74 20 74 6f 0a 20 20 2a 2a 20  eft set to.  ** 
31340 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
31350 73 74 72 69 6e 67 20 63 6f 70 69 65 64 20 69 6e  string copied in
31360 74 6f 20 7a 4f 75 74 5b 5d 20 69 6e 20 62 79 74  to zOut[] in byt
31370 65 73 2e 20 20 2a 2f 0a 20 20 6e 42 79 74 65 20  es.  */.  nByte 
31380 3d 20 6f 73 52 65 61 64 6c 69 6e 6b 28 7a 50 61  = osReadlink(zPa
31390 74 68 2c 20 7a 4f 75 74 2c 20 6e 4f 75 74 2d 31  th, zOut, nOut-1
313a0 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3c 30  );.  if( nByte<0
313b0 20 29 7b 0a 20 20 20 20 69 66 28 20 65 72 72 6e   ){.    if( errn
313c0 6f 21 3d 45 49 4e 56 41 4c 20 26 26 20 65 72 72  o!=EINVAL && err
313d0 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b 0a 20 20  no!=ENOENT ){.  
313e0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
313f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
31400 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 72  ANTOPEN_BKPT, "r
31410 65 61 64 6c 69 6e 6b 22 2c 20 7a 50 61 74 68 29  eadlink", zPath)
31420 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
31430 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 4f 75  te3_snprintf(nOu
31440 74 2c 20 7a 4f 75 74 2c 20 22 25 73 22 2c 20 7a  t, zOut, "%s", z
31450 50 61 74 68 29 3b 0a 20 20 20 20 6e 42 79 74 65  Path);.    nByte
31460 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
31470 33 30 28 7a 4f 75 74 29 3b 0a 20 20 7d 65 6c 73  30(zOut);.  }els
31480 65 7b 0a 20 20 20 20 7a 4f 75 74 5b 6e 42 79 74  e{.    zOut[nByt
31490 65 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 0a  e] = '\0';.  }..
314a0 20 20 2f 2a 20 49 66 20 62 75 66 66 65 72 20 7a    /* If buffer z
314b0 4f 75 74 5b 5d 20 6e 6f 77 20 63 6f 6e 74 61 69  Out[] now contai
314c0 6e 73 20 61 6e 20 61 62 73 6f 6c 75 74 65 20 70  ns an absolute p
314d0 61 74 68 20 74 68 65 72 65 20 69 73 20 6e 6f 74  ath there is not
314e0 68 69 6e 67 20 6d 6f 72 65 0a 20 20 2a 2a 20 74  hing more.  ** t
314f0 6f 20 64 6f 2e 20 49 66 20 69 74 20 63 6f 6e 74  o do. If it cont
31500 61 69 6e 73 20 61 20 72 65 6c 61 74 69 76 65 20  ains a relative 
31510 70 61 74 68 2c 20 64 6f 20 74 68 65 20 66 6f 6c  path, do the fol
31520 6c 6f 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a  lowing:.  **.  *
31530 2a 20 20 20 2a 20 6d 6f 76 65 20 74 68 65 20 72  *   * move the r
31540 65 6c 61 74 69 76 65 20 70 61 74 68 20 73 74 72  elative path str
31550 69 6e 67 20 73 6f 20 74 68 61 74 20 69 74 20 69  ing so that it i
31560 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  s at the end of 
31570 74 68 0a 20 20 2a 2a 20 20 20 20 20 7a 4f 75 74  th.  **     zOut
31580 5b 5d 20 62 75 66 66 65 72 2e 0a 20 20 2a 2a 20  [] buffer..  ** 
31590 20 20 2a 20 43 61 6c 6c 20 67 65 74 63 77 64 28    * Call getcwd(
315a0 29 20 74 6f 20 72 65 61 64 20 74 68 65 20 70 61  ) to read the pa
315b0 74 68 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  th of the curren
315c0 74 20 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74  t working direct
315d0 6f 72 79 20 0a 20 20 2a 2a 20 20 20 20 20 69 6e  ory .  **     in
315e0 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
315f0 74 68 65 20 7a 4f 75 74 5b 5d 20 62 75 66 66 65  the zOut[] buffe
31600 72 2e 0a 20 20 2a 2a 20 20 20 2a 20 41 70 70 65  r..  **   * Appe
31610 6e 64 20 61 20 27 2f 27 20 63 68 61 72 61 63 74  nd a '/' charact
31620 65 72 20 74 6f 20 74 68 65 20 63 77 64 20 73 74  er to the cwd st
31630 72 69 6e 67 20 61 6e 64 20 6d 6f 76 65 20 74 68  ring and move th
31640 65 20 0a 20 20 2a 2a 20 20 20 20 20 72 65 6c 61  e .  **     rela
31650 74 69 76 65 20 70 61 74 68 20 62 61 63 6b 20 77  tive path back w
31660 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
31670 20 73 6f 20 74 68 61 74 20 69 74 20 69 6d 6d 65   so that it imme
31680 64 69 61 74 65 6c 79 20 0a 20 20 2a 2a 20 20 20  diately .  **   
31690 20 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 27 2f    follows the '/
316a0 27 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  '..  **.  ** Thi
316b0 73 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  s code is writte
316c0 6e 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  n so that if the
316d0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20   combination of 
316e0 74 68 65 20 43 57 44 20 61 6e 64 20 72 65 6c 61  the CWD and rela
316f0 74 69 76 65 0a 20 20 2a 2a 20 70 61 74 68 20 61  tive.  ** path a
31700 72 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  re larger than t
31710 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 69 7a  he allocated siz
31720 65 20 6f 66 20 7a 4f 75 74 5b 5d 20 74 68 65 20  e of zOut[] the 
31730 43 57 44 20 69 73 20 73 69 6c 65 6e 74 6c 79 0a  CWD is silently.
31740 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 20 74    ** truncated t
31750 6f 20 6d 61 6b 65 20 69 74 20 66 69 74 2e 20 54  o make it fit. T
31760 68 69 73 20 69 73 20 4f 6b 2c 20 61 73 20 53 51  his is Ok, as SQ
31770 4c 69 74 65 20 72 65 66 75 73 65 73 20 74 6f 20  Lite refuses to 
31780 6f 70 65 6e 20 61 6e 79 0a 20 20 2a 2a 20 66 69  open any.  ** fi
31790 6c 65 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  le for which thi
317a0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
317b0 6e 73 20 61 20 66 75 6c 6c 20 70 61 74 68 20 6c  ns a full path l
317c0 61 72 67 65 72 20 74 68 61 6e 20 28 6e 4f 75 74  arger than (nOut
317d0 2d 38 29 0a 20 20 2a 2a 20 62 79 74 65 73 20 69  -8).  ** bytes i
317e0 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 74 65  n size.  */.  te
317f0 73 74 63 61 73 65 28 20 6e 42 79 74 65 3d 3d 6e  stcase( nByte==n
31800 4f 75 74 2d 35 20 29 3b 0a 20 20 74 65 73 74 63  Out-5 );.  testc
31810 61 73 65 28 20 6e 42 79 74 65 3d 3d 6e 4f 75 74  ase( nByte==nOut
31820 2d 34 20 29 3b 0a 20 20 69 66 28 20 7a 4f 75 74  -4 );.  if( zOut
31830 5b 30 5d 21 3d 27 2f 27 20 26 26 20 6e 42 79 74  [0]!='/' && nByt
31840 65 3c 6e 4f 75 74 2d 34 20 29 7b 0a 20 20 20 20  e<nOut-4 ){.    
31850 69 6e 74 20 6e 43 77 64 3b 0a 20 20 20 20 69 6e  int nCwd;.    in
31860 74 20 6e 52 65 6d 20 3d 20 6e 4f 75 74 2d 6e 42  t nRem = nOut-nB
31870 79 74 65 2d 31 3b 0a 20 20 20 20 6d 65 6d 6d 6f  yte-1;.    memmo
31880 76 65 28 26 7a 4f 75 74 5b 6e 52 65 6d 5d 2c 20  ve(&zOut[nRem], 
31890 7a 4f 75 74 2c 20 6e 42 79 74 65 2b 31 29 3b 0a  zOut, nByte+1);.
318a0 20 20 20 20 7a 4f 75 74 5b 6e 52 65 6d 2d 31 5d      zOut[nRem-1]
318b0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 69 66 28   = '\0';.    if(
318c0 20 6f 73 47 65 74 63 77 64 28 7a 4f 75 74 2c 20   osGetcwd(zOut, 
318d0 6e 52 65 6d 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  nRem-1)==0 ){.  
318e0 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
318f0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
31900 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 67  ANTOPEN_BKPT, "g
31910 65 74 63 77 64 22 2c 20 7a 50 61 74 68 29 3b 0a  etcwd", zPath);.
31920 20 20 20 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d      }.    nCwd =
31930 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
31940 28 7a 4f 75 74 29 3b 0a 20 20 20 20 61 73 73 65  (zOut);.    asse
31950 72 74 28 20 6e 43 77 64 3c 3d 6e 52 65 6d 2d 31  rt( nCwd<=nRem-1
31960 20 29 3b 0a 20 20 20 20 7a 4f 75 74 5b 6e 43 77   );.    zOut[nCw
31970 64 5d 20 3d 20 27 2f 27 3b 0a 20 20 20 20 6d 65  d] = '/';.    me
31980 6d 6d 6f 76 65 28 26 7a 4f 75 74 5b 6e 43 77 64  mmove(&zOut[nCwd
31990 2b 31 5d 2c 20 26 7a 4f 75 74 5b 6e 52 65 6d 5d  +1], &zOut[nRem]
319a0 2c 20 6e 42 79 74 65 2b 31 29 3b 0a 20 20 7d 0a  , nByte+1);.  }.
319b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
319c0 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
319d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
319e0 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
319f0 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
31a00 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
31a10 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
31a20 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
31a30 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
31a40 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
31a50 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
31a60 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
31a70 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
31a80 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
31a90 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
31aa0 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
31ab0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
31ac0 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
31ad0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
31ae0 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
31af0 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
31b00 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
31b10 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
31b20 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
31b30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
31b40 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
31b50 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
31b60 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
31b70 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
31b80 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
31b90 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
31ba0 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
31bb0 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
31bc0 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
31bd0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
31be0 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
31bf0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
31c00 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
31c10 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
31c20 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
31c30 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
31c40 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
31c50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
31c60 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
31c70 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
31c80 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
31c90 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
31ca0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
31cb0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
31cc0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
31cd0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
31ce0 3b 0a 20 20 7a 45 72 72 20 3d 20 64 6c 65 72 72  ;.  zErr = dlerr
31cf0 6f 72 28 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  or();.  if( zErr
31d00 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31d10 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2c 20 7a  snprintf(nBuf, z
31d20 42 75 66 4f 75 74 2c 20 22 25 73 22 2c 20 7a 45  BufOut, "%s", zE
31d30 72 72 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  rr);.  }.  unixL
31d40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 73  eaveMutex();.}.s
31d50 74 61 74 69 63 20 76 6f 69 64 20 28 2a 75 6e 69  tatic void (*uni
31d60 78 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76  xDlSym(sqlite3_v
31d70 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76 6f 69  fs *NotUsed, voi
31d80 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
31d90 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20  *zSym))(void){. 
31da0 20 2f 2a 20 0a 20 20 2a 2a 20 47 43 43 20 77 69   /* .  ** GCC wi
31db0 74 68 20 2d 70 65 64 61 6e 74 69 63 2d 65 72 72  th -pedantic-err
31dc0 6f 72 73 20 73 61 79 73 20 74 68 61 74 20 43 39  ors says that C9
31dd0 30 20 64 6f 65 73 20 6e 6f 74 20 61 6c 6c 6f 77  0 does not allow
31de0 20 61 20 76 6f 69 64 2a 20 74 6f 20 62 65 0a 20   a void* to be. 
31df0 20 2a 2a 20 63 61 73 74 20 69 6e 74 6f 20 61 20   ** cast into a 
31e00 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e  pointer to a fun
31e10 63 74 69 6f 6e 2e 20 20 41 6e 64 20 79 65 74 20  ction.  And yet 
31e20 74 68 65 20 6c 69 62 72 61 72 79 20 64 6c 73 79  the library dlsy
31e30 6d 28 29 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a  m() routine.  **
31e40 20 72 65 74 75 72 6e 73 20 61 20 76 6f 69 64 2a   returns a void*
31e50 20 77 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79   which is really
31e60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
31e70 66 75 6e 63 74 69 6f 6e 2e 20 20 53 6f 20 68 6f  function.  So ho
31e80 77 20 64 6f 20 77 65 0a 20 20 2a 2a 20 75 73 65  w do we.  ** use
31e90 20 64 6c 73 79 6d 28 29 20 77 69 74 68 20 2d 70   dlsym() with -p
31ea0 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 3f 0a  edantic-errors?.
31eb0 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 72 69 61 62    **.  ** Variab
31ec0 6c 65 20 78 20 62 65 6c 6f 77 20 69 73 20 64 65  le x below is de
31ed0 66 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70 6f  fined to be a po
31ee0 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
31ef0 69 6f 6e 20 74 61 6b 69 6e 67 0a 20 20 2a 2a 20  ion taking.  ** 
31f00 70 61 72 61 6d 65 74 65 72 73 20 76 6f 69 64 2a  parameters void*
31f10 20 61 6e 64 20 63 6f 6e 73 74 20 63 68 61 72 2a   and const char*
31f20 20 61 6e 64 20 72 65 74 75 72 6e 69 6e 67 20 61   and returning a
31f30 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
31f40 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 57 65 20  nction..  ** We 
31f50 69 6e 69 74 69 61 6c 69 7a 65 20 78 20 62 79 20  initialize x by 
31f60 61 73 73 69 67 6e 69 6e 67 20 69 74 20 61 20 70  assigning it a p
31f70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 6c  ointer to the dl
31f80 73 79 6d 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sym() function..
31f90 20 20 2a 2a 20 28 54 68 61 74 20 61 73 73 69 67    ** (That assig
31fa0 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 73 20 61  nment requires a
31fb0 20 63 61 73 74 2e 29 20 20 54 68 65 6e 20 77 65   cast.)  Then we
31fc0 20 63 61 6c 6c 20 74 68 65 20 66 75 6e 63 74 69   call the functi
31fd0 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 78 20 70  on that.  ** x p
31fe0 6f 69 6e 74 73 20 74 6f 2e 20 20 0a 20 20 2a 2a  oints to.  .  **
31ff0 0a 20 20 2a 2a 20 54 68 69 73 20 77 6f 72 6b 2d  .  ** This work-
32000 61 72 6f 75 6e 64 20 69 73 20 75 6e 6c 69 6b 65  around is unlike
32010 6c 79 20 74 6f 20 77 6f 72 6b 20 63 6f 72 72 65  ly to work corre
32020 63 74 6c 79 20 6f 6e 20 61 6e 79 20 73 79 73 74  ctly on any syst
32030 65 6d 20 77 68 65 72 65 0a 20 20 2a 2a 20 79 6f  em where.  ** yo
32040 75 20 72 65 61 6c 6c 79 20 63 61 6e 6e 6f 74 20  u really cannot 
32050 63 61 73 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  cast a function 
32060 70 6f 69 6e 74 65 72 20 69 6e 74 6f 20 76 6f 69  pointer into voi
32070 64 2a 2e 20 20 42 75 74 20 74 68 65 6e 2c 20 6f  d*.  But then, o
32080 6e 20 74 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72  n the.  ** other
32090 20 68 61 6e 64 2c 20 64 6c 73 79 6d 28 29 20 77   hand, dlsym() w
320a0 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  ill not work on 
320b0 73 75 63 68 20 61 20 73 79 73 74 65 6d 20 65 69  such a system ei
320c0 74 68 65 72 2c 20 73 6f 20 77 65 20 68 61 76 65  ther, so we have
320d0 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 61 6c 6c 79  .  ** not really
320e0 20 6c 6f 73 74 20 61 6e 79 74 68 69 6e 67 2e 0a   lost anything..
320f0 20 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 28 2a    */.  void (*(*
32100 78 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  x)(void*,const c
32110 68 61 72 2a 29 29 28 76 6f 69 64 29 3b 0a 20 20  har*))(void);.  
32120 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
32130 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 78 20 3d  (NotUsed);.  x =
32140 20 28 76 6f 69 64 28 2a 28 2a 29 28 76 6f 69 64   (void(*(*)(void
32150 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 28  *,const char*))(
32160 76 6f 69 64 29 29 64 6c 73 79 6d 3b 0a 20 20 72  void))dlsym;.  r
32170 65 74 75 72 6e 20 28 2a 78 29 28 70 2c 20 7a 53  eturn (*x)(p, zS
32180 79 6d 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ym);.}.static vo
32190 69 64 20 75 6e 69 78 44 6c 43 6c 6f 73 65 28 73  id unixDlClose(s
321a0 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55  qlite3_vfs *NotU
321b0 73 65 64 2c 20 76 6f 69 64 20 2a 70 48 61 6e 64  sed, void *pHand
321c0 6c 65 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  le){.  UNUSED_PA
321d0 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
321e0 3b 0a 20 20 64 6c 63 6c 6f 73 65 28 70 48 61 6e  ;.  dlclose(pHan
321f0 64 6c 65 29 3b 0a 7d 0a 23 65 6c 73 65 20 2f 2a  dle);.}.#else /*
32200 20 69 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   if SQLITE_OMIT_
32210 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 69  LOAD_EXTENSION i
32220 73 20 64 65 66 69 6e 65 64 3a 20 2a 2f 0a 20 20  s defined: */.  
32230 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 4f 70  #define unixDlOp
32240 65 6e 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  en  0.  #define 
32250 75 6e 69 78 44 6c 45 72 72 6f 72 20 30 0a 20 20  unixDlError 0.  
32260 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c 53 79  #define unixDlSy
32270 6d 20 20 20 30 0a 20 20 23 64 65 66 69 6e 65 20  m   0.  #define 
32280 75 6e 69 78 44 6c 43 6c 6f 73 65 20 30 0a 23 65  unixDlClose 0.#e
32290 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
322a0 65 20 6e 42 75 66 20 62 79 74 65 73 20 6f 66 20  e nBuf bytes of 
322b0 72 61 6e 64 6f 6d 20 64 61 74 61 20 74 6f 20 74  random data to t
322c0 68 65 20 73 75 70 70 6c 69 65 64 20 62 75 66 66  he supplied buff
322d0 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74  er zBuf..*/.stat
322e0 69 63 20 69 6e 74 20 75 6e 69 78 52 61 6e 64 6f  ic int unixRando
322f0 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66  mness(sqlite3_vf
32300 73 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20  s *NotUsed, int 
32310 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
32320 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
32330 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32340 20 20 61 73 73 65 72 74 28 28 73 69 7a 65 5f 74    assert((size_t
32350 29 6e 42 75 66 3e 3d 28 73 69 7a 65 6f 66 28 74  )nBuf>=(sizeof(t
32360 69 6d 65 5f 74 29 2b 73 69 7a 65 6f 66 28 69 6e  ime_t)+sizeof(in
32370 74 29 29 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 68  t)));..  /* We h
32380 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a  ave to initializ
32390 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76 65 6e  e zBuf to preven
323a0 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20  t valgrind from 
323b0 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65  reporting.  ** e
323c0 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65 70 6f  rrors.  The repo
323d0 72 74 73 20 69 73 73 75 65 64 20 62 79 20 76 61  rts issued by va
323e0 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63 6f 72  lgrind are incor
323f0 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a  rect - we would.
32400 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68 61 74    ** prefer that
32410 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20   the randomness 
32420 62 65 20 69 6e 63 72 65 61 73 65 64 20 62 79 20  be increased by 
32430 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20 74 68  making use of th
32440 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c  e.  ** uninitial
32450 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20 7a 42  ized space in zB
32460 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72 69 6e  uf - but valgrin
32470 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20 74 6f  d errors tend to
32480 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65   worry.  ** some
32490 20 75 73 65 72 73 2e 20 20 52 61 74 68 65 72 20   users.  Rather 
324a0 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74 20 73  than argue, it s
324b0 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75 73 74  eems easier just
324c0 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20   to initialize. 
324d0 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20 61 72   ** the whole ar
324e0 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63 65 20  ray and silence 
324f0 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e 20 69  valgrind, even i
32500 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c 65 73  f that means les
32510 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a  s randomness.  *
32520 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20  * in the random 
32530 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  seed..  **.  ** 
32540 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e  When testing, in
32550 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b  itializing zBuf[
32560 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c  ] to zero is all
32570 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20 6d 65   we do.  That me
32580 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20 77 65  ans.  ** that we
32590 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
325a0 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62  same random numb
325b0 65 72 20 73 65 71 75 65 6e 63 65 2e 20 20 54 68  er sequence.  Th
325c0 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20 20 2a  is makes the.  *
325d0 2a 20 74 65 73 74 73 20 72 65 70 65 61 74 61 62  * tests repeatab
325e0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  le..  */.  memse
325f0 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66 29  t(zBuf, 0, nBuf)
32600 3b 0a 20 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69  ;.  randomnessPi
32610 64 20 3d 20 6f 73 47 65 74 70 69 64 28 30 29 3b  d = osGetpid(0);
32620 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
32630 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20  SQLITE_TEST) && 
32640 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
32650 4f 4d 49 54 5f 52 41 4e 44 4f 4d 4e 45 53 53 29  OMIT_RANDOMNESS)
32660 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 66 64 2c  .  {.    int fd,
32670 20 67 6f 74 3b 0a 20 20 20 20 66 64 20 3d 20 72   got;.    fd = r
32680 6f 62 75 73 74 5f 6f 70 65 6e 28 22 2f 64 65 76  obust_open("/dev
32690 2f 75 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f  /urandom", O_RDO
326a0 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  NLY, 0);.    if(
326b0 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 74   fd<0 ){.      t
326c0 69 6d 65 5f 74 20 74 3b 0a 20 20 20 20 20 20 74  ime_t t;.      t
326d0 69 6d 65 28 26 74 29 3b 0a 20 20 20 20 20 20 6d  ime(&t);.      m
326e0 65 6d 63 70 79 28 7a 42 75 66 2c 20 26 74 2c 20  emcpy(zBuf, &t, 
326f0 73 69 7a 65 6f 66 28 74 29 29 3b 0a 20 20 20 20  sizeof(t));.    
32700 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
32710 69 7a 65 6f 66 28 74 29 5d 2c 20 26 72 61 6e 64  izeof(t)], &rand
32720 6f 6d 6e 65 73 73 50 69 64 2c 20 73 69 7a 65 6f  omnessPid, sizeo
32730 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29  f(randomnessPid)
32740 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
32750 20 73 69 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f   sizeof(t)+sizeo
32760 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29  f(randomnessPid)
32770 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29  <=(size_t)nBuf )
32780 3b 0a 20 20 20 20 20 20 6e 42 75 66 20 3d 20 73  ;.      nBuf = s
32790 69 7a 65 6f 66 28 74 29 20 2b 20 73 69 7a 65 6f  izeof(t) + sizeo
327a0 66 28 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 29  f(randomnessPid)
327b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
327c0 20 20 20 64 6f 7b 20 67 6f 74 20 3d 20 6f 73 52     do{ got = osR
327d0 65 61 64 28 66 64 2c 20 7a 42 75 66 2c 20 6e 42  ead(fd, zBuf, nB
327e0 75 66 29 3b 20 7d 77 68 69 6c 65 28 20 67 6f 74  uf); }while( got
327f0 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e  <0 && errno==EIN
32800 54 52 20 29 3b 0a 20 20 20 20 20 20 72 6f 62 75  TR );.      robu
32810 73 74 5f 63 6c 6f 73 65 28 30 2c 20 66 64 2c 20  st_close(0, fd, 
32820 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d  __LINE__);.    }
32830 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
32840 74 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f  turn nBuf;.}.../
32850 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
32860 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
32870 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
32880 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
32890 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
328a0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
328b0 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77  f microseconds w
328c0 65 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e  e want to sleep.
328d0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
328e0 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62  alue is the numb
328f0 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e  er of microsecon
32900 64 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75  ds of sleep actu
32910 61 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65  ally.** requeste
32920 64 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72  d from the under
32930 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20  lying operating 
32940 73 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72  system, a number
32950 20 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20   which.** might 
32960 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
32970 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
32980 61 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  argument, but no
32990 74 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74  t less.** than t
329a0 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  he argument..*/.
329b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
329c0 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73  leep(sqlite3_vfs
329d0 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d   *NotUsed, int m
329e0 69 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69  icroseconds){.#i
329f0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
32a00 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73  truct timespec s
32a10 70 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20  p;..  sp.tv_sec 
32a20 3d 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f  = microseconds /
32a30 20 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74   1000000;.  sp.t
32a40 76 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73  v_nsec = (micros
32a50 65 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30  econds % 1000000
32a60 29 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f  ) * 1000;.  nano
32a70 73 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29  sleep(&sp, NULL)
32a80 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
32a90 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
32aa0 20 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63   return microsec
32ab0 6f 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69  onds;.#elif defi
32ac0 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
32ad0 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
32ae0 20 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65    usleep(microse
32af0 63 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44  conds);.  UNUSED
32b00 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
32b10 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69  ed);.  return mi
32b20 63 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73  croseconds;.#els
32b30 65 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20  e.  int seconds 
32b40 3d 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b  = (microseconds+
32b50 39 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b  999999)/1000000;
32b60 0a 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73  .  sleep(seconds
32b70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
32b80 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
32b90 20 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73    return seconds
32ba0 2a 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66  *1000000;.#endif
32bb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
32bc0 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
32bd0 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f  , if set to a no
32be0 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73  n-zero value, is
32bf0 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a   interpreted as.
32c00 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
32c10 20 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31   seconds since 1
32c20 39 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20  970 and is used 
32c30 74 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c  to set the resul
32c40 74 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f  t of.** sqlite3O
32c50 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64  sCurrentTime() d
32c60 75 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a  uring testing..*
32c70 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
32c80 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
32c90 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
32ca0 30 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74  0;  /* Fake syst
32cb0 65 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e  em time in secon
32cc0 64 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a  ds since 1970. *
32cd0 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  /.#endif../*.** 
32ce0 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  Find the current
32cf0 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72   time (in Univer
32d00 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20  sal Coordinated 
32d10 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e  Time).  Write in
32d20 74 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65  to *piNow.** the
32d30 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e   current time an
32d40 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69  d date as a Juli
32d50 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69  an Day number ti
32d60 6d 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20  mes 86_400_000. 
32d70 20 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72   In.** other wor
32d80 64 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a  ds, write into *
32d90 70 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72  piNow the number
32da0 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
32db0 20 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61   since the Julia
32dc0 6e 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f  n.** epoch of no
32dd0 6f 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20  on in Greenwich 
32de0 6f 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20  on November 24, 
32df0 34 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69  4714 B.C accordi
32e00 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f  ng to the.** pro
32e10 6c 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e  leptic Gregorian
32e20 20 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a   calendar..**.**
32e30 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74   On success, ret
32e40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 20  urn SQLITE_OK.  
32e50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  Return SQLITE_ER
32e60 52 4f 52 20 69 66 20 74 68 65 20 74 69 6d 65 20  ROR if the time 
32e70 61 6e 64 20 64 61 74 65 20 0a 2a 2a 20 63 61 6e  and date .** can
32e80 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f  not be found..*/
32e90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
32ea0 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
32eb0 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
32ec0 74 55 73 65 64 2c 20 73 71 6c 69 74 65 33 5f 69  tUsed, sqlite3_i
32ed0 6e 74 36 34 20 2a 70 69 4e 6f 77 29 7b 0a 20 20  nt64 *piNow){.  
32ee0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
32ef0 69 74 65 33 5f 69 6e 74 36 34 20 75 6e 69 78 45  ite3_int64 unixE
32f00 70 6f 63 68 20 3d 20 32 34 34 30 35 38 37 35 2a  poch = 24405875*
32f10 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 38  (sqlite3_int64)8
32f20 36 34 30 30 30 30 3b 0a 20 20 69 6e 74 20 72 63  640000;.  int rc
32f30 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 69   = SQLITE_OK;.#i
32f40 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47 45 54  f defined(NO_GET
32f50 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20 74 3b  TOD).  time_t t;
32f60 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a  .  time(&t);.  *
32f70 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69 74 65  piNow = ((sqlite
32f80 33 5f 69 6e 74 36 34 29 74 29 2a 31 30 30 30 20  3_int64)t)*1000 
32f90 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23 65 6c  + unixEpoch;.#el
32fa0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
32fb0 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
32fc0 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f 67 65  sNow;.  clock_ge
32fd0 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45 41 4c  ttime(CLOCK_REAL
32fe0 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a 20 20  TIME, &sNow);.  
32ff0 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45 70 6f  *piNow = unixEpo
33000 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c 69 74  ch + 1000*(sqlit
33010 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e 74 76  e3_int64)sNow.tv
33020 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76 5f 6e  _sec + sNow.tv_n
33030 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23 65 6c  sec/1000000;.#el
33040 73 65 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65  se.  struct time
33050 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 28 76 6f 69  val sNow;.  (voi
33060 64 29 67 65 74 74 69 6d 65 6f 66 64 61 79 28 26  d)gettimeofday(&
33070 73 4e 6f 77 2c 20 30 29 3b 20 20 2f 2a 20 43 61  sNow, 0);  /* Ca
33080 6e 6e 6f 74 20 66 61 69 6c 20 67 69 76 65 6e 20  nnot fail given 
33090 76 61 6c 69 64 20 61 72 67 75 6d 65 6e 74 73 20  valid arguments 
330a0 2a 2f 0a 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e  */.  *piNow = un
330b0 69 78 45 70 6f 63 68 20 2b 20 31 30 30 30 2a 28  ixEpoch + 1000*(
330c0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 4e  sqlite3_int64)sN
330d0 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77  ow.tv_sec + sNow
330e0 2e 74 76 5f 75 73 65 63 2f 31 30 30 30 3b 0a 23  .tv_usec/1000;.#
330f0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
33100 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
33110 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
33120 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 69 4e  time ){.    *piN
33130 6f 77 20 3d 20 31 30 30 30 2a 28 73 71 6c 69 74  ow = 1000*(sqlit
33140 65 33 5f 69 6e 74 36 34 29 73 71 6c 69 74 65 33  e3_int64)sqlite3
33150 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 2b 20  _current_time + 
33160 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20 7d 0a 23  unixEpoch;.  }.#
33170 65 6e 64 69 66 0a 20 20 55 4e 55 53 45 44 5f 50  endif.  UNUSED_P
33180 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33190 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
331a0 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 6f 74 20  }..#if 0 /* Not 
331b0 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20 46 69  used */./*.** Fi
331c0 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  nd the current t
331d0 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61  ime (in Universa
331e0 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69  l Coordinated Ti
331f0 6d 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a  me).  Write the.
33200 2a 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  ** current time 
33210 61 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75  and date as a Ju
33220 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
33230 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a  into *prNow and.
33240 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  ** return 0.  Re
33250 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69  turn 1 if the ti
33260 6d 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e  me and date cann
33270 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  ot be found..*/.
33280 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
33290 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
332a0 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c  e3_vfs *NotUsed,
332b0 20 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b   double *prNow){
332c0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
332d0 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
332e0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
332f0 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
33300 20 72 63 20 3d 20 75 6e 69 78 43 75 72 72 65 6e   rc = unixCurren
33310 74 54 69 6d 65 49 6e 74 36 34 28 30 2c 20 26 69  tTimeInt64(0, &i
33320 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f  );.  *prNow = i/
33330 38 36 34 30 30 30 30 30 2e 30 3b 0a 20 20 72 65  86400000.0;.  re
33340 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65  turn rc;.}.#else
33350 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 43 75  .# define unixCu
33360 72 72 65 6e 74 54 69 6d 65 20 30 0a 23 65 6e 64  rrentTime 0.#end
33370 69 66 0a 0a 23 69 66 20 30 20 20 2f 2a 20 4e 6f  if..#if 0  /* No
33380 74 20 75 73 65 64 20 2a 2f 0a 2f 2a 0a 2a 2a 20  t used */./*.** 
33390 57 65 20 61 64 64 65 64 20 74 68 65 20 78 47 65  We added the xGe
333a0 74 4c 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74  tLastError() met
333b0 68 6f 64 20 77 69 74 68 20 74 68 65 20 69 6e 74  hod with the int
333c0 65 6e 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64  ention of provid
333d0 69 6e 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f  ing.** better lo
333e0 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65  w-level error me
333f0 73 73 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72  ssages when oper
33400 61 74 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f  ating-system pro
33410 62 6c 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a  blems come up.**
33420 20 64 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f   during SQLite o
33430 70 65 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73  peration.  But s
33440 6f 20 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74  o far, none of t
33450 68 61 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70  hat has been imp
33460 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74  lemented.** in t
33470 68 65 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69  he core.  So thi
33480 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76  s routine is nev
33490 65 72 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20  er called.  For 
334a0 6e 6f 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c  now, it is merel
334b0 79 0a 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c  y.** a place-hol
334c0 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  der..*/.static i
334d0 6e 74 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72  nt unixGetLastEr
334e0 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
334f0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
33500 74 55 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f  tUsed2, char *No
33510 74 55 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45  tUsed3){.  UNUSE
33520 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
33530 73 65 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  sed);.  UNUSED_P
33540 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
33550 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2);.  UNUSED_PAR
33560 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29  AMETER(NotUsed3)
33570 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
33580 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75  #else.# define u
33590 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72 20  nixGetLastError 
335a0 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
335b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
335c0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 73 71  ****** End of sq
335d0 6c 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64  lite3_vfs method
335e0 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
335f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
33650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
336a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
336c0 50 72 6f 78 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a  Proxy Locking **
336d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
336f0 2a 0a 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69  *.** Proxy locki
33700 6e 67 20 69 73 20 61 20 22 75 62 65 72 2d 6c 6f  ng is a "uber-lo
33710 63 6b 69 6e 67 2d 6d 65 74 68 6f 64 22 20 69 6e  cking-method" in
33720 20 74 68 69 73 20 73 65 6e 73 65 3a 20 20 49 74   this sense:  It
33730 20 75 73 65 73 20 74 68 65 0a 2a 2a 20 6f 74 68   uses the.** oth
33740 65 72 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  er locking metho
33750 64 73 20 6f 6e 20 73 65 63 6f 6e 64 61 72 79 20  ds on secondary 
33760 6c 6f 63 6b 20 66 69 6c 65 73 2e 20 20 50 72 6f  lock files.  Pro
33770 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 0a  xy locking is a.
33780 2a 2a 20 6d 65 74 61 2d 6c 61 79 65 72 20 6f 76  ** meta-layer ov
33790 65 72 20 74 6f 70 20 6f 66 20 74 68 65 20 70 72  er top of the pr
337a0 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
337b0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 62 6f 76  implemented abov
337c0 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 69 73 20  e.  For.** this 
337d0 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69  reason, the divi
337e0 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d  sion that implem
337f0 65 6e 74 73 20 6f 66 20 70 72 6f 78 79 20 6c 6f  ents of proxy lo
33800 63 6b 69 6e 67 20 69 73 20 64 65 66 65 72 72 65  cking is deferre
33810 64 0a 2a 2a 20 75 6e 74 69 6c 20 6c 61 74 65 20  d.** until late 
33820 69 6e 20 74 68 65 20 66 69 6c 65 20 28 68 65 72  in the file (her
33830 65 29 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  e) after all of 
33840 74 68 65 20 6f 74 68 65 72 20 49 2f 4f 20 6d 65  the other I/O me
33850 74 68 6f 64 73 20 68 61 76 65 0a 2a 2a 20 62 65  thods have.** be
33860 65 6e 20 64 65 66 69 6e 65 64 20 2d 20 73 6f 20  en defined - so 
33870 74 68 61 74 20 74 68 65 20 70 72 69 6d 69 74 69  that the primiti
33880 76 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  ve locking metho
33890 64 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ds are available
338a0 0a 2a 2a 20 61 73 20 73 65 72 76 69 63 65 73 20  .** as services 
338b0 74 6f 20 68 65 6c 70 20 77 69 74 68 20 74 68 65  to help with the
338c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
338d0 6f 66 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  of proxy locking
338e0 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  ..**.****.**.** 
338f0 54 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  The default lock
33900 69 6e 67 20 73 63 68 65 6d 65 73 20 69 6e 20 53  ing schemes in S
33910 51 4c 69 74 65 20 75 73 65 20 62 79 74 65 2d 72  QLite use byte-r
33920 61 6e 67 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ange locks on th
33930 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  e.** database fi
33940 6c 65 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65  le to coordinate
33950 20 73 61 66 65 2c 20 63 6f 6e 63 75 72 72 65 6e   safe, concurren
33960 74 20 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74  t access by mult
33970 69 70 6c 65 20 72 65 61 64 65 72 73 0a 2a 2a 20  iple readers.** 
33980 61 6e 64 20 77 72 69 74 65 72 73 20 5b 68 74 74  and writers [htt
33990 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67 2f 6c  p://sqlite.org/l
339a0 6f 63 6b 69 6e 67 76 33 2e 68 74 6d 6c 5d 2e 20  ockingv3.html]. 
339b0 20 54 68 65 20 66 69 76 65 20 66 69 6c 65 20 6c   The five file l
339c0 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  ocking.** states
339d0 20 28 55 4e 4c 4f 43 4b 45 44 2c 20 50 45 4e 44   (UNLOCKED, PEND
339e0 49 4e 47 2c 20 53 48 41 52 45 44 2c 20 52 45 53  ING, SHARED, RES
339f0 45 52 56 45 44 2c 20 45 58 43 4c 55 53 49 56 45  ERVED, EXCLUSIVE
33a00 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65  ) are implemente
33a10 64 0a 2a 2a 20 61 73 20 50 4f 53 49 58 20 72 65  d.** as POSIX re
33a20 61 64 20 26 20 77 72 69 74 65 20 6c 6f 63 6b 73  ad & write locks
33a30 20 6f 76 65 72 20 66 69 78 65 64 20 73 65 74 20   over fixed set 
33a40 6f 66 20 6c 6f 63 61 74 69 6f 6e 73 20 28 76 69  of locations (vi
33a50 61 20 66 73 63 74 6c 29 2c 0a 2a 2a 20 6f 6e 20  a fsctl),.** on 
33a60 41 46 50 20 61 6e 64 20 53 4d 42 20 6f 6e 6c 79  AFP and SMB only
33a70 20 65 78 63 6c 75 73 69 76 65 20 62 79 74 65 2d   exclusive byte-
33a80 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65 20  range locks are 
33a90 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 66 73  available via fs
33aa0 63 74 6c 0a 2a 2a 20 77 69 74 68 20 5f 49 4f 57  ctl.** with _IOW
33ab0 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72 75 63  R('z', 23, struc
33ac0 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50  t ByteRangeLockP
33ad0 42 32 29 20 74 6f 20 74 72 61 63 6b 20 74 68 65  B2) to track the
33ae0 20 73 61 6d 65 20 35 20 73 74 61 74 65 73 2e 0a   same 5 states..
33af0 2a 2a 20 54 6f 20 73 69 6d 75 6c 61 74 65 20 61  ** To simulate a
33b00 20 46 5f 52 44 4c 43 4b 20 6f 6e 20 74 68 65 20   F_RDLCK on the 
33b10 73 68 61 72 65 64 20 72 61 6e 67 65 2c 20 6f 6e  shared range, on
33b20 20 41 46 50 20 61 20 72 61 6e 64 6f 6d 6c 79 20   AFP a randomly 
33b30 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 64 64 72  selected.** addr
33b40 65 73 73 20 69 6e 20 74 68 65 20 73 68 61 72 65  ess in the share
33b50 64 20 72 61 6e 67 65 20 69 73 20 74 61 6b 65 6e  d range is taken
33b60 20 66 6f 72 20 61 20 53 48 41 52 45 44 20 6c 6f   for a SHARED lo
33b70 63 6b 2c 20 74 68 65 20 65 6e 74 69 72 65 0a 2a  ck, the entire.*
33b80 2a 20 73 68 61 72 65 64 20 72 61 6e 67 65 20 69  * shared range i
33b90 73 20 74 61 6b 65 6e 20 66 6f 72 20 61 6e 20 45  s taken for an E
33ba0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 29 3a 0a  XCLUSIVE lock):.
33bb0 2a 2a 0a 2a 2a 20 20 20 20 20 20 50 45 4e 44 49  **.**      PENDI
33bc0 4e 47 5f 42 59 54 45 20 20 20 20 20 20 20 20 30  NG_BYTE        0
33bd0 78 34 30 30 30 30 30 30 30 0a 2a 2a 20 20 20 20  x40000000.**    
33be0 20 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 20    RESERVED_BYTE 
33bf0 20 20 20 20 20 20 30 78 34 30 30 30 30 30 30 31        0x40000001
33c00 0a 2a 2a 20 20 20 20 20 20 53 48 41 52 45 44 5f  .**      SHARED_
33c10 52 41 4e 47 45 20 20 20 20 20 20 20 20 30 78 34  RANGE        0x4
33c20 30 30 30 30 30 30 32 20 2d 3e 20 30 78 34 30 30  0000002 -> 0x400
33c30 30 30 32 30 30 0a 2a 2a 0a 2a 2a 20 54 68 69 73  00200.**.** This
33c40 20 77 6f 72 6b 73 20 77 65 6c 6c 20 6f 6e 20 74   works well on t
33c50 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79  he local file sy
33c60 73 74 65 6d 2c 20 62 75 74 20 73 68 6f 77 73 20  stem, but shows 
33c70 61 20 6e 65 61 72 6c 79 20 31 30 30 78 0a 2a 2a  a nearly 100x.**
33c80 20 73 6c 6f 77 64 6f 77 6e 20 69 6e 20 72 65 61   slowdown in rea
33c90 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 6e  d performance on
33ca0 20 41 46 50 20 62 65 63 61 75 73 65 20 74 68 65   AFP because the
33cb0 20 41 46 50 20 63 6c 69 65 6e 74 20 64 69 73 61   AFP client disa
33cc0 62 6c 65 73 0a 2a 2a 20 74 68 65 20 72 65 61 64  bles.** the read
33cd0 20 63 61 63 68 65 20 77 68 65 6e 20 62 79 74 65   cache when byte
33ce0 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20 61 72 65  -range locks are
33cf0 20 70 72 65 73 65 6e 74 2e 20 20 45 6e 61 62 6c   present.  Enabl
33d00 69 6e 67 20 74 68 65 20 72 65 61 64 0a 2a 2a 20  ing the read.** 
33d10 63 61 63 68 65 20 65 78 70 6f 73 65 73 20 61 20  cache exposes a 
33d20 63 61 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20  cache coherency 
33d30 70 72 6f 62 6c 65 6d 20 74 68 61 74 20 69 73 20  problem that is 
33d40 70 72 65 73 65 6e 74 20 6f 6e 20 61 6c 6c 20 4f  present on all O
33d50 53 20 58 0a 2a 2a 20 73 75 70 70 6f 72 74 65 64  S X.** supported
33d60 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 20 73 79   network file sy
33d70 73 74 65 6d 73 2e 20 20 4e 46 53 20 61 6e 64 20  stems.  NFS and 
33d80 41 46 50 20 62 6f 74 68 20 6f 62 73 65 72 76 65  AFP both observe
33d90 20 74 68 65 0a 2a 2a 20 63 6c 6f 73 65 2d 74 6f   the.** close-to
33da0 2d 6f 70 65 6e 20 73 65 6d 61 6e 74 69 63 73 20  -open semantics 
33db0 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 63 61 63  for ensuring cac
33dc0 68 65 20 63 6f 68 65 72 65 6e 63 79 0a 2a 2a 20  he coherency.** 
33dd0 5b 68 74 74 70 3a 2f 2f 6e 66 73 2e 73 6f 75 72  [http://nfs.sour
33de0 63 65 66 6f 72 67 65 2e 6e 65 74 2f 23 66 61 71  ceforge.net/#faq
33df0 5f 61 38 5d 2c 20 77 68 69 63 68 20 64 6f 65 73  _a8], which does
33e00 20 6e 6f 74 20 65 66 66 65 63 74 69 76 65 6c 79   not effectively
33e10 0a 2a 2a 20 61 64 64 72 65 73 73 20 74 68 65 20  .** address the 
33e20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66 6f 72  requirements for
33e30 20 63 6f 6e 63 75 72 72 65 6e 74 20 64 61 74 61   concurrent data
33e40 62 61 73 65 20 61 63 63 65 73 73 20 62 79 20 6d  base access by m
33e50 75 6c 74 69 70 6c 65 0a 2a 2a 20 72 65 61 64 65  ultiple.** reade
33e60 72 73 20 61 6e 64 20 77 72 69 74 65 72 73 0a 2a  rs and writers.*
33e70 2a 20 5b 68 74 74 70 3a 2f 2f 77 77 77 2e 6e 61  * [http://www.na
33e80 62 62 6c 65 2e 63 6f 6d 2f 53 51 4c 69 74 65 2d  bble.com/SQLite-
33e90 6f 6e 2d 4e 46 53 2d 63 61 63 68 65 2d 63 6f 68  on-NFS-cache-coh
33ea0 65 72 65 6e 63 79 2d 74 64 31 35 36 35 35 37 30  erency-td1565570
33eb0 31 2e 68 74 6d 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54  1.html]..**.** T
33ec0 6f 20 61 64 64 72 65 73 73 20 74 68 65 20 70 65  o address the pe
33ed0 72 66 6f 72 6d 61 6e 63 65 20 61 6e 64 20 63 61  rformance and ca
33ee0 63 68 65 20 63 6f 68 65 72 65 6e 63 79 20 69 73  che coherency is
33ef0 73 75 65 73 2c 20 70 72 6f 78 79 20 66 69 6c 65  sues, proxy file
33f00 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e   locking.** chan
33f10 67 65 73 20 74 68 65 20 77 61 79 20 64 61 74 61  ges the way data
33f20 62 61 73 65 20 61 63 63 65 73 73 20 69 73 20 63  base access is c
33f30 6f 6e 74 72 6f 6c 6c 65 64 20 62 79 20 6c 69 6d  ontrolled by lim
33f40 69 74 69 6e 67 20 61 63 63 65 73 73 20 74 6f 20  iting access to 
33f50 61 0a 2a 2a 20 73 69 6e 67 6c 65 20 68 6f 73 74  a.** single host
33f60 20 61 74 20 61 20 74 69 6d 65 20 61 6e 64 20 6d   at a time and m
33f70 6f 76 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  oving file locks
33f80 20 6f 66 66 20 6f 66 20 74 68 65 20 64 61 74 61   off of the data
33f90 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  base file.** and
33fa0 20 6f 6e 74 6f 20 61 20 70 72 6f 78 79 20 66 69   onto a proxy fi
33fb0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20  le on the local 
33fc0 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 20 0a 2a  file system.  .*
33fd0 2a 0a 2a 2a 0a 2a 2a 20 55 73 69 6e 67 20 70 72  *.**.** Using pr
33fe0 6f 78 79 20 6c 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d  oxy locks.** ---
33ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
34000 2a 0a 2a 2a 20 43 20 41 50 49 73 0a 2a 2a 0a 2a  *.** C APIs.**.*
34010 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  *  sqlite3_file_
34020 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61  control(db, dbna
34030 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  me, SQLITE_FCNTL
34040 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
34050 4c 45 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  LE,.**          
34060 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 70 72               <pr
34070 6f 78 79 5f 70 61 74 68 3e 20 7c 20 22 3a 61 75  oxy_path> | ":au
34080 74 6f 3a 22 29 3b 0a 2a 2a 20 20 73 71 6c 69 74  to:");.**  sqlit
34090 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
340a0 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53 51 4c 49  db, dbname, SQLI
340b0 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43  TE_FCNTL_GET_LOC
340c0 4b 50 52 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20  KPROXYFILE,.**  
340d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
340e0 20 20 20 20 20 26 3c 70 72 6f 78 79 5f 70 61 74       &<proxy_pat
340f0 68 3e 29 3b 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 53 51  h>);.**.**.** SQ
34100 4c 20 70 72 61 67 6d 61 73 0a 2a 2a 0a 2a 2a 20  L pragmas.**.** 
34110 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62 61 73   PRAGMA [databas
34120 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69  e.]lock_proxy_fi
34130 6c 65 3d 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20  le=<proxy_path> 
34140 7c 20 3a 61 75 74 6f 3a 0a 2a 2a 20 20 50 52 41  | :auto:.**  PRA
34150 47 4d 41 20 5b 64 61 74 61 62 61 73 65 2e 5d 6c  GMA [database.]l
34160 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c 65 0a 2a  ock_proxy_file.*
34170 2a 0a 2a 2a 20 53 70 65 63 69 66 79 69 6e 67 20  *.** Specifying 
34180 22 3a 61 75 74 6f 3a 22 20 6d 65 61 6e 73 20 74  ":auto:" means t
34190 68 61 74 20 69 66 20 74 68 65 72 65 20 69 73 20  hat if there is 
341a0 61 20 63 6f 6e 63 68 20 66 69 6c 65 20 77 69 74  a conch file wit
341b0 68 20 61 20 6d 61 74 63 68 69 6e 67 0a 2a 2a 20  h a matching.** 
341c0 68 6f 73 74 20 49 44 20 69 6e 20 69 74 2c 20 74  host ID in it, t
341d0 68 65 20 70 72 6f 78 79 20 70 61 74 68 20 69 6e  he proxy path in
341e0 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20   the conch file 
341f0 77 69 6c 6c 20 62 65 20 75 73 65 64 2c 20 6f 74  will be used, ot
34200 68 65 72 77 69 73 65 0a 2a 2a 20 61 20 70 72 6f  herwise.** a pro
34210 78 79 20 70 61 74 68 20 62 61 73 65 64 20 6f 6e  xy path based on
34220 20 74 68 65 20 75 73 65 72 27 73 20 74 65 6d 70   the user's temp
34230 20 64 69 72 0a 2a 2a 20 28 76 69 61 20 63 6f 6e   dir.** (via con
34240 66 73 74 72 28 5f 43 53 5f 44 41 52 57 49 4e 5f  fstr(_CS_DARWIN_
34250 55 53 45 52 5f 54 45 4d 50 5f 44 49 52 2c 2e 2e  USER_TEMP_DIR,..
34260 2e 29 29 20 77 69 6c 6c 20 62 65 20 75 73 65 64  .)) will be used
34270 20 61 6e 64 20 74 68 65 0a 2a 2a 20 61 63 74 75   and the.** actu
34280 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 20 6e 61  al proxy file na
34290 6d 65 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  me is generated 
342a0 66 72 6f 6d 20 74 68 65 20 6e 61 6d 65 20 61 6e  from the name an
342b0 64 20 70 61 74 68 20 6f 66 20 74 68 65 0a 2a 2a  d path of the.**
342c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
342d0 20 46 6f 72 20 65 78 61 6d 70 6c 65 3a 0a 2a 2a   For example:.**
342e0 0a 2a 2a 20 20 20 20 20 20 20 46 6f 72 20 64 61  .**       For da
342f0 74 61 62 61 73 65 20 70 61 74 68 20 22 2f 55 73  tabase path "/Us
34300 65 72 73 2f 6d 65 2f 66 6f 6f 2e 64 62 22 20 0a  ers/me/foo.db" .
34310 2a 2a 20 20 20 20 20 20 20 54 68 65 20 6c 6f 63  **       The loc
34320 6b 20 70 61 74 68 20 77 69 6c 6c 20 62 65 20 22  k path will be "
34330 3c 74 6d 70 64 69 72 3e 2f 73 71 6c 69 74 65 70  <tmpdir>/sqlitep
34340 6c 6f 63 6b 73 2f 5f 55 73 65 72 73 5f 6d 65 5f  locks/_Users_me_
34350 66 6f 6f 2e 64 62 3a 61 75 74 6f 3a 22 29 0a 2a  foo.db:auto:").*
34360 2a 0a 2a 2a 20 4f 6e 63 65 20 61 20 6c 6f 63 6b  *.** Once a lock
34370 20 70 72 6f 78 79 20 69 73 20 63 6f 6e 66 69 67   proxy is config
34380 75 72 65 64 20 66 6f 72 20 61 20 64 61 74 61 62  ured for a datab
34390 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2c 20  ase connection, 
343a0 69 74 20 63 61 6e 20 6e 6f 74 0a 2a 2a 20 62 65  it can not.** be
343b0 20 72 65 6d 6f 76 65 64 2c 20 68 6f 77 65 76 65   removed, howeve
343c0 72 20 69 74 20 6d 61 79 20 62 65 20 73 77 69 74  r it may be swit
343d0 63 68 65 64 20 74 6f 20 61 20 64 69 66 66 65 72  ched to a differ
343e0 65 6e 74 20 70 72 6f 78 79 20 70 61 74 68 20 76  ent proxy path v
343f0 69 61 0a 2a 2a 20 74 68 65 20 61 62 6f 76 65 20  ia.** the above 
34400 41 50 49 73 20 28 61 73 73 75 6d 69 6e 67 20 74  APIs (assuming t
34410 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 69 73  he conch file is
34420 20 6e 6f 74 20 62 65 69 6e 67 20 68 65 6c 64 20   not being held 
34430 62 79 20 61 6e 6f 74 68 65 72 0a 2a 2a 20 63 6f  by another.** co
34440 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 70 72 6f 63  nnection or proc
34450 65 73 73 29 2e 20 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ess). .**.**.** 
34460 48 6f 77 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  How proxy lockin
34470 67 20 77 6f 72 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d  g works.** -----
34480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34490 2d 2d 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20 66  --.**.** Proxy f
344a0 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 72 65 6c 69  ile locking reli
344b0 65 73 20 70 72 69 6d 61 72 69 6c 79 20 6f 6e 20  es primarily on 
344c0 74 77 6f 20 6e 65 77 20 73 75 70 70 6f 72 74 69  two new supporti
344d0 6e 67 20 66 69 6c 65 73 3a 20 0a 2a 2a 0a 2a 2a  ng files: .**.**
344e0 20 20 20 2a 20 20 63 6f 6e 63 68 20 66 69 6c 65     *  conch file
344f0 20 74 6f 20 6c 69 6d 69 74 20 61 63 63 65 73 73   to limit access
34500 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
34510 20 66 69 6c 65 20 74 6f 20 61 20 73 69 6e 67 6c   file to a singl
34520 65 20 68 6f 73 74 0a 2a 2a 20 20 20 20 20 20 61  e host.**      a
34530 74 20 61 20 74 69 6d 65 0a 2a 2a 0a 2a 2a 20 20  t a time.**.**  
34540 20 2a 20 20 70 72 6f 78 79 20 66 69 6c 65 20 74   *  proxy file t
34550 6f 20 61 63 74 20 61 73 20 61 20 70 72 6f 78 79  o act as a proxy
34560 20 66 6f 72 20 74 68 65 20 61 64 76 69 73 6f 72   for the advisor
34570 79 20 6c 6f 63 6b 73 20 6e 6f 72 6d 61 6c 6c 79  y locks normally
34580 0a 2a 2a 20 20 20 20 20 20 74 61 6b 65 6e 20 6f  .**      taken o
34590 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  n the database.*
345a0 2a 0a 2a 2a 20 54 68 65 20 63 6f 6e 63 68 20 66  *.** The conch f
345b0 69 6c 65 20 2d 20 74 6f 20 75 73 65 20 61 20 70  ile - to use a p
345c0 72 6f 78 79 20 66 69 6c 65 2c 20 73 71 6c 69 74  roxy file, sqlit
345d0 65 20 6d 75 73 74 20 66 69 72 73 74 20 22 68 6f  e must first "ho
345e0 6c 64 20 74 68 65 20 63 6f 6e 63 68 22 0a 2a 2a  ld the conch".**
345f0 20 62 79 20 74 61 6b 69 6e 67 20 61 6e 20 73 71   by taking an sq
34600 6c 69 74 65 2d 73 74 79 6c 65 20 73 68 61 72 65  lite-style share
34610 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 63 6f  d lock on the co
34620 6e 63 68 20 66 69 6c 65 2c 20 72 65 61 64 69 6e  nch file, readin
34630 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
34640 73 20 61 6e 64 20 63 6f 6d 70 61 72 69 6e 67 20  s and comparing 
34650 74 68 65 20 68 6f 73 74 27 73 20 75 6e 69 71 75  the host's uniqu
34660 65 20 68 6f 73 74 20 49 44 20 28 73 65 65 20 62  e host ID (see b
34670 65 6c 6f 77 29 20 61 6e 64 20 6c 6f 63 6b 0a 2a  elow) and lock.*
34680 2a 20 70 72 6f 78 79 20 70 61 74 68 20 61 67 61  * proxy path aga
34690 69 6e 73 74 20 74 68 65 20 76 61 6c 75 65 73 20  inst the values 
346a0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 6f  stored in the co
346b0 6e 63 68 2e 20 20 54 68 65 20 63 6f 6e 63 68 20  nch.  The conch 
346c0 66 69 6c 65 20 69 73 0a 2a 2a 20 73 74 6f 72 65  file is.** store
346d0 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69  d in the same di
346e0 72 65 63 74 6f 72 79 20 61 73 20 74 68 65 20 64  rectory as the d
346f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
34700 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 0a 2a   the file name.*
34710 2a 20 69 73 20 70 61 74 74 65 72 6e 65 64 20 61  * is patterned a
34720 66 74 65 72 20 74 68 65 20 64 61 74 61 62 61 73  fter the databas
34730 65 20 66 69 6c 65 20 6e 61 6d 65 20 61 73 20 22  e file name as "
34740 2e 3c 64 61 74 61 62 61 73 65 6e 61 6d 65 3e 2d  .<databasename>-
34750 63 6f 6e 63 68 22 2e 0a 2a 2a 20 49 66 20 74 68  conch"..** If th
34760 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 6f 65  e conch file doe
34770 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 6f 72 20  s not exist, or 
34780 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 64 6f 20  its contents do 
34790 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 0a 2a 2a  not match the.**
347a0 20 68 6f 73 74 20 49 44 20 61 6e 64 2f 6f 72 20   host ID and/or 
347b0 70 72 6f 78 79 20 70 61 74 68 2c 20 74 68 65 6e  proxy path, then
347c0 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 65 73 63   the lock is esc
347d0 61 6c 61 74 65 64 20 74 6f 20 61 6e 20 65 78 63  alated to an exc
347e0 6c 75 73 69 76 65 0a 2a 2a 20 6c 6f 63 6b 20 61  lusive.** lock a
347f0 6e 64 20 74 68 65 20 63 6f 6e 63 68 20 66 69 6c  nd the conch fil
34800 65 20 63 6f 6e 74 65 6e 74 73 20 69 73 20 75 70  e contents is up
34810 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 68  dated with the h
34820 6f 73 74 20 49 44 20 61 6e 64 20 70 72 6f 78 79  ost ID and proxy
34830 0a 2a 2a 20 70 61 74 68 20 61 6e 64 20 74 68 65  .** path and the
34840 20 6c 6f 63 6b 20 69 73 20 64 6f 77 6e 67 72 61   lock is downgra
34850 64 65 64 20 74 6f 20 61 20 73 68 61 72 65 64 20  ded to a shared 
34860 6c 6f 63 6b 20 61 67 61 69 6e 2e 20 20 49 66 20  lock again.  If 
34870 74 68 65 20 63 6f 6e 63 68 0a 2a 2a 20 69 73 20  the conch.** is 
34880 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72 20  held by another 
34890 70 72 6f 63 65 73 73 20 28 77 69 74 68 20 61 20  process (with a 
348a0 73 68 61 72 65 64 20 6c 6f 63 6b 29 2c 20 74 68  shared lock), th
348b0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
348c0 0a 2a 2a 20 77 69 6c 6c 20 66 61 69 6c 20 61 6e  .** will fail an
348d0 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  d SQLITE_BUSY is
348e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
348f0 20 54 68 65 20 70 72 6f 78 79 20 66 69 6c 65 20   The proxy file 
34900 2d 20 61 20 73 69 6e 67 6c 65 2d 62 79 74 65 20  - a single-byte 
34910 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20 61 6c  file used for al
34920 6c 20 61 64 76 69 73 6f 72 79 20 66 69 6c 65 20  l advisory file 
34930 6c 6f 63 6b 73 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c  locks.** normall
34940 79 20 74 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64  y taken on the d
34950 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 20  atabase file.   
34960 54 68 69 73 20 61 6c 6c 6f 77 73 20 66 6f 72 20  This allows for 
34970 73 61 66 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20  safe sharing.** 
34980 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34990 66 69 6c 65 20 66 6f 72 20 6d 75 6c 74 69 70 6c  file for multipl
349a0 65 20 72 65 61 64 65 72 73 20 61 6e 64 20 77 72  e readers and wr
349b0 69 74 65 72 73 20 6f 6e 20 74 68 65 20 73 61 6d  iters on the sam
349c0 65 0a 2a 2a 20 68 6f 73 74 20 28 74 68 65 20 63  e.** host (the c
349d0 6f 6e 63 68 20 65 6e 73 75 72 65 73 20 74 68 61  onch ensures tha
349e0 74 20 74 68 65 79 20 61 6c 6c 20 75 73 65 20 74  t they all use t
349f0 68 65 20 73 61 6d 65 20 6c 6f 63 61 6c 20 6c 6f  he same local lo
34a00 63 6b 20 66 69 6c 65 29 2e 0a 2a 2a 0a 2a 2a 20  ck file)..**.** 
34a10 52 65 71 75 65 73 74 69 6e 67 20 74 68 65 20 6c  Requesting the l
34a20 6f 63 6b 20 70 72 6f 78 79 20 64 6f 65 73 20 6e  ock proxy does n
34a30 6f 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 74  ot immediately t
34a40 61 6b 65 20 74 68 65 20 63 6f 6e 63 68 2c 20 69  ake the conch, i
34a50 74 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 74 61 6b  t is.** only tak
34a60 65 6e 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  en when the firs
34a70 74 20 72 65 71 75 65 73 74 20 74 6f 20 6c 6f 63  t request to loc
34a80 6b 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  k database file 
34a90 69 73 20 6d 61 64 65 2e 20 20 0a 2a 2a 20 54 68  is made.  .** Th
34aa0 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 73  is matches the s
34ab0 65 6d 61 6e 74 69 63 73 20 6f 66 20 74 68 65 20  emantics of the 
34ac0 74 72 61 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b  traditional lock
34ad0 69 6e 67 20 62 65 68 61 76 69 6f 72 2c 20 77 68  ing behavior, wh
34ae0 65 72 65 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 61  ere.** opening a
34af0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61   connection to a
34b00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 64   database file d
34b10 6f 65 73 20 6e 6f 74 20 74 61 6b 65 20 61 20 6c  oes not take a l
34b20 6f 63 6b 20 6f 6e 20 69 74 2e 0a 2a 2a 20 54 68  ock on it..** Th
34b30 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  e shared lock an
34b40 64 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 64  d an open file d
34b50 65 73 63 72 69 70 74 6f 72 20 61 72 65 20 6d 61  escriptor are ma
34b60 69 6e 74 61 69 6e 65 64 20 75 6e 74 69 6c 20 0a  intained until .
34b70 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ** the connectio
34b80 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
34b90 65 20 69 73 20 63 6c 6f 73 65 64 2e 20 0a 2a 2a  e is closed. .**
34ba0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 66 69  .** The proxy fi
34bb0 6c 65 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  le and the lock 
34bc0 66 69 6c 65 20 61 72 65 20 6e 65 76 65 72 20 64  file are never d
34bd0 65 6c 65 74 65 64 20 73 6f 20 74 68 65 79 20 6f  eleted so they o
34be0 6e 6c 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62  nly need.** to b
34bf0 65 20 63 72 65 61 74 65 64 20 74 68 65 20 66 69  e created the fi
34c00 72 73 74 20 74 69 6d 65 20 74 68 65 79 20 61 72  rst time they ar
34c10 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 43 6f  e used..**.** Co
34c20 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69  nfiguration opti
34c30 6f 6e 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ons.** ---------
34c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a  ------------.**.
34c50 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 45 46 45  **  SQLITE_PREFE
34c60 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a  R_PROXY_LOCKING.
34c70 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 44 61 74 61  **.**       Data
34c80 62 61 73 65 20 66 69 6c 65 73 20 61 63 63 65 73  base files acces
34c90 73 65 64 20 6f 6e 20 6e 6f 6e 2d 6c 6f 63 61 6c  sed on non-local
34ca0 20 66 69 6c 65 20 73 79 73 74 65 6d 73 20 61 72   file systems ar
34cb0 65 0a 2a 2a 20 20 20 20 20 20 20 61 75 74 6f 6d  e.**       autom
34cc0 61 74 69 63 61 6c 6c 79 20 63 6f 6e 66 69 67 75  atically configu
34cd0 72 65 64 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  red for proxy lo
34ce0 63 6b 69 6e 67 2c 20 6c 6f 63 6b 20 66 69 6c 65  cking, lock file
34cf0 73 20 61 72 65 0a 2a 2a 20 20 20 20 20 20 20 6e  s are.**       n
34d00 61 6d 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  amed automatical
34d10 6c 79 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ly using the sam
34d20 65 20 6c 6f 67 69 63 20 61 73 0a 2a 2a 20 20 20  e logic as.**   
34d30 20 20 20 20 50 52 41 47 4d 41 20 6c 6f 63 6b 5f      PRAGMA lock_
34d40 70 72 6f 78 79 5f 66 69 6c 65 3d 22 3a 61 75 74  proxy_file=":aut
34d50 6f 3a 22 0a 2a 2a 20 20 20 20 0a 2a 2a 20 20 53  o:".**    .**  S
34d60 51 4c 49 54 45 5f 50 52 4f 58 59 5f 44 45 42 55  QLITE_PROXY_DEBU
34d70 47 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 45 6e  G.**.**       En
34d80 61 62 6c 65 73 20 74 68 65 20 6c 6f 67 67 69 6e  ables the loggin
34d90 67 20 6f 66 20 65 72 72 6f 72 20 6d 65 73 73 61  g of error messa
34da0 67 65 73 20 64 75 72 69 6e 67 20 68 6f 73 74 20  ges during host 
34db0 69 64 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 20  id file.**      
34dc0 20 72 65 74 72 69 65 76 61 6c 20 61 6e 64 20 63   retrieval and c
34dd0 72 65 61 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 4c  reation.**.**  L
34de0 4f 43 4b 50 52 4f 58 59 44 49 52 0a 2a 2a 0a 2a  OCKPROXYDIR.**.*
34df0 2a 20 20 20 20 20 20 20 4f 76 65 72 72 69 64 65  *       Override
34e00 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 64 69  s the default di
34e10 72 65 63 74 6f 72 79 20 75 73 65 64 20 66 6f 72  rectory used for
34e20 20 6c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65   lock proxy file
34e30 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  s that.**       
34e40 61 72 65 20 6e 61 6d 65 64 20 61 75 74 6f 6d 61  are named automa
34e50 74 69 63 61 6c 6c 79 20 76 69 61 20 74 68 65 20  tically via the 
34e60 22 3a 61 75 74 6f 3a 22 20 73 65 74 74 69 6e 67  ":auto:" setting
34e70 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 44  .**.**  SQLITE_D
34e80 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
34e90 50 45 52 4d 49 53 53 49 4f 4e 53 0a 2a 2a 0a 2a  PERMISSIONS.**.*
34ea0 2a 20 20 20 20 20 20 20 50 65 72 6d 69 73 73 69  *       Permissi
34eb0 6f 6e 73 20 74 6f 20 75 73 65 20 77 68 65 6e 20  ons to use when 
34ec0 63 72 65 61 74 69 6e 67 20 61 20 64 69 72 65 63  creating a direc
34ed0 74 6f 72 79 20 66 6f 72 20 73 74 6f 72 69 6e 67  tory for storing
34ee0 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6c 6f   the.**       lo
34ef0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 73 2c 20  ck proxy files, 
34f00 6f 6e 6c 79 20 75 73 65 64 20 77 68 65 6e 20 4c  only used when L
34f10 4f 43 4b 50 52 4f 58 59 44 49 52 20 69 73 20 6e  OCKPROXYDIR is n
34f20 6f 74 20 73 65 74 2e 0a 2a 2a 20 20 20 20 0a 2a  ot set..**    .*
34f30 2a 20 20 20 20 0a 2a 2a 20 41 73 20 6d 65 6e 74  *    .** As ment
34f40 69 6f 6e 65 64 20 61 62 6f 76 65 2c 20 77 68 65  ioned above, whe
34f50 6e 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  n compiled with 
34f60 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52  SQLITE_PREFER_PR
34f70 4f 58 59 5f 4c 4f 43 4b 49 4e 47 2c 0a 2a 2a 20  OXY_LOCKING,.** 
34f80 73 65 74 74 69 6e 67 20 74 68 65 20 65 6e 76 69  setting the envi
34f90 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
34fa0 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f 50 52   SQLITE_FORCE_PR
34fb0 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 74 6f 20 31  OXY_LOCKING to 1
34fc0 20 77 69 6c 6c 0a 2a 2a 20 66 6f 72 63 65 20 70   will.** force p
34fd0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20  roxy locking to 
34fe0 62 65 20 75 73 65 64 20 66 6f 72 20 65 76 65 72  be used for ever
34ff0 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
35000 6f 70 65 6e 65 64 2c 20 61 6e 64 20 30 0a 2a 2a  opened, and 0.**
35010 20 77 69 6c 6c 20 66 6f 72 63 65 20 61 75 74 6f   will force auto
35020 6d 61 74 69 63 20 70 72 6f 78 79 20 6c 6f 63 6b  matic proxy lock
35030 69 6e 67 20 74 6f 20 62 65 20 64 69 73 61 62 6c  ing to be disabl
35040 65 64 20 66 6f 72 20 61 6c 6c 20 64 61 74 61 62  ed for all datab
35050 61 73 65 0a 2a 2a 20 66 69 6c 65 73 20 28 65 78  ase.** files (ex
35060 70 6c 69 63 69 74 6c 79 20 63 61 6c 6c 69 6e 67  plicitly calling
35070 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
35080 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  L_SET_LOCKPROXYF
35090 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
350a0 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
350b0 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
350c0 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
350d0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
350e0 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
350f0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
35100 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
35110 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
35120 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
35130 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
35140 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
35150 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
35160 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
35170 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
35180 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
35190 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
351a0 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
351b0 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
351c0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
351d0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
351e0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
351f0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
35200 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
35210 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
35220 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
35230 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
35240 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
35250 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
35260 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
35270 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
35280 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
35290 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
352a0 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
352b0 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
352c0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
352d0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
352e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
352f0 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
35300 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
35310 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
35320 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
35330 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
35340 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
35350 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
35360 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
35370 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
35380 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
35390 0a 20 20 69 6e 74 20 6e 46 61 69 6c 73 3b 20 20  .  int nFails;  
353a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
353b0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
353c0 63 68 20 74 61 6b 69 6e 67 20 66 61 69 6c 75 72  ch taking failur
353d0 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6f 6c  es */.  void *ol
353e0 64 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  dLockingContext;
353f0 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c       /* Original
35400 20 6c 6f 63 6b 69 6e 67 63 6f 6e 74 65 78 74 20   lockingcontext 
35410 74 6f 20 72 65 73 74 6f 72 65 20 6f 6e 20 63 6c  to restore on cl
35420 6f 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ose */.  sqlite3
35430 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73  _io_methods cons
35440 74 20 2a 70 4f 6c 64 4d 65 74 68 6f 64 3b 20 20  t *pOldMethod;  
35450 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 49     /* Original I
35460 2f 4f 20 6d 65 74 68 6f 64 73 20 66 6f 72 20 63  /O methods for c
35470 6c 6f 73 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a  lose */.};../* .
35480 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63  ** The proxy loc
35490 6b 20 66 69 6c 65 20 70 61 74 68 20 66 6f 72 20  k file path for 
354a0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20  the database at 
354b0 64 62 50 61 74 68 20 69 73 20 77 72 69 74 74 65  dbPath is writte
354c0 6e 20 69 6e 74 6f 20 6c 50 61 74 68 2c 20 0a 2a  n into lPath, .*
354d0 2a 20 77 68 69 63 68 20 6d 75 73 74 20 70 6f 69  * which must poi
354e0 6e 74 20 74 6f 20 76 61 6c 69 64 2c 20 77 72 69  nt to valid, wri
354f0 74 61 62 6c 65 20 6d 65 6d 6f 72 79 20 6c 61 72  table memory lar
35500 67 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 61 20  ge enough for a 
35510 6d 61 78 4c 65 6e 20 6c 65 6e 67 74 68 0a 2a 2a  maxLen length.**
35520 20 66 69 6c 65 20 70 61 74 68 2e 20 0a 2a 2f 0a   file path. .*/.
35530 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
35540 47 65 74 4c 6f 63 6b 50 61 74 68 28 63 6f 6e 73  GetLockPath(cons
35550 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 2c 20  t char *dbPath, 
35560 63 68 61 72 20 2a 6c 50 61 74 68 2c 20 73 69 7a  char *lPath, siz
35570 65 5f 74 20 6d 61 78 4c 65 6e 29 7b 0a 20 20 69  e_t maxLen){.  i
35580 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 64 62  nt len;.  int db
35590 4c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23  Len;.  int i;..#
355a0 69 66 64 65 66 20 4c 4f 43 4b 50 52 4f 58 59 44  ifdef LOCKPROXYD
355b0 49 52 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63  IR.  len = strlc
355c0 70 79 28 6c 50 61 74 68 2c 20 4c 4f 43 4b 50 52  py(lPath, LOCKPR
355d0 4f 58 59 44 49 52 2c 20 6d 61 78 4c 65 6e 29 3b  OXYDIR, maxLen);
355e0 0a 23 65 6c 73 65 0a 23 20 69 66 64 65 66 20 5f  .#else.# ifdef _
355f0 43 53 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54  CS_DARWIN_USER_T
35600 45 4d 50 5f 44 49 52 0a 20 20 7b 0a 20 20 20 20  EMP_DIR.  {.    
35610 69 66 28 20 21 63 6f 6e 66 73 74 72 28 5f 43 53  if( !confstr(_CS
35620 5f 44 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d  _DARWIN_USER_TEM
35630 50 5f 44 49 52 2c 20 6c 50 61 74 68 2c 20 6d 61  P_DIR, lPath, ma
35640 78 4c 65 6e 29 20 29 7b 0a 20 20 20 20 20 20 4f  xLen) ){.      O
35650 53 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b  STRACE(("GETLOCK
35660 50 41 54 48 20 20 66 61 69 6c 65 64 20 25 73 20  PATH  failed %s 
35670 65 72 72 6e 6f 3d 25 64 20 70 69 64 3d 25 64 5c  errno=%d pid=%d\
35680 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
35690 20 20 20 6c 50 61 74 68 2c 20 65 72 72 6e 6f 2c     lPath, errno,
356a0 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
356b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
356c0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
356d0 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20      }.    len = 
356e0 73 74 72 6c 63 61 74 28 6c 50 61 74 68 2c 20 22  strlcat(lPath, "
356f0 73 71 6c 69 74 65 70 6c 6f 63 6b 73 22 2c 20 6d  sqliteplocks", m
35700 61 78 4c 65 6e 29 3b 20 20 20 20 0a 20 20 7d 0a  axLen);    .  }.
35710 23 20 65 6c 73 65 0a 20 20 6c 65 6e 20 3d 20 73  # else.  len = s
35720 74 72 6c 63 70 79 28 6c 50 61 74 68 2c 20 22 2f  trlcpy(lPath, "/
35730 74 6d 70 2f 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a  tmp/", maxLen);.
35740 23 20 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a  # endif.#endif..
35750 20 20 69 66 28 20 6c 50 61 74 68 5b 6c 65 6e 2d    if( lPath[len-
35760 31 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20 6c  1]!='/' ){.    l
35770 65 6e 20 3d 20 73 74 72 6c 63 61 74 28 6c 50 61  en = strlcat(lPa
35780 74 68 2c 20 22 2f 22 2c 20 6d 61 78 4c 65 6e 29  th, "/", maxLen)
35790 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 74 72  ;.  }.  .  /* tr
357a0 61 6e 73 66 6f 72 6d 20 74 68 65 20 64 62 20 70  ansform the db p
357b0 61 74 68 20 74 6f 20 61 20 75 6e 69 71 75 65 20  ath to a unique 
357c0 63 61 63 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  cache name */.  
357d0 64 62 4c 65 6e 20 3d 20 28 69 6e 74 29 73 74 72  dbLen = (int)str
357e0 6c 65 6e 28 64 62 50 61 74 68 29 3b 0a 20 20 66  len(dbPath);.  f
357f0 6f 72 28 20 69 3d 30 3b 20 69 3c 64 62 4c 65 6e  or( i=0; i<dbLen
35800 20 26 26 20 28 69 2b 6c 65 6e 2b 37 29 3c 28 69   && (i+len+7)<(i
35810 6e 74 29 6d 61 78 4c 65 6e 3b 20 69 2b 2b 29 7b  nt)maxLen; i++){
35820 0a 20 20 20 20 63 68 61 72 20 63 20 3d 20 64 62  .    char c = db
35830 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 6c 50 61  Path[i];.    lPa
35840 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28 63 3d 3d  th[i+len] = (c==
35850 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20 20 7d 0a  '/')?'_':c;.  }.
35860 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 3d 27    lPath[i+len]='
35870 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61 74 28 6c  \0';.  strlcat(l
35880 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a 22 2c 20  Path, ":auto:", 
35890 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53 54 52 41  maxLen);.  OSTRA
358a0 43 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48  CE(("GETLOCKPATH
358b0 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74    proxy lock pat
358c0 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20  h=%s pid=%d\n", 
358d0 6c 50 61 74 68 2c 20 6f 73 47 65 74 70 69 64 28  lPath, osGetpid(
358e0 30 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  0)));.  return S
358f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
35900 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
35910 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
35920 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
35930 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
35940 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
35950 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
35960 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
35970 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
35980 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
35990 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
359a0 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
359b0 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
359c0 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
359d0 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
359e0 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
359f0 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
35a00 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
35a10 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
35a20 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
35a30 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
35a40 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
35a50 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28  ; i++ ){.    if(
35a60 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20   lockPath[i] == 
35a70 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72  '/' && (i - star
35a80 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20  t > 0) ){.      
35a90 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66  /* only mkdir if
35aa0 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22   leaf dir != "."
35ab0 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20   or "/" or ".." 
35ac0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73  */.      if( i-s
35ad0 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61  tart>2 || (i-sta
35ae0 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61  rt==1 && buf[sta
35af0 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
35b00 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29  f[start] != '/')
35b10 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
35b20 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66  -start==2 && buf
35b30 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
35b40 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21  & buf[start+1] !
35b50 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  = '.') ){.      
35b60 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20    buf[i]='\0';. 
35b70 20 20 20 20 20 20 20 69 66 28 20 6f 73 4d 6b 64         if( osMkd
35b80 69 72 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44  ir(buf, SQLITE_D
35b90 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f  EFAULT_PROXYDIR_
35ba0 50 45 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a  PERMISSIONS) ){.
35bb0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 65 72            int er
35bc0 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  r=errno;.       
35bd0 20 20 20 69 66 28 20 65 72 72 21 3d 45 45 58 49     if( err!=EEXI
35be0 53 54 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ST ) {.         
35bf0 20 20 20 4f 53 54 52 41 43 45 28 28 22 43 52 45     OSTRACE(("CRE
35c00 41 54 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49  ATELOCKPATH  FAI
35c10 4c 45 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c  LED creating %s,
35c20 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
35c30 20 20 20 20 20 20 20 20 22 27 25 73 27 20 70 72          "'%s' pr
35c40 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73  oxy lock path=%s
35c50 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20   pid=%d\n",.    
35c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c70 20 62 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65   buf, strerror(e
35c80 72 72 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 6f  rr), lockPath, o
35c90 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
35ca0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
35cb0 20 65 72 72 3b 0a 20 20 20 20 20 20 20 20 20 20   err;.          
35cc0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
35cd0 20 20 7d 0a 20 20 20 20 20 20 73 74 61 72 74 3d    }.      start=
35ce0 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  i+1;.    }.    b
35cf0 75 66 5b 69 5d 20 3d 20 6c 6f 63 6b 50 61 74 68  uf[i] = lockPath
35d00 5b 69 5d 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  [i];.  }.  OSTRA
35d10 43 45 28 28 22 43 52 45 41 54 45 4c 4f 43 4b 50  CE(("CREATELOCKP
35d20 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
35d30 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
35d40 22 2c 6c 6f 63 6b 50 61 74 68 2c 6f 73 47 65 74  ",lockPath,osGet
35d50 70 69 64 28 30 29 29 29 3b 0a 20 20 72 65 74 75  pid(0)));.  retu
35d60 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
35d70 72 65 61 74 65 20 61 20 6e 65 77 20 56 46 53 20  reate a new VFS 
35d80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
35d90 28 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72  (stored in memor
35da0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  y obtained from.
35db0 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ** sqlite3_mallo
35dc0 63 29 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20  c) and open the 
35dd0 66 69 6c 65 20 6e 61 6d 65 64 20 22 70 61 74 68  file named "path
35de0 22 20 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65  " in the file de
35df0 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20  scriptor..**.** 
35e00 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
35e10 73 70 6f 6e 73 69 62 6c 65 20 6e 6f 74 20 6f 6e  sponsible not on
35e20 6c 79 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 74  ly for closing t
35e30 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
35e40 6f 72 0a 2a 2a 20 62 75 74 20 61 6c 73 6f 20 66  or.** but also f
35e50 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 6d  or freeing the m
35e60 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
35e70 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 64   with the file d
35e80 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2f 0a 73 74  escriptor..*/.st
35e90 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 72  atic int proxyCr
35ea0 65 61 74 65 55 6e 69 78 46 69 6c 65 28 0a 20 20  eateUnixFile(.  
35eb0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61    const char *pa
35ec0 74 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 70 61  th,        /* pa
35ed0 74 68 20 66 6f 72 20 74 68 65 20 6e 65 77 20 75  th for the new u
35ee0 6e 69 78 46 69 6c 65 20 2a 2f 0a 20 20 20 20 75  nixFile */.    u
35ef0 6e 69 78 46 69 6c 65 20 2a 2a 70 70 46 69 6c 65  nixFile **ppFile
35f00 2c 20 20 20 20 20 20 20 2f 2a 20 75 6e 69 78 46  ,       /* unixF
35f10 69 6c 65 20 63 72 65 61 74 65 64 20 61 6e 64 20  ile created and 
35f20 72 65 74 75 72 6e 65 64 20 62 79 20 72 65 66 20  returned by ref 
35f30 2a 2f 0a 20 20 20 20 69 6e 74 20 69 73 6c 6f 63  */.    int isloc
35f40 6b 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20  kfile           
35f50 2f 2a 20 69 66 20 6e 6f 6e 20 7a 65 72 6f 20 6d  /* if non zero m
35f60 69 73 73 69 6e 67 20 64 69 72 73 20 77 69 6c 6c  issing dirs will
35f70 20 62 65 20 63 72 65 61 74 65 64 20 2a 2f 0a 29   be created */.)
35f80 20 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31   {.  int fd = -1
35f90 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
35fa0 65 77 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ew;.  int rc = S
35fb0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
35fc0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44  openFlags = O_RD
35fd0 57 52 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20  WR | O_CREAT;.  
35fe0 73 71 6c 69 74 65 33 5f 76 66 73 20 64 75 6d 6d  sqlite3_vfs dumm
35ff0 79 56 66 73 3b 0a 20 20 69 6e 74 20 74 65 72 72  yVfs;.  int terr
36000 6e 6f 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e  no = 0;.  UnixUn
36010 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20  usedFd *pUnused 
36020 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e  = NULL;..  /* 1.
36030 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6f 70   first try to op
36040 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 66 69  en/create the fi
36050 6c 65 0a 20 20 2a 2a 20 32 2e 20 69 66 20 74 68  le.  ** 2. if th
36060 61 74 20 66 61 69 6c 73 2c 20 61 6e 64 20 74 68  at fails, and th
36070 69 73 20 69 73 20 61 20 6c 6f 63 6b 20 66 69 6c  is is a lock fil
36080 65 20 28 6e 6f 74 2d 63 6f 6e 63 68 29 2c 20 74  e (not-conch), t
36090 72 79 20 63 72 65 61 74 69 6e 67 0a 20 20 2a 2a  ry creating.  **
360a0 20 74 68 65 20 70 61 72 65 6e 74 20 64 69 72 65   the parent dire
360b0 63 74 6f 72 69 65 73 20 61 6e 64 20 74 68 65 6e  ctories and then
360c0 20 74 72 79 20 61 67 61 69 6e 2e 0a 20 20 2a 2a   try again..  **
360d0 20 33 2e 20 69 66 20 74 68 61 74 20 66 61 69 6c   3. if that fail
360e0 73 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 74  s, try to open t
360f0 68 65 20 66 69 6c 65 20 72 65 61 64 2d 6f 6e 6c  he file read-onl
36100 79 0a 20 20 2a 2a 20 6f 74 68 65 72 77 69 73 65  y.  ** otherwise
36110 20 72 65 74 75 72 6e 20 42 55 53 59 20 28 69 66   return BUSY (if
36120 20 6c 6f 63 6b 20 66 69 6c 65 29 20 6f 72 20 43   lock file) or C
36130 41 4e 54 4f 50 45 4e 20 66 6f 72 20 74 68 65 20  ANTOPEN for the 
36140 63 6f 6e 63 68 20 66 69 6c 65 0a 20 20 2a 2f 0a  conch file.  */.
36150 20 20 70 55 6e 75 73 65 64 20 3d 20 66 69 6e 64    pUnused = find
36160 52 65 75 73 61 62 6c 65 46 64 28 70 61 74 68 2c  ReusableFd(path,
36170 20 6f 70 65 6e 46 6c 61 67 73 29 3b 0a 20 20 69   openFlags);.  i
36180 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
36190 20 20 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e    fd = pUnused->
361a0 66 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  fd;.  }else{.   
361b0 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
361c0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 73 69 7a 65  e3_malloc64(size
361d0 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
361e0 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
361f0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
36200 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
36210 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64    }.  }.  if( fd
36220 3c 30 20 29 7b 0a 20 20 20 20 66 64 20 3d 20 72  <0 ){.    fd = r
36230 6f 62 75 73 74 5f 6f 70 65 6e 28 70 61 74 68 2c  obust_open(path,
36240 20 6f 70 65 6e 46 6c 61 67 73 2c 20 30 29 3b 0a   openFlags, 0);.
36250 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72 72      terrno = err
36260 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  no;.    if( fd<0
36270 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45 4e   && errno==ENOEN
36280 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65 20  T && islockfile 
36290 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72 6f  ){.      if( pro
362a0 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74 68  xyCreateLockPath
362b0 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54 45  (path) == SQLITE
362c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
362d0 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
362e0 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  path, openFlags,
362f0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
36300 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 66 64 3c   }.  }.  if( fd<
36310 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 46 6c 61  0 ){.    openFla
36320 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
36330 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f     fd = robust_o
36340 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c  pen(path, openFl
36350 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 74 65 72  ags, 0);.    ter
36360 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
36370 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20  .  if( fd<0 ){. 
36380 20 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c     if( islockfil
36390 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
363a0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
363b0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20     }.    switch 
363c0 28 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20  (terrno) {.     
363d0 20 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20   case EACCES:.  
363e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
363f0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
36400 63 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20  case EIO: .     
36410 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36420 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20  _IOERR_LOCK; /* 
36430 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
36440 73 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20  s the conch */. 
36450 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20       default:.  
36460 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
36470 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
36480 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  T;.    }.  }.  .
36490 20 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69    pNew = (unixFi
364a0 6c 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  le *)sqlite3_mal
364b0 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 2a 70 4e  loc64(sizeof(*pN
364c0 65 77 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ew));.  if( pNew
364d0 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63  ==NULL ){.    rc
364e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
364f0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72  .    goto end_cr
36500 65 61 74 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a  eate_proxy;.  }.
36510 20 20 6d 65 6d 73 65 74 28 70 4e 65 77 2c 20 30    memset(pNew, 0
36520 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
36530 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65  e));.  pNew->ope
36540 6e 46 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61  nFlags = openFla
36550 67 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75  gs;.  memset(&du
36560 6d 6d 79 56 66 73 2c 20 30 2c 20 73 69 7a 65 6f  mmyVfs, 0, sizeo
36570 66 28 64 75 6d 6d 79 56 66 73 29 29 3b 0a 20 20  f(dummyVfs));.  
36580 64 75 6d 6d 79 56 66 73 2e 70 41 70 70 44 61 74  dummyVfs.pAppDat
36590 61 20 3d 20 28 76 6f 69 64 2a 29 26 61 75 74 6f  a = (void*)&auto
365a0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b 0a 20 20  lockIoFinder;.  
365b0 64 75 6d 6d 79 56 66 73 2e 7a 4e 61 6d 65 20 3d  dummyVfs.zName =
365c0 20 22 64 75 6d 6d 79 22 3b 0a 20 20 70 55 6e 75   "dummy";.  pUnu
365d0 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a 20 20  sed->fd = fd;.  
365e0 70 55 6e 75 73 65 64 2d 3e 66 6c 61 67 73 20 3d  pUnused->flags =
365f0 20 6f 70 65 6e 46 6c 61 67 73 3b 0a 20 20 70 4e   openFlags;.  pN
36600 65 77 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 55  ew->pUnused = pU
36610 6e 75 73 65 64 3b 0a 20 20 0a 20 20 72 63 20 3d  nused;.  .  rc =
36620 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
36630 26 64 75 6d 6d 79 56 66 73 2c 20 66 64 2c 20 28  &dummyVfs, fd, (
36640 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e  sqlite3_file*)pN
36650 65 77 2c 20 70 61 74 68 2c 20 30 29 3b 0a 20 20  ew, path, 0);.  
36660 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36670 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c 65  K ){.    *ppFile
36680 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65 74   = pNew;.    ret
36690 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
366a0 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70 72   }.end_create_pr
366b0 6f 78 79 3a 20 20 20 20 0a 20 20 72 6f 62 75 73  oxy:    .  robus
366c0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 66 64  t_close(pNew, fd
366d0 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 73  , __LINE__);.  s
366e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
366f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
36700 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 72 65  e(pUnused);.  re
36710 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
36720 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
36730 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69  * simulate multi
36740 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65  ple hosts by cre
36750 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73  ating unique hos
36760 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a  tid file paths *
36770 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f  /.int sqlite3_ho
36780 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a 23 65  stid_num = 0;.#e
36790 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 50 52  ndif..#define PR
367a0 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20 20 20  OXY_HOSTIDLEN   
367b0 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20 66 69   16  /* conch fi
367c0 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e 67 74  le host id lengt
367d0 68 20 2a 2f 0a 0a 23 69 66 64 65 66 20 48 41 56  h */..#ifdef HAV
367e0 45 5f 47 45 54 48 4f 53 54 55 55 49 44 0a 2f 2a  E_GETHOSTUUID./*
367f0 20 4e 6f 74 20 61 6c 77 61 79 73 20 64 65 66 69   Not always defi
36800 6e 65 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  ned in the heade
36810 72 73 20 61 73 20 69 74 20 6f 75 67 68 74 20 74  rs as it ought t
36820 6f 20 62 65 20 2a 2f 0a 65 78 74 65 72 6e 20 69  o be */.extern i
36830 6e 74 20 67 65 74 68 6f 73 74 75 75 69 64 28 75  nt gethostuuid(u
36840 75 69 64 5f 74 20 69 64 2c 20 63 6f 6e 73 74 20  uid_t id, const 
36850 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20  struct timespec 
36860 2a 77 61 69 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  *wait);.#endif..
36870 2f 2a 20 67 65 74 20 74 68 65 20 68 6f 73 74 20  /* get the host 
36880 49 44 20 76 69 61 20 67 65 74 68 6f 73 74 75 75  ID via gethostuu
36890 69 64 28 29 2c 20 70 48 6f 73 74 49 44 20 6d 75  id(), pHostID mu
368a0 73 74 20 70 6f 69 6e 74 20 74 6f 20 50 52 4f 58  st point to PROX
368b0 59 5f 48 4f 53 54 49 44 4c 45 4e 20 0a 2a 2a 20  Y_HOSTIDLEN .** 
368c0 62 79 74 65 73 20 6f 66 20 77 72 69 74 61 62 6c  bytes of writabl
368d0 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
368e0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
368f0 48 6f 73 74 49 44 28 75 6e 73 69 67 6e 65 64 20  HostID(unsigned 
36900 63 68 61 72 20 2a 70 48 6f 73 74 49 44 2c 20 69  char *pHostID, i
36910 6e 74 20 2a 70 45 72 72 6f 72 29 7b 0a 20 20 61  nt *pError){.  a
36920 73 73 65 72 74 28 50 52 4f 58 59 5f 48 4f 53 54  ssert(PROXY_HOST
36930 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65 6f 66 28  IDLEN == sizeof(
36940 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d 65 6d 73  uuid_t));.  mems
36950 65 74 28 70 48 6f 73 74 49 44 2c 20 30 2c 20 50  et(pHostID, 0, P
36960 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29 3b  ROXY_HOSTIDLEN);
36970 0a 23 69 66 64 65 66 20 48 41 56 45 5f 47 45 54  .#ifdef HAVE_GET
36980 48 4f 53 54 55 55 49 44 0a 20 20 7b 0a 20 20 20  HOSTUUID.  {.   
36990 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65 63   struct timespec
369a0 20 74 69 6d 65 6f 75 74 20 3d 20 7b 31 2c 20 30   timeout = {1, 0
369b0 7d 3b 20 2f 2a 20 31 20 73 65 63 20 74 69 6d 65  }; /* 1 sec time
369c0 6f 75 74 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  out */.    if( g
369d0 65 74 68 6f 73 74 75 75 69 64 28 70 48 6f 73 74  ethostuuid(pHost
369e0 49 44 2c 20 26 74 69 6d 65 6f 75 74 29 20 29 7b  ID, &timeout) ){
369f0 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d  .      int err =
36a00 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66   errno;.      if
36a10 28 20 70 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ( pError ){.    
36a20 20 20 20 20 2a 70 45 72 72 6f 72 20 3d 20 65 72      *pError = er
36a30 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
36a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
36a50 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  OERR;.    }.  }.
36a60 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50  #else.  UNUSED_P
36a70 41 52 41 4d 45 54 45 52 28 70 45 72 72 6f 72 29  ARAMETER(pError)
36a80 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
36a90 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a  SQLITE_TEST.  /*
36aa0 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74 69 70   simulate multip
36ab0 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72 65 61  le hosts by crea
36ac0 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f 73 74  ting unique host
36ad0 69 64 20 66 69 6c 65 20 70 61 74 68 73 20 2a 2f  id file paths */
36ae0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 68  .  if( sqlite3_h
36af0 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30 29 7b  ostid_num != 0){
36b00 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30 5d 20  .    pHostID[0] 
36b10 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74 49 44  = (char)(pHostID
36b20 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73 71 6c  [0] + (char)(sql
36b30 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 20  ite3_hostid_num 
36b40 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a 23 65  & 0xFF));.  }.#e
36b50 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72 6e  ndif.  .  return
36b60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
36b70 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69 6c 65  * The conch file
36b80 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 68 65   contains the he
36b90 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20 61 6e  ader, host id an
36ba0 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61 74 68  d lock file path
36bb0 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 52 4f  . */.#define PRO
36bc0 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
36bd0 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20 68 65  2   /* 1-byte he
36be0 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20 68 6f  ader, 16-byte ho
36bf0 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f 0a 23  st id, path */.#
36c00 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48 45 41  define PROXY_HEA
36c10 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20 2f 2a  DERLEN    1   /*
36c20 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65 61 64   conch file head
36c30 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23 64 65  er length */.#de
36c40 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54 48 49  fine PROXY_PATHI
36c50 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59 5f 48  NDEX    (PROXY_H
36c60 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
36c70 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66 69 6e  OSTIDLEN).#defin
36c80 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  e PROXY_MAXCONCH
36c90 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45 41 44  LEN  (PROXY_HEAD
36ca0 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f 53 54  ERLEN+PROXY_HOST
36cb0 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c 45 4e  IDLEN+MAXPATHLEN
36cc0 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65 73 20  )../* .** Takes 
36cd0 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20 66 69  an open conch fi
36ce0 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65 20 63  le, copies the c
36cf0 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e 65 77  ontents to a new
36d00 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e 20 6d   path and then m
36d10 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61 63 6b  oves .** it back
36d20 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63 72 65  .  The newly cre
36d30 61 74 65 64 20 66 69 6c 65 27 73 20 66 69 6c 65  ated file's file
36d40 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
36d50 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65 0a 2a  ssigned to the.*
36d60 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73 74 72  * conch file str
36d70 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e 61 6c  ucture and final
36d80 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ly the original 
36d90 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73 63 72  conch file descr
36da0 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63 6c 6f  iptor is .** clo
36db0 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20 7a 65  sed.  Returns ze
36dc0 72 6f 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  ro if successful
36dd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
36de0 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c  proxyBreakConchL
36df0 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
36e00 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f  ile, uuid_t myHo
36e10 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79 4c 6f  stID){.  proxyLo
36e20 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
36e30 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69  tx = (proxyLocki
36e40 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c  ngContext *)pFil
36e50 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  e->lockingContex
36e60 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  t; .  unixFile *
36e70 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78  conchFile = pCtx
36e80 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 63  ->conchFile;.  c
36e90 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50 41 54  har tPath[MAXPAT
36ea0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 62 75  HLEN];.  char bu
36eb0 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  f[PROXY_MAXCONCH
36ec0 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a 63 50  LEN];.  char *cP
36ed0 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63  ath = pCtx->conc
36ee0 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73 69 7a  hFilePath;.  siz
36ef0 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20 30 3b  e_t readLen = 0;
36f00 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68 4c 65  .  size_t pathLe
36f10 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 65 72  n = 0;.  char er
36f20 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b 0a 20  rmsg[64] = "";. 
36f30 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20   int fd = -1;.  
36f40 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 20 20 55  int rc = -1;.  U
36f50 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
36f60 6d 79 48 6f 73 74 49 44 29 3b 0a 0a 20 20 2f 2a  myHostID);..  /*
36f70 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   create a new pa
36f80 74 68 20 62 79 20 72 65 70 6c 61 63 65 20 74 68  th by replace th
36f90 65 20 74 72 61 69 6c 69 6e 67 20 27 2d 63 6f 6e  e trailing '-con
36fa0 63 68 27 20 77 69 74 68 20 27 2d 62 72 65 61 6b  ch' with '-break
36fb0 27 20 2a 2f 0a 20 20 70 61 74 68 4c 65 6e 20 3d  ' */.  pathLen =
36fc0 20 73 74 72 6c 63 70 79 28 74 50 61 74 68 2c 20   strlcpy(tPath, 
36fd0 63 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  cPath, MAXPATHLE
36fe0 4e 29 3b 0a 20 20 69 66 28 20 70 61 74 68 4c 65  N);.  if( pathLe
36ff0 6e 3e 4d 41 58 50 41 54 48 4c 45 4e 20 7c 7c 20  n>MAXPATHLEN || 
37000 70 61 74 68 4c 65 6e 3c 36 20 7c 7c 20 0a 20 20  pathLen<6 || .  
37010 20 20 20 28 73 74 72 6c 63 70 79 28 26 74 50 61     (strlcpy(&tPa
37020 74 68 5b 70 61 74 68 4c 65 6e 2d 35 5d 2c 20 22  th[pathLen-5], "
37030 62 72 65 61 6b 22 2c 20 36 29 20 21 3d 20 35 29  break", 6) != 5)
37040 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
37050 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
37060 65 72 72 6d 73 67 29 2c 65 72 72 6d 73 67 2c 22  errmsg),errmsg,"
37070 70 61 74 68 20 65 72 72 6f 72 20 28 6c 65 6e 20  path error (len 
37080 25 64 29 22 2c 28 69 6e 74 29 70 61 74 68 4c 65  %d)",(int)pathLe
37090 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
370a0 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
370b0 20 20 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f    /* read the co
370c0 6e 63 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  nch content */. 
370d0 20 72 65 61 64 4c 65 6e 20 3d 20 6f 73 50 72 65   readLen = osPre
370e0 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ad(conchFile->h,
370f0 20 62 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43   buf, PROXY_MAXC
37100 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20 20 69  ONCHLEN, 0);.  i
37110 66 28 20 72 65 61 64 4c 65 6e 3c 50 52 4f 58 59  f( readLen<PROXY
37120 5f 50 41 54 48 49 4e 44 45 58 20 29 7b 0a 20 20  _PATHINDEX ){.  
37130 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
37140 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d 73 67  tf(sizeof(errmsg
37150 29 2c 65 72 72 6d 73 67 2c 22 72 65 61 64 20 65  ),errmsg,"read e
37160 72 72 6f 72 20 28 6c 65 6e 20 25 64 29 22 2c 28  rror (len %d)",(
37170 69 6e 74 29 72 65 61 64 4c 65 6e 29 3b 0a 20 20  int)readLen);.  
37180 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b    goto end_break
37190 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 2f 2a 20 77  lock;.  }.  /* w
371a0 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20 74  rite it out to t
371b0 68 65 20 74 65 6d 70 6f 72 61 72 79 20 62 72 65  he temporary bre
371c0 61 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 66 64 20  ak file */.  fd 
371d0 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 74 50  = robust_open(tP
371e0 61 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43  ath, (O_RDWR|O_C
371f0 52 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 30 29  REAT|O_EXCL), 0)
37200 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
37210 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
37220 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72 72 6d  intf(sizeof(errm
37230 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22 63 72  sg), errmsg, "cr
37240 65 61 74 65 20 66 61 69 6c 65 64 20 28 25 64 29  eate failed (%d)
37250 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67  ", errno);.    g
37260 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63  oto end_breakloc
37270 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 50  k;.  }.  if( osP
37280 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c 20 72  write(fd, buf, r
37290 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20 28 73  eadLen, 0) != (s
372a0 73 69 7a 65 5f 74 29 72 65 61 64 4c 65 6e 20 29  size_t)readLen )
372b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
372c0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 65 72  printf(sizeof(er
372d0 72 6d 73 67 29 2c 20 65 72 72 6d 73 67 2c 20 22  rmsg), errmsg, "
372e0 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64  write failed (%d
372f0 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
37300 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
37310 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  ck;.  }.  if( re
37320 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74  name(tPath, cPat
37330 68 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  h) ){.    sqlite
37340 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
37350 66 28 65 72 72 6d 73 67 29 2c 20 65 72 72 6d 73  f(errmsg), errms
37360 67 2c 20 22 72 65 6e 61 6d 65 20 66 61 69 6c 65  g, "rename faile
37370 64 20 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b  d (%d)", errno);
37380 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72  .    goto end_br
37390 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72  eaklock;.  }.  r
373a0 63 20 3d 20 30 3b 0a 20 20 66 70 72 69 6e 74 66  c = 0;.  fprintf
373b0 28 73 74 64 65 72 72 2c 20 22 62 72 6f 6b 65 20  (stderr, "broke 
373c0 73 74 61 6c 65 20 6c 6f 63 6b 20 6f 6e 20 25 73  stale lock on %s
373d0 5c 6e 22 2c 20 63 50 61 74 68 29 3b 0a 20 20 72  \n", cPath);.  r
373e0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c  obust_close(pFil
373f0 65 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  e, conchFile->h,
37400 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 63 6f   __LINE__);.  co
37410 6e 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b  nchFile->h = fd;
37420 0a 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70  .  conchFile->op
37430 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52  enFlags = O_RDWR
37440 20 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64   | O_CREAT;..end
37450 5f 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66  _breaklock:.  if
37460 28 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20  ( rc ){.    if( 
37470 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f  fd>=0 ){.      o
37480 73 55 6e 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a  sUnlink(tPath);.
37490 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f        robust_clo
374a0 73 65 28 70 46 69 6c 65 2c 20 66 64 2c 20 5f 5f  se(pFile, fd, __
374b0 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 7d 0a 20  LINE__);.    }. 
374c0 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
374d0 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 62 72  r, "failed to br
374e0 65 61 6b 20 73 74 61 6c 65 20 6c 6f 63 6b 20 6f  eak stale lock o
374f0 6e 20 25 73 2c 20 25 73 5c 6e 22 2c 20 63 50 61  n %s, %s\n", cPa
37500 74 68 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 7d  th, errmsg);.  }
37510 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37520 0a 2f 2a 20 54 61 6b 65 20 74 68 65 20 72 65 71  ./* Take the req
37530 75 65 73 74 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  uested lock on t
37540 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 61 6e  he conch file an
37550 64 20 62 72 65 61 6b 20 61 20 73 74 61 6c 65 20  d break a stale 
37560 6c 6f 63 6b 20 69 66 20 74 68 65 20 0a 2a 2a 20  lock if the .** 
37570 68 6f 73 74 20 69 64 20 6d 61 74 63 68 65 73 2e  host id matches.
37580 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
37590 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 75 6e  roxyConchLock(un
375a0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 75  ixFile *pFile, u
375b0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 2c 20  uid_t myHostID, 
375c0 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20  int lockType){. 
375d0 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e   proxyLockingCon
375e0 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72  text *pCtx = (pr
375f0 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  oxyLockingContex
37600 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  t *)pFile->locki
37610 6e 67 43 6f 6e 74 65 78 74 3b 20 0a 20 20 75 6e  ngContext; .  un
37620 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69 6c  ixFile *conchFil
37630 65 20 3d 20 70 43 74 78 2d 3e 63 6f 6e 63 68 46  e = pCtx->conchF
37640 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ile;.  int rc = 
37650 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
37660 20 6e 54 72 69 65 73 20 3d 20 30 3b 0a 20 20 73   nTries = 0;.  s
37670 74 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 63  truct timespec c
37680 6f 6e 63 68 4d 6f 64 54 69 6d 65 3b 0a 20 20 0a  onchModTime;.  .
37690 20 20 6d 65 6d 73 65 74 28 26 63 6f 6e 63 68 4d    memset(&conchM
376a0 6f 64 54 69 6d 65 2c 20 30 2c 20 73 69 7a 65 6f  odTime, 0, sizeo
376b0 66 28 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 29 29  f(conchModTime))
376c0 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63 20  ;.  do {.    rc 
376d0 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65  = conchFile->pMe
376e0 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73 71 6c  thod->xLock((sql
376f0 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e 63 68  ite3_file*)conch
37700 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65 29 3b  File, lockType);
37710 0a 20 20 20 20 6e 54 72 69 65 73 20 2b 2b 3b 0a  .    nTries ++;.
37720 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37730 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
37740 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 20   /* If the lock 
37750 66 61 69 6c 65 64 20 28 62 75 73 79 29 3a 0a 20  failed (busy):. 
37760 20 20 20 20 20 20 2a 20 31 73 74 20 74 72 79 3a        * 1st try:
37770 20 67 65 74 20 74 68 65 20 6d 6f 64 20 74 69 6d   get the mod tim
37780 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 2c 20  e of the conch, 
37790 77 61 69 74 20 30 2e 35 73 20 61 6e 64 20 74 72  wait 0.5s and tr
377a0 79 20 61 67 61 69 6e 2e 20 0a 20 20 20 20 20 20  y again. .      
377b0 20 2a 20 32 6e 64 20 74 72 79 3a 20 66 61 69 6c   * 2nd try: fail
377c0 20 69 66 20 74 68 65 20 6d 6f 64 20 74 69 6d 65   if the mod time
377d0 20 63 68 61 6e 67 65 64 20 6f 72 20 68 6f 73 74   changed or host
377e0 20 69 64 20 69 73 20 64 69 66 66 65 72 65 6e 74   id is different
377f0 2c 20 77 61 69 74 20 0a 20 20 20 20 20 20 20 2a  , wait .       *
37800 20 20 20 20 20 20 20 20 20 20 20 31 30 20 73 65             10 se
37810 63 20 61 6e 64 20 74 72 79 20 61 67 61 69 6e 0a  c and try again.
37820 20 20 20 20 20 20 20 2a 20 33 72 64 20 74 72 79         * 3rd try
37830 3a 20 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b  : break the lock
37840 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 6f 64 20   unless the mod 
37850 74 69 6d 65 20 68 61 73 20 63 68 61 6e 67 65 64  time has changed
37860 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
37870 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75    struct stat bu
37880 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
37890 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d 3e  stat(conchFile->
378a0 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20 20  h, &buf) ){.    
378b0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
378c0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
378d0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
378e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
378f0 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
37900 20 20 0a 20 20 20 20 20 20 69 66 28 20 6e 54 72    .      if( nTr
37910 69 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ies==1 ){.      
37920 20 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d    conchModTime =
37930 20 62 75 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65   buf.st_mtimespe
37940 63 3b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65  c;.        uslee
37950 70 28 35 30 30 30 30 30 29 3b 20 2f 2a 20 77 61  p(500000); /* wa
37960 69 74 20 30 2e 35 20 73 65 63 20 61 6e 64 20 74  it 0.5 sec and t
37970 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
37980 6e 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 74  n*/.        cont
37990 69 6e 75 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a  inue;  .      }.
379a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
379b0 54 72 69 65 73 3e 31 20 29 3b 0a 20 20 20 20 20  Tries>1 );.     
379c0 20 69 66 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d   if( conchModTim
379d0 65 2e 74 76 5f 73 65 63 20 21 3d 20 62 75 66 2e  e.tv_sec != buf.
379e0 73 74 5f 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f  st_mtimespec.tv_
379f0 73 65 63 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  sec || .        
37a00 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76   conchModTime.tv
37a10 5f 6e 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  _nsec != buf.st_
37a20 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65  mtimespec.tv_nse
37a30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  c ){.        ret
37a40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
37a50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
37a60 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
37a70 3d 3d 32 20 29 7b 20 20 0a 20 20 20 20 20 20 20  ==2 ){  .       
37a80 20 63 68 61 72 20 74 42 75 66 5b 50 52 4f 58 59   char tBuf[PROXY
37a90 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20  _MAXCONCHLEN];. 
37aa0 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d         int len =
37ab0 20 6f 73 50 72 65 61 64 28 63 6f 6e 63 68 46 69   osPread(conchFi
37ac0 6c 65 2d 3e 68 2c 20 74 42 75 66 2c 20 50 52 4f  le->h, tBuf, PRO
37ad0 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 2c 20  XY_MAXCONCHLEN, 
37ae0 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
37af0 6c 65 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  len<0 ){.       
37b00 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
37b10 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
37b20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
37b30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  n SQLITE_IOERR_L
37b40 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  OCK;.        }. 
37b50 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 50         if( len>P
37b60 52 4f 58 59 5f 50 41 54 48 49 4e 44 45 58 20 26  ROXY_PATHINDEX &
37b70 26 20 74 42 75 66 5b 30 5d 3d 3d 28 63 68 61 72  & tBuf[0]==(char
37b80 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53  )PROXY_CONCHVERS
37b90 49 4f 4e 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ION){.          
37ba0 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b 20 74  /* don't break t
37bb0 68 65 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 68  he lock if the h
37bc0 6f 73 74 20 69 64 20 64 6f 65 73 6e 27 74 20 6d  ost id doesn't m
37bd0 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
37be0 20 20 69 66 28 20 30 21 3d 6d 65 6d 63 6d 70 28    if( 0!=memcmp(
37bf0 26 74 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44  &tBuf[PROXY_HEAD
37c00 45 52 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44  ERLEN], myHostID
37c10 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
37c20 4e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  N) ){.          
37c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
37c40 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
37c50 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
37c60 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 6f  .          /* do
37c70 6e 27 74 20 62 72 65 61 6b 20 74 68 65 20 6c 6f  n't break the lo
37c80 63 6b 20 6f 6e 20 73 68 6f 72 74 20 72 65 61 64  ck on short read
37c90 20 6f 72 20 61 20 76 65 72 73 69 6f 6e 20 6d 69   or a version mi
37ca0 73 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20  smatch */.      
37cb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
37cc0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
37cd0 7d 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  }.        usleep
37ce0 28 31 30 30 30 30 30 30 30 29 3b 20 2f 2a 20 77  (10000000); /* w
37cf0 61 69 74 20 31 30 20 73 65 63 20 61 6e 64 20 74  ait 10 sec and t
37d00 72 79 20 74 68 65 20 6c 6f 63 6b 20 61 67 61 69  ry the lock agai
37d10 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e  n */.        con
37d20 74 69 6e 75 65 3b 20 0a 20 20 20 20 20 20 7d 0a  tinue; .      }.
37d30 20 20 20 20 20 20 0a 20 20 20 20 20 20 61 73 73        .      ass
37d40 65 72 74 28 20 6e 54 72 69 65 73 3d 3d 33 20 29  ert( nTries==3 )
37d50 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 70  ;.      if( 0==p
37d60 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63 68 4c 6f  roxyBreakConchLo
37d70 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48 6f 73 74  ck(pFile, myHost
37d80 49 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ID) ){.        r
37d90 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
37da0 20 20 20 20 20 20 20 69 66 28 20 6c 6f 63 6b 54         if( lockT
37db0 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype==EXCLUSIVE_L
37dc0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  OCK ){.         
37dd0 20 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d   rc = conchFile-
37de0 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28  >pMethod->xLock(
37df0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63  (sqlite3_file*)c
37e00 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52 45 44  onchFile, SHARED
37e10 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
37e20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 72  }.        if( !r
37e30 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
37e40 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70  c = conchFile->p
37e50 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28 73  Method->xLock((s
37e60 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f 6e  qlite3_file*)con
37e70 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70 65  chFile, lockType
37e80 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
37e90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 77     }.    }.  } w
37ea0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
37eb0 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73 3c  _BUSY && nTries<
37ec0 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72 6e  3 );.  .  return
37ed0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 73   rc;.}../* Takes
37ee0 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74 61   the conch by ta
37ef0 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  king a shared lo
37f00 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65 20  ck and read the 
37f10 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c 20  contents conch, 
37f20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20  if .** lockPath 
37f30 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65  is non-NULL, the
37f40 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f 63   host ID and loc
37f50 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73 74  k file path must
37f60 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c 20   match.  A NULL 
37f70 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65 61  .** lockPath mea
37f80 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63 6b  ns that the lock
37f90 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63  Path in the conc
37fa0 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  h file will be u
37fb0 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20 68  sed if the .** h
37fc0 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20 6f  ost IDs match, o
37fd0 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61 74  r a new lock pat
37fe0 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72 61  h will be genera
37ff0 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ted automaticall
38000 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74 65  y .** and writte
38010 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20 66  n to the conch f
38020 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
38030 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63  nt proxyTakeConc
38040 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  h(unixFile *pFil
38050 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
38060 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
38070 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
38080 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
38090 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
380a0 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d 3e  .  .  if( pCtx->
380b0 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b 0a  conchHeld!=0 ){.
380c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
380d0 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  E_OK;.  }else{. 
380e0 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e     unixFile *con
380f0 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
38100 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75 75  onchFile;.    uu
38110 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a 20  id_t myHostID;. 
38120 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d 20     int pError = 
38130 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61 64  0;.    char read
38140 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  Buf[PROXY_MAXCON
38150 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  CHLEN];.    char
38160 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41 54   lockPath[MAXPAT
38170 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72 20  HLEN];.    char 
38180 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20  *tempLockPath = 
38190 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 63  NULL;.    int rc
381a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
381b0 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e 63    int createConc
381c0 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 68  h = 0;.    int h
381d0 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b 0a  ostIdMatch = 0;.
381e0 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e 20      int readLen 
381f0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72 79  = 0;.    int try
38200 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b  OldLockPath = 0;
38210 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e 65  .    int forceNe
38220 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a 20  wLockPath = 0;. 
38230 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45 28     .    OSTRACE(
38240 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
38250 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e 22  for %s pid=%d\n"
38260 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a  , conchFile->h,.
38270 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70 43               (pC
38280 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
38290 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h ? pCtx->lockPr
382a0 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74 6f  oxyPath : ":auto
382b0 3a 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  :"),.           
382c0 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
382d0 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79  ..    rc = proxy
382e0 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73 74  GetHostID(myHost
382f0 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20 20  ID, &pError);.  
38300 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
38310 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b  =SQLITE_IOERR ){
38320 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
38330 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 70 45 72  Errno(pFile, pEr
38340 72 6f 72 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ror);.      goto
38350 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
38360 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
38370 72 6f 78 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46  roxyConchLock(pF
38380 69 6c 65 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53  ile, myHostID, S
38390 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
383a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
383b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
383c0 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a   end_takeconch;.
383d0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61      }.    /* rea
383e0 64 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 63  d the existing c
383f0 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20  onch file */.   
38400 20 72 65 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41   readLen = seekA
38410 6e 64 52 65 61 64 28 28 75 6e 69 78 46 69 6c 65  ndRead((unixFile
38420 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20  *)conchFile, 0, 
38430 72 65 61 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d  readBuf, PROXY_M
38440 41 58 43 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20  AXCONCHLEN);.   
38450 20 69 66 28 20 72 65 61 64 4c 65 6e 3c 30 20 29   if( readLen<0 )
38460 7b 0a 20 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65  {.      /* I/O e
38470 72 72 6f 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20  rror: lastErrno 
38480 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
38490 61 64 20 2a 2f 0a 20 20 20 20 20 20 73 74 6f 72  ad */.      stor
384a0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
384b0 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6c 61 73  , conchFile->las
384c0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72  tErrno);.      r
384d0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
384e0 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 67 6f 74  _READ;.      got
384f0 6f 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b  o end_takeconch;
38500 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72  .    }else if( r
38510 65 61 64 4c 65 6e 3c 3d 28 50 52 4f 58 59 5f 48  eadLen<=(PROXY_H
38520 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48  EADERLEN+PROXY_H
38530 4f 53 54 49 44 4c 45 4e 29 20 7c 7c 20 0a 20 20  OSTIDLEN) || .  
38540 20 20 20 20 20 20 20 20 20 20 20 72 65 61 64 42             readB
38550 75 66 5b 30 5d 21 3d 28 63 68 61 72 29 50 52 4f  uf[0]!=(char)PRO
38560 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f 4e 20  XY_CONCHVERSION 
38570 29 7b 0a 20 20 20 20 20 20 2f 2a 20 61 20 73 68  ){.      /* a sh
38580 6f 72 74 20 72 65 61 64 20 6f 72 20 76 65 72 73  ort read or vers
38590 69 6f 6e 20 66 6f 72 6d 61 74 20 6d 69 73 6d 61  ion format misma
385a0 74 63 68 20 6d 65 61 6e 73 20 77 65 20 6e 65 65  tch means we nee
385b0 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  d to create a ne
385c0 77 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 63  w .      ** conc
385d0 68 20 66 69 6c 65 2e 20 0a